emacs-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

master e58b4b24cf: Add text for suspicious links


From: Lars Ingebrigtsen
Subject: master e58b4b24cf: Add text for suspicious links
Date: Wed, 19 Jan 2022 11:50:34 -0500 (EST)

branch: master
commit e58b4b24cfa554b93a0d02e14a9dfc38c40d0742
Author: Lars Ingebrigtsen <larsi@gnus.org>
Commit: Lars Ingebrigtsen <larsi@gnus.org>

    Add text for suspicious links
    
    * lisp/international/textsec-check.el (textsec-check): Note `link'.
    (textsec-propertize): Fix typo.
    
    * lisp/international/textsec.el (textsec-link-suspicious-p): New
    function.
    
    * lisp/net/shr.el (shr-tag-a): Check for sus links.
---
 lisp/international/textsec-check.el      |  6 +++---
 lisp/international/textsec.el            | 26 ++++++++++++++++++++++++++
 lisp/net/shr.el                          |  7 ++++++-
 test/lisp/international/textsec-tests.el | 18 ++++++++++++++++++
 4 files changed, 53 insertions(+), 4 deletions(-)

diff --git a/lisp/international/textsec-check.el 
b/lisp/international/textsec-check.el
index 464845d5b6..8f641e5a66 100644
--- a/lisp/international/textsec-check.el
+++ b/lisp/international/textsec-check.el
@@ -44,8 +44,8 @@ If nil, these checks are disabled."
 If STRING is suspicious, a string explaining the possible problem
 is returned.
 
-Available types include `url', `domain', `local-address', `name',
-`email-address', and `email-address-headers'.
+Available types include `url', `link', `domain', `local-address',
+`name', `email-address', and `email-address-headers'.
 
 If the `textsec-check' user option is nil, these checks are
 disabled, and this function always returns nil."
@@ -67,7 +67,7 @@ verbatim.
 
 See `texsec-check' for further information about TYPE."
   (let ((warning (textsec-check string type)))
-    (if (not wardning)
+    (if (not warning)
         string
       (propertize string
                   'face 'textsec-suspicious
diff --git a/lisp/international/textsec.el b/lisp/international/textsec.el
index 4e9fb10ad7..89ef38e93e 100644
--- a/lisp/international/textsec.el
+++ b/lisp/international/textsec.el
@@ -376,6 +376,32 @@ potential problem."
     (and (url-host parsed)
          (textsec-domain-suspicious-p (url-host parsed)))))
 
+(defun textsec-link-suspicious-p (link)
+  "Say whether LINK is suspicious.
+LINK should be a cons cell where the first element is the URL,
+and the second element is the link text.
+
+This function will return non-nil if it seems like the link text
+is misleading about where the URL takes you.  This is typical
+when the link text looks like an URL itself, but doesn't lead to
+the same domain as the URL."
+  (let ((url (car link))
+        (text (string-trim (cdr link))))
+    (when (string-match-p "\\`[a-z]+\\.[.a-z]+\\'" text)
+      (setq text (concat "http://"; text)))
+    (let ((udomain (url-host (url-generic-parse-url url)))
+          (tdomain (url-host (url-generic-parse-url text))))
+      (and udomain
+           tdomain
+           (not (equal udomain tdomain))
+           ;; One may be a sub-domain of the other, but don't allow too
+           ;; short domains.
+           (not (or (and (string-suffix-p udomain tdomain)
+                         (url-domsuf-cookie-allowed-p udomain))
+                    (and (string-suffix-p tdomain udomain)
+                         (url-domsuf-cookie-allowed-p tdomain))))
+           (format "Text `%s' doesn't point to link URL `%s'" text url)))))
+
 (provide 'textsec)
 
 ;;; textsec.el ends here
diff --git a/lisp/net/shr.el b/lisp/net/shr.el
index c3950acd3d..79a8e9ba26 100644
--- a/lisp/net/shr.el
+++ b/lisp/net/shr.el
@@ -1469,7 +1469,12 @@ ones, in case fg and bg are nil."
     (when url
       (shr-urlify (or shr-start start) (shr-expand-url url) title)
       ;; Check whether the URL is suspicious.
-      (when-let ((warning (textsec-check (shr-expand-url url) 'url)))
+      (when-let ((warning (or (textsec-check (shr-expand-url url) 'url)
+                              (textsec-check (cons (shr-expand-url url)
+                                                   (buffer-substring
+                                                    (or shr-start start)
+                                                    (point)))
+                                             'link))))
         (add-text-properties (or shr-start start) (point)
                              (list 'face '(shr-link textsec-suspicious)))
         (insert (propertize "⚠️" 'help-echo warning))))))
diff --git a/test/lisp/international/textsec-tests.el 
b/test/lisp/international/textsec-tests.el
index c7cf56757c..416490aa08 100644
--- a/test/lisp/international/textsec-tests.el
+++ b/test/lisp/international/textsec-tests.el
@@ -168,4 +168,22 @@
   (should-not (textsec-url-suspicious-p "http://example.ru/bar";))
   (should (textsec-url-suspicious-p "http://Сгсе.ru/bar";)))
 
+(ert-deftest test-suspicious-link ()
+  (should-not (textsec-link-suspicious-p
+               (cons "https://gnu.org/"; "Hello")))
+  (should-not (textsec-link-suspicious-p
+               (cons "https://gnu.org/"; "https://gnu.org/";)))
+  (should-not (textsec-link-suspicious-p
+               (cons "https://gnu.org/"; "https://www.gnu.org/";)))
+  (should-not (textsec-link-suspicious-p
+               (cons "https://www.gnu.org/"; "https://gnu.org/";)))
+  (should (textsec-link-suspicious-p
+           (cons "https://www.gnu.org/"; "https://org/";)))
+  (should (textsec-link-suspicious-p
+           (cons "https://www.gnu.org/"; "https://fsf.org/";)))
+  (should (textsec-link-suspicious-p
+           (cons "https://www.gnu.org/"; "http://fsf.org/";)))
+  (should (textsec-link-suspicious-p
+           (cons "https://www.gnu.org/"; "fsf.org"))))
+
 ;;; textsec-tests.el ends here



reply via email to

[Prev in Thread] Current Thread [Next in Thread]