[tor-commits] [Git][tpo/applications/tor-browser][tor-browser-115.10.0esr-13.5-1] 4 commits: fixup! Bug 40701: Add security warning when downloading a file

richard (@richard) git at gitlab.torproject.org
Mon Apr 15 18:16:48 UTC 2024



richard pushed to branch tor-browser-115.10.0esr-13.5-1 at The Tor Project / Applications / Tor Browser


Commits:
49db61d8 by Henry Wilkes at 2024-04-15T18:16:31+00:00
fixup! Bug 40701: Add security warning when downloading a file

Bug 42221: Migrate downloads warning strings to Fluent.

- - - - -
93684ca3 by Henry Wilkes at 2024-04-15T18:16:31+00:00
fixup! Tor Browser strings

Bug 42221: Migrate downloads warning strings to Fluent.

- - - - -
4e772ce6 by Henry Wilkes at 2024-04-15T18:16:31+00:00
fixup! Add TorStrings module for localization

Bug 42221: Migrate downloads warning strings to Fluent.

- - - - -
e7445294 by Henry Wilkes at 2024-04-15T18:16:31+00:00
fixup! Tor Browser localization migration scripts.

Bug 42221: Migrate downloads warning strings to Fluent.

- - - - -


9 changed files:

- browser/components/downloads/content/contentAreaDownloadsView.js
- browser/components/downloads/content/contentAreaDownloadsView.xhtml
- browser/components/downloads/content/downloads.js
- browser/components/downloads/content/downloadsPanel.inc.xhtml
- browser/components/places/content/places.js
- browser/components/places/content/places.xhtml
- browser/locales/en-US/browser/tor-browser.ftl
- toolkit/torbutton/chrome/locale/en-US/torbutton.properties
- + tools/torbrowser/l10n/migrations/bug-42210-download-warning.py


Changes:

=====================================
browser/components/downloads/content/contentAreaDownloadsView.js
=====================================
@@ -62,53 +62,6 @@ var ContentAreaDownloadsView = {
     if (!PrivateBrowsingUtils.isContentWindowPrivate(window)) {
       view.place = "place:transition=7&sort=4";
     }
-
-    torWarningMessage.querySelector(
-      ".downloads-tor-warning-title"
-    ).textContent = this._getTorString("torbutton.download.warning.title");
-
-    const tailsLink = document.createElement("a");
-    tailsLink.href = "https://tails.net/";
-    tailsLink.target = "_blank";
-    tailsLink.textContent = this._getTorString(
-      "torbutton.download.warning.tails_brand_name"
-    );
-
-    const [beforeLink, afterLink] = this._getTorString(
-      "torbutton.download.warning.description"
-    ).split("%S");
-
-    torWarningMessage
-      .querySelector(".downloads-tor-warning-description")
-      .append(beforeLink, tailsLink, afterLink);
-
-    torWarningMessage.querySelector(
-      ".downloads-tor-warning-dismiss-button"
-    ).textContent = this._getTorString("torbutton.download.warning.dismiss");
-  },
-
-  /**
-   * Get a string from the properties bundle.
-   *
-   * @param {string} name - The string name.
-   *
-   * @return {string} The string.
-   */
-  _getTorString(name) {
-    if (!this._stringBundle) {
-      this._stringBundle = Services.strings.createBundle(
-        "chrome://torbutton/locale/torbutton.properties"
-      );
-    }
-    try {
-      return this._stringBundle.GetStringFromName(name);
-    } catch {}
-    if (!this._fallbackStringBundle) {
-      this._fallbackStringBundle = Services.strings.createBundle(
-        "resource://torbutton/locale/en-US/torbutton.properties"
-      );
-    }
-    return this._fallbackStringBundle.GetStringFromName(name);
   },
 };
 


=====================================
browser/components/downloads/content/contentAreaDownloadsView.xhtml
=====================================
@@ -21,6 +21,7 @@
   <linkset>
     <html:link rel="localization" href="toolkit/global/textActions.ftl"/>
     <html:link rel="localization" href="browser/downloads.ftl" />
+    <html:link rel="localization" href="browser/tor-browser.ftl" />
   </linkset>
 
   <script src="chrome://global/content/globalOverlay.js"/>
@@ -36,20 +37,34 @@
   </keyset>
 #endif
 
-  <html:message-bar id="aboutDownloadsTorWarning"
-                    class="downloads-tor-warning-message-bar"
-                    role="alert"
-                    aria-labelledby="aboutDownloadsTorWarningTitle"
-                    aria-describedby="aboutDownloadsTorWarningDescription">
+  <html:message-bar
+    id="aboutDownloadsTorWarning"
+    class="downloads-tor-warning-message-bar"
+    role="alert"
+    aria-labelledby="aboutDownloadsTorWarningTitle"
+    aria-describedby="aboutDownloadsTorWarningDescription"
+  >
     <html:div class="downloads-tor-warning-grid">
-      <html:p id="aboutDownloadsTorWarningTitle"
-              class="downloads-tor-warning-title">
+      <html:p
+        id="aboutDownloadsTorWarningTitle"
+        class="downloads-tor-warning-title"
+        data-l10n-id="downloads-tor-warning-title"
+      ></html:p>
+      <html:p
+        id="aboutDownloadsTorWarningDescription"
+        class="downloads-tor-warning-description"
+        data-l10n-id="downloads-tor-warning-description"
+      >
+        <html:a
+          href="https://tails.net/"
+          target="_blank"
+          data-l10n-name="tails-link"
+        ></html:a>
       </html:p>
-      <html:p id="aboutDownloadsTorWarningDescription"
-              class="downloads-tor-warning-description">
-      </html:p>
-      <html:button class="downloads-tor-warning-dismiss-button">
-      </html:button>
+      <html:button
+        class="downloads-tor-warning-dismiss-button"
+        data-l10n-id="downloads-tor-warning-dismiss-button"
+      ></html:button>
     </html:div>
   </html:message-bar>
 


=====================================
browser/components/downloads/content/downloads.js
=====================================
@@ -167,38 +167,29 @@ var DownloadsPanel = {
     );
 
     if (!this._torWarningInitialized) {
-      torWarningMessage.querySelector(
-        ".downloads-tor-warning-title"
-      ).textContent = this._getTorString("torbutton.download.warning.title");
-
-      const tailsLink = document.createElement("a");
-      tailsLink.href = "https://tails.net";
-      tailsLink.textContent = this._getTorString(
-        "torbutton.download.warning.tails_brand_name"
-      );
-      tailsLink.addEventListener("click", event => {
-        event.preventDefault();
-        this.hidePanel();
-        openWebLinkIn(tailsLink.href, "tab");
-      });
-
-      const [beforeLink, afterLink] = this._getTorString(
-        "torbutton.download.warning.description"
-      ).split("%S");
-
+      // Intercept clicks on the tails link.
+      // NOTE: We listen for clicks on the parent instead of the
+      // <a data-l10n-name="tails-link"> element because the latter may be
+      // swapped for a new instance by Fluent when refreshing the parent.
       torWarningMessage
         .querySelector(".downloads-tor-warning-description")
-        .append(beforeLink, tailsLink, afterLink);
+        .addEventListener("click", event => {
+          const tailsLink = event.target.closest(
+            ".downloads-tor-warning-tails-link"
+          );
+          if (!tailsLink) {
+            return;
+          }
+          event.preventDefault();
+          this.hidePanel();
+          openWebLinkIn(tailsLink.href, "tab");
+        });
 
-      let dismissButton = torWarningMessage.querySelector(
-        ".downloads-tor-warning-dismiss-button"
-      );
-      dismissButton.textContent = this._getTorString(
-        "torbutton.download.warning.dismiss"
-      );
-      dismissButton.addEventListener("click", event => {
-        Services.prefs.setBoolPref(PREF_SHOW_DOWNLOAD_WARNING, false);
-      });
+      torWarningMessage
+        .querySelector(".downloads-tor-warning-dismiss-button")
+        .addEventListener("click", event => {
+          Services.prefs.setBoolPref(PREF_SHOW_DOWNLOAD_WARNING, false);
+        });
       this._torWarningInitialized = true;
     }
 
@@ -725,30 +716,6 @@ var DownloadsPanel = {
       }
     }, 0);
   },
-
-  /**
-   * Get a string from the properties bundle.
-   *
-   * @param {string} name - The string name.
-   *
-   * @return {string} The string.
-   */
-  _getTorString(name) {
-    if (!this._stringBundle) {
-      this._stringBundle = Services.strings.createBundle(
-        "chrome://torbutton/locale/torbutton.properties"
-      );
-    }
-    try {
-      return this._stringBundle.GetStringFromName(name);
-    } catch {}
-    if (!this._fallbackStringBundle) {
-      this._fallbackStringBundle = Services.strings.createBundle(
-        "resource://torbutton/locale/en-US/torbutton.properties"
-      );
-    }
-    return this._fallbackStringBundle.GetStringFromName(name);
-  },
 };
 
 XPCOMUtils.defineConstant(this, "DownloadsPanel", DownloadsPanel);


=====================================
browser/components/downloads/content/downloadsPanel.inc.xhtml
=====================================
@@ -125,19 +125,32 @@
 
     <panelview id="downloadsPanel-mainView">
       <vbox id="downloadsPanelTorWarning">
-        <vbox role="alert"
-              aria-labelledby="downloadsPanelTorWarningTitle"
-              aria-describedby="downloadsPanelTorWarningDescription">
-          <html:p id="downloadsPanelTorWarningTitle"
-                  class="downloads-tor-warning-title">
+        <vbox
+          role="alert"
+          aria-labelledby="downloadsPanelTorWarningTitle"
+          aria-describedby="downloadsPanelTorWarningDescription"
+        >
+          <html:p
+            id="downloadsPanelTorWarningTitle"
+            class="downloads-tor-warning-title"
+            data-l10n-id="downloads-tor-warning-title"
+          ></html:p>
+          <html:p
+            id="downloadsPanelTorWarningDescription"
+            class="downloads-tor-warning-description"
+            data-l10n-id="downloads-tor-warning-description"
+          >
+            <html:a
+              href="https://tails.net/"
+              data-l10n-name="tails-link"
+              class="downloads-tor-warning-tails-link"
+            ></html:a>
           </html:p>
-          <html:p id="downloadsPanelTorWarningDescription"
-                  class="downloads-tor-warning-description">
-          </html:p>
-
           <html:div class="panel-footer">
-            <html:button class="downloads-tor-warning-dismiss-button">
-            </html:button>
+            <html:button
+              class="downloads-tor-warning-dismiss-button"
+              data-l10n-id="downloads-tor-warning-dismiss-button"
+            ></html:button>
           </html:div>
         </vbox>
         <toolbarseparator />


=====================================
browser/components/places/content/places.js
=====================================
@@ -176,32 +176,22 @@ var PlacesOrganizer = {
       }
     );
 
-    // Initialize tor warning text content.
-    torWarningMessage.querySelector(
-      ".downloads-tor-warning-title"
-    ).textContent = this._getTorString("torbutton.download.warning.title");
-
-    const tailsLink = document.createElement("a");
-    tailsLink.href = "https://tails.net/";
-    tailsLink.textContent = this._getTorString(
-      "torbutton.download.warning.tails_brand_name"
-    );
-    tailsLink.addEventListener("click", event => {
-      event.preventDefault();
-      openWebLinkIn(tailsLink.href, "tab");
-    });
-
-    const [beforeLink, afterLink] = this._getTorString(
-      "torbutton.download.warning.description"
-    ).split("%S");
-
-    torWarningMessage
+    // Intercept clicks on the tor warning tails link.
+    // NOTE: We listen for clicks on the parent instead of the
+    // <a data-l10n-name="tails-link"> element because the latter may be
+    // swapped for a new instance by Fluent when refreshing the parent.
+    document
       .querySelector(".downloads-tor-warning-description")
-      .append(beforeLink, tailsLink, afterLink);
-
-    torWarningMessage.querySelector(
-      ".downloads-tor-warning-dismiss-button"
-    ).textContent = this._getTorString("torbutton.download.warning.dismiss");
+      .addEventListener("click", event => {
+        const tailsLink = event.target.closest(
+          ".downloads-tor-warning-tails-link"
+        );
+        if (!tailsLink) {
+          return;
+        }
+        event.preventDefault();
+        openWebLinkIn(tailsLink.href, "tab");
+      });
 
     ContentArea.init();
 
@@ -274,30 +264,6 @@ var PlacesOrganizer = {
     ContentArea.focus();
   },
 
-  /**
-   * Get a string from the properties bundle.
-   *
-   * @param {string} name - The string name.
-   *
-   * @returns {string} The string.
-   */
-  _getTorString(name) {
-    if (!this._stringBundle) {
-      this._stringBundle = Services.strings.createBundle(
-        "chrome://torbutton/locale/torbutton.properties"
-      );
-    }
-    try {
-      return this._stringBundle.GetStringFromName(name);
-    } catch {}
-    if (!this._fallbackStringBundle) {
-      this._fallbackStringBundle = Services.strings.createBundle(
-        "resource://torbutton/locale/en-US/torbutton.properties"
-      );
-    }
-    return this._fallbackStringBundle.GetStringFromName(name);
-  },
-
   QueryInterface: ChromeUtils.generateQI([]),
 
   handleEvent: function PO_handleEvent(aEvent) {


=====================================
browser/components/places/content/places.xhtml
=====================================
@@ -40,6 +40,7 @@
     <html:link rel="localization" href="browser/places.ftl"/>
     <html:link rel="localization" href="browser/downloads.ftl"/>
     <html:link rel="localization" href="browser/editBookmarkOverlay.ftl"/>
+    <html:link rel="localization" href="browser/tor-browser.ftl"/>
   </linkset>
 
   <script src="chrome://browser/content/places/places.js"/>
@@ -338,19 +339,33 @@
     </tree>
     <splitter collapse="none" persist="state"></splitter>
     <vbox id="contentView">
-      <html:message-bar id="placesDownloadsTorWarning"
-                        role="alert"
-                        aria-labelledby="placesDownloadsTorWarningTitle"
-                        aria-describedby="placesDownloadsTorWarningDescription">
+      <html:message-bar
+        id="placesDownloadsTorWarning"
+        role="alert"
+        aria-labelledby="placesDownloadsTorWarningTitle"
+        aria-describedby="placesDownloadsTorWarningDescription"
+      >
         <html:div class="downloads-tor-warning-grid">
-          <html:p id="placesDownloadsTorWarningTitle"
-                  class="downloads-tor-warning-title">
+          <html:p
+            id="placesDownloadsTorWarningTitle"
+            class="downloads-tor-warning-title"
+            data-l10n-id="downloads-tor-warning-title"
+          ></html:p>
+          <html:p
+            id="placesDownloadsTorWarningDescription"
+            class="downloads-tor-warning-description"
+            data-l10n-id="downloads-tor-warning-description"
+          >
+            <html:a
+              href="https://tails.net/"
+              class="downloads-tor-warning-tails-link"
+              data-l10n-name="tails-link"
+            ></html:a>
           </html:p>
-          <html:p id="placesDownloadsTorWarningDescription"
-                  class="downloads-tor-warning-description">
-          </html:p>
-          <html:button class="downloads-tor-warning-dismiss-button">
-          </html:button>
+          <html:button
+            class="downloads-tor-warning-dismiss-button"
+            data-l10n-id="downloads-tor-warning-dismiss-button"
+          ></html:button>
         </html:div>
       </html:message-bar>
       <vbox id="placesViewsBox" flex="1">


=====================================
browser/locales/en-US/browser/tor-browser.ftl
=====================================
@@ -548,3 +548,12 @@ crypto-safety-prompt-title = Cryptocurrency address copied from an insecure webs
 crypto-safety-prompt-body = The copied text ({ $address }) appears to be a cryptocurrency address. Since the connection to { $host } is not secure, the address may have been modified and should not be trusted. You can try establishing a secure connection by reconnecting with a new circuit.
 crypto-safety-prompt-reload-button = Reload Tab with a New Circuit
 crypto-safety-prompt-dismiss-button = Dismiss Warning
+
+## Downloads warning.
+## Shown in downloads panel, about:downloads and Library window.
+
+downloads-tor-warning-title = Be careful opening downloads
+# "Tails" is the brand name for the Tails operating system and should be localized appropriately, and will be a link to its website. The name should be wrapped in '<a data-l10n-name="tails-link">' and '</a>'.
+downloads-tor-warning-description = Some files may connect to the internet when opened without using Tor. To be safe, open the files while offline or use a portable operating system like <a data-l10n-name="tails-link">Tails</a>.
+# Button to dismiss the warning forever.
+downloads-tor-warning-dismiss-button = Got it


=====================================
toolkit/torbutton/chrome/locale/en-US/torbutton.properties
=====================================
@@ -3,14 +3,6 @@
 # License, v. 2.0. If a copy of the MPL was not distributed with this
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
 
-# Download pane warning
-torbutton.download.warning.title = Be careful opening downloads
-# %S will be a link to the Tails operating system website. With the content given by torbutton.download.warning.tails_brand_name
-torbutton.download.warning.description = Some files may connect to the internet when opened without using Tor. To be safe, open the files while offline or use a portable operating system like %S.
-# Locale name for Tails operating system.
-torbutton.download.warning.tails_brand_name = Tails
-torbutton.download.warning.dismiss = Got it
-
 # .Onion Page Info prompt.
 pageInfo_OnionEncryptionWithBitsAndProtocol=Connection Encrypted (Onion Service, %1$S, %2$S bit keys, %3$S)
 pageInfo_OnionEncryption=Connection Encrypted (Onion Service)


=====================================
tools/torbrowser/l10n/migrations/bug-42210-download-warning.py
=====================================
@@ -0,0 +1,39 @@
+import fluent.syntax.ast as FTL
+from fluent.migrate.helpers import transforms_from
+from fluent.migrate.transforms import CONCAT, COPY, REPLACE
+
+
+def migrate(ctx):
+    legacy_path = "torbutton.properties"
+
+    ctx.add_transforms(
+        "tor-browser.ftl",
+        "tor-browser.ftl",
+        transforms_from(
+            """
+downloads-tor-warning-title = { COPY(path, "torbutton.download.warning.title") }
+downloads-tor-warning-dismiss-button = { COPY(path, "torbutton.download.warning.dismiss") }
+""",
+            path=legacy_path,
+        )
+        + [
+            # Replace "%S" with link to Tails website.
+            FTL.Message(
+                id=FTL.Identifier("downloads-tor-warning-description"),
+                value=REPLACE(
+                    legacy_path,
+                    "torbutton.download.warning.description",
+                    {
+                        "%1$S": CONCAT(
+                            FTL.TextElement('<a data-l10n-name="tails-link">'),
+                            COPY(
+                                legacy_path,
+                                "torbutton.download.warning.tails_brand_name",
+                            ),
+                            FTL.TextElement("</a>"),
+                        )
+                    },
+                ),
+            ),
+        ],
+    )



View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/compare/a5b9b03b01162f4b5dc5c52d7b3301238778af88...e7445294dd49959ea7c14171177cb64cada8a16c

-- 
View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/compare/a5b9b03b01162f4b5dc5c52d7b3301238778af88...e7445294dd49959ea7c14171177cb64cada8a16c
You're receiving this email because of your account on gitlab.torproject.org.


-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.torproject.org/pipermail/tor-commits/attachments/20240415/e8e2245e/attachment-0001.htm>


More information about the tor-commits mailing list