Improve detection of suspicious uses of bidi controls

* lisp/international/textsec.el
(textsec-bidi-controls-suspicious-p): New function.
(textsec-name-suspicious-p): Use it.

* test/lisp/international/textsec-tests.el (test-suspicious-name):
Enable the test that was previously failing with
'bidi-find-overridden-directionality'.
This commit is contained in:
Eli Zaretskii 2022-01-22 11:58:05 +02:00
parent ebe334cdc2
commit 682b6df6bf
2 changed files with 23 additions and 8 deletions

View file

@ -287,6 +287,22 @@ certain other unusual mixtures of characters."
((string-match-p "\\`\\.\\|\\.\\'\\|\\.\\." local)
(format "`%s' contains invalid dots" local))))
(defun textsec-bidi-controls-suspicious-p (string)
"Return non-nil of STRING uses bidi controls in suspicious ways.
If STRING doesn't include any suspicious uses of bidirectional
formatting control characters, return nil. Otherwise, return the
index of the first character in STRING affected by such suspicious
use of bidi controls. If the returned value is beyond the length
of STRING, it means any text following STRING on display might be
affected by bidi controls in STRING."
(with-temp-buffer
;; We add a string that's representative of some text that could
;; follow STRING, with the purpose of detecting residual bidi
;; state at end of STRING which could then affect the following
;; text.
(insert string "a1א:!")
(bidi-find-overridden-directionality 1 (point-max) nil)))
(defun textsec-name-suspicious-p (name)
"Say whether NAME looks suspicious.
NAME is (for instance) the free-text display name part of an
@ -310,10 +326,11 @@ other unusual mixtures of characters."
?\N{arabic letter mark})))))
name)
;; We have bidirectional formatting characters, but check
;; whether they affect LTR characters. If not, it's not
;; suspicious.
(bidi-find-overridden-directionality 0 (length name) name))
(format "The string contains bidirectional control characters"))
;; whether they affect any other characters in suspicious
;; ways. If not, NAME is not suspicious.
(fixnump (textsec-bidi-controls-suspicious-p name)))
(format "`%s' contains suspicious uses of bidirectional control characters"
name))
((textsec-suspicious-nonspacing-p name))))
(defun textsec-suspicious-nonspacing-p (string)

View file

@ -136,10 +136,8 @@
(should (textsec-name-suspicious-p "LÅRS INGEBRIGTSEN"))
(should-not (textsec-name-suspicious-p "LÅRS INGEBRIGTSEN"))
;;; FIXME -- this test fail with `bidi-find-overridden-directionality'.
(when nil
(should (textsec-name-suspicious-p
"Lars Ingebrigtsen\N{LEFT-TO-RIGHT OVERRIDE}")))
(should (textsec-name-suspicious-p
"Lars Ingebrigtsen\N{LEFT-TO-RIGHT OVERRIDE}"))
(should (textsec-name-suspicious-p
"Lars Ingebrigtsen\N{LEFT-TO-RIGHT OVERRIDE}f"))
(should-not (textsec-name-suspicious-p