[Author Prev][Author Next][Thread Prev][Thread Next][Author Index][Thread Index]

[tor-commits] [torbutton] branch main updated: Bug 41353 (Update DnD filter)



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 dee999c4 Bug 41353 (Update DnD filter)
dee999c4 is described below

commit dee999c4466336928cf556291443ed05076bc382
Author: ma1 <giorgio@xxxxxxxxx>
AuthorDate: Thu Oct 27 17:18:37 2022 +0000

    Bug 41353 (Update DnD filter)
---
 components/dragDropFilter.js | 74 ++++++++++++++++++++++++++++++++++----------
 1 file changed, 57 insertions(+), 17 deletions(-)

diff --git a/components/dragDropFilter.js b/components/dragDropFilter.js
index 4b76bd10..f763595b 100644
--- a/components/dragDropFilter.js
+++ b/components/dragDropFilter.js
@@ -21,6 +21,47 @@ const kMODULE_CID = Components.ID("f605ec27-d867-44b5-ad97-2a29276642c3");
 
 const kInterfaces = [Ci.nsIObserver, Ci.nsIClassInfo];
 
+const URLISH_TYPES = Object.freeze([
+  "text/x-moz-url",
+  "text/x-moz-url-data",
+  "text/uri-list",
+  "application/x-moz-file-promise-url",
+]);
+
+/*
+  Returns true if the text resembles a URL or even just a hostname
+  in a way that may prompt the O.S. or other applications to send out a
+  validation DNS query, if not a full request (e.g. " torproject.org",
+  even with the leading whitespace).
+*/
+function isURLish(text) {
+  // Ignore leading whitespace.
+  text = text.trim();
+
+  // Without any protocol or dot in the first chunk, this is unlikely
+  // to be considered URLish (exception: localhost, but we don't care).
+  if (!/^[a-z][a-z0-9+-]*:\/\//i.test(text)) {
+    // no protocol
+    if (!/^[^.\s\/]+\.[^.\s\/]/.test(text)) {
+      // no dot
+      return false;
+    }
+    // Prepare for hostname validation via relative URL building.
+    text = `//${text}`;
+  }
+  // Validate URL or hostname.
+  try {
+    new URL(text, "https://localhost";);
+    return true;
+  } catch (e) {
+    // invalid URL, bail out
+  }
+  return false;
+}
+
+// Returns true if any chunk of text is URLish
+const hasURLish = text => text.split(/[^\p{L}_.-:\/%~@$-]+/u).some(isURLish);
+
 function DragDropFilter() {
   this.logger = Cc["@torproject.org/torbutton-logger;1"].getService(
     Ci.nsISupports
@@ -63,25 +104,24 @@ DragDropFilter.prototype = {
   },
 
   filterDataTransferURLs(aDataTransfer) {
-    var types = null;
-    var type = "";
-    var count = aDataTransfer.mozItemCount;
-    var len = 0;
-    for (var i = 0; i < count; ++i) {
-      this.logger.log(3, "Inspecting the data transfer: " + i);
-      types = aDataTransfer.mozTypesAt(i);
-      len = types.length;
-      for (var j = 0; j < len; ++j) {
-        type = types[j];
-        this.logger.log(3, "Type is: " + type);
+    for (let i = 0, count = aDataTransfer.mozItemCount; i < count; ++i) {
+      this.logger.log(3, `Inspecting the data transfer: ${i}.`);
+      const types = aDataTransfer.mozTypesAt(i);
+      for (const type of types) {
+        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"
+          URLISH_TYPES.includes(type) ||
+          ((type === "text/plain" || type === "text/html") &&
+            hasURLish(aDataTransfer.getData(type)))
         ) {
-          aDataTransfer.clearData(type);
-          this.logger.log(3, "Removing " + type);
+          this.logger.log(
+            3,
+            `Removing transfer data ${aDataTransfer.getData(type)}`
+          );
+          for (const type of types) {
+            aDataTransfer.clearData(type);
+          }
+          break;
         }
       }
     }

-- 
To stop receiving notification emails like this one, please contact
the administrator of this repository.
_______________________________________________
tor-commits mailing list
tor-commits@xxxxxxxxxxxxxxxxxxxx
https://lists.torproject.org/cgi-bin/mailman/listinfo/tor-commits