emacs-diffs
[Top][All Lists]
Advanced

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

master 728bf2c9e53 1/2: Prevent passwords from being recorded during tex


From: Po Lu
Subject: master 728bf2c9e53 1/2: Prevent passwords from being recorded during text conversion
Date: Mon, 25 Mar 2024 22:55:30 -0400 (EDT)

branch: master
commit 728bf2c9e5353e68b16808ae455223549c16efc6
Author: Po Lu <luangruo@yahoo.com>
Commit: Po Lu <luangruo@yahoo.com>

    Prevent passwords from being recorded during text conversion
    
    * doc/lispref/commands.texi (Misc Events): Document new value of
    text-conversion-style.
    
    * java/org/gnu/emacs/EmacsService.java (EmacsService)
    <IC_MODE_PASSWORD>: New constant.
    
    * java/org/gnu/emacs/EmacsView.java (onCreateInputConnection):
    Set TYPE_TEXT_VARIATION_PASSWORD and IME_FLAG_FORCE_ASII if mode
    is IC_MODE_PASSWORD.
    
    * lisp/subr.el (read-passwd): Set text-conversion-style to
    `password'.
    
    * src/androidgui.h (enum android_ic_mode): New value
    ANDROID_IC_MODE_PASSWORD.
    
    * src/androidterm.c (android_reset_conversion): Handle
    `password'.
    
    * src/buffer.c (syms_of_buffer)
    <&BVAR (current_buffer, text_conversion_style)>: Update doc
    string.
    
    * src/textconv.c (syms_of_textconv) <Qpassword>: New DEFSYM.
    <Vtext_conversion_edits>: Fix typos in doc string.
---
 doc/lispref/commands.texi            |  9 ++++++++-
 java/org/gnu/emacs/EmacsService.java |  7 ++++---
 java/org/gnu/emacs/EmacsView.java    |  9 ++++++++-
 lisp/subr.el                         | 16 ++++++++++------
 src/androidgui.h                     |  7 ++++---
 src/androidterm.c                    |  2 ++
 src/buffer.c                         |  7 +++++++
 src/textconv.c                       |  3 ++-
 8 files changed, 45 insertions(+), 15 deletions(-)

diff --git a/doc/lispref/commands.texi b/doc/lispref/commands.texi
index 6c8d42337d0..9ecdd23716c 100644
--- a/doc/lispref/commands.texi
+++ b/doc/lispref/commands.texi
@@ -2464,7 +2464,7 @@ buffer-local variable @code{text-conversion-style}, which 
determines
 how an input method that wishes to make edits to buffer contents will
 behave.
 
-This variable can have one of three values:
+This variable can have one of four values:
 
 @table @code
 @item nil
@@ -2475,6 +2475,13 @@ events will be sent instead of text conversion events.
 This means that the input method will be enabled, but @key{RET} will
 be sent whenever the input method wants to insert a new line.
 
+@item password
+This is largely identical to @code{action}, but also requests an input
+method capable of inserting ASCII characters and instructs it not to
+save input in locations from whence it might be subsequently retrieved
+by features of the input method unfit to handle sensitive information,
+such as text suggestions.
+
 @item t
 This, or any other value, means that the input method will be enabled
 and make edits followed by @code{text-conversion} events.
diff --git a/java/org/gnu/emacs/EmacsService.java 
b/java/org/gnu/emacs/EmacsService.java
index 4e863c750d3..446cd26a3dd 100644
--- a/java/org/gnu/emacs/EmacsService.java
+++ b/java/org/gnu/emacs/EmacsService.java
@@ -114,9 +114,10 @@ public final class EmacsService extends Service
   private ContentResolver resolver;
 
   /* Keep this in synch with androidgui.h.  */
-  public static final int IC_MODE_NULL   = 0;
-  public static final int IC_MODE_ACTION = 1;
-  public static final int IC_MODE_TEXT   = 2;
+  public static final int IC_MODE_NULL     = 0;
+  public static final int IC_MODE_ACTION   = 1;
+  public static final int IC_MODE_TEXT     = 2;
+  public static final int IC_MODE_PASSWORD = 3;
 
   /* Display metrics used by font backends.  */
   public DisplayMetrics metrics;
diff --git a/java/org/gnu/emacs/EmacsView.java 
b/java/org/gnu/emacs/EmacsView.java
index 8398e4b784c..5b922212c0b 100644
--- a/java/org/gnu/emacs/EmacsView.java
+++ b/java/org/gnu/emacs/EmacsView.java
@@ -838,9 +838,16 @@ public final class EmacsView extends ViewGroup
        EmacsNative.requestSelectionUpdate (window.handle);
       }
 
-    if (mode == EmacsService.IC_MODE_ACTION)
+    if (mode == EmacsService.IC_MODE_ACTION
+       || mode == EmacsService.IC_MODE_PASSWORD)
       info.imeOptions |= EditorInfo.IME_ACTION_DONE;
 
+    if (mode == EmacsService.IC_MODE_PASSWORD)
+      {
+       info.imeOptions |= EditorInfo.IME_FLAG_FORCE_ASCII;
+       info.inputType  |= InputType.TYPE_TEXT_VARIATION_PASSWORD;
+      }
+
     /* Set the initial selection fields.  */
     info.initialSelStart = selection[0];
     info.initialSelEnd = selection[1];
diff --git a/lisp/subr.el b/lisp/subr.el
index 3de4412637f..90dbfc75d52 100644
--- a/lisp/subr.el
+++ b/lisp/subr.el
@@ -3405,6 +3405,10 @@ with Emacs.  Do not call it directly in your own 
packages."
        (+ i beg) (+ 1 i beg)
        'help-echo "C-u: Clear password\nTAB: Toggle password visibility"))))
 
+;; Actually in textconv.c.
+(defvar overriding-text-conversion-style)
+(declare-function set-text-conversion-style "textconv.c")
+
 (defun read-passwd (prompt &optional confirm default)
   "Read a password, prompting with PROMPT, and return it.
 If optional CONFIRM is non-nil, read the password twice to make sure.
@@ -3445,7 +3449,8 @@ by doing (clear-string STRING)."
             (add-hook 'post-command-hook #'read-passwd--hide-password nil t))
         (unwind-protect
             (let ((enable-recursive-minibuffers t)
-                 (read-hide-char (or read-hide-char ?*)))
+                 (read-hide-char (or read-hide-char ?*))
+                  (overriding-text-conversion-style 'password))
               (read-string prompt nil t default)) ; t = "no history"
           (when (buffer-live-p minibuf)
             (with-current-buffer minibuf
@@ -3457,7 +3462,10 @@ by doing (clear-string STRING)."
                            #'read-passwd--hide-password 'local)
               (kill-local-variable 'post-self-insert-hook)
               ;; And of course, don't keep the sensitive data around.
-              (erase-buffer))))))))
+              (erase-buffer)
+              ;; Then restore the previous text conversion style.
+              (when (fboundp 'set-text-conversion-style)
+                (set-text-conversion-style text-conversion-style)))))))))
 
 (defvar read-number-history nil
   "The default history for the `read-number' function.")
@@ -3867,10 +3875,6 @@ confusing to some users.")
                from--tty-menu-p)            ; invoked via TTY menu
            use-dialog-box)))
 
-;; Actually in textconv.c.
-(defvar overriding-text-conversion-style)
-(declare-function set-text-conversion-style "textconv.c")
-
 (defun y-or-n-p (prompt)
   "Ask user a \"y or n\" question.
 Return t if answer is \"y\" and nil if it is \"n\".
diff --git a/src/androidgui.h b/src/androidgui.h
index d89aee51055..f941c7cc577 100644
--- a/src/androidgui.h
+++ b/src/androidgui.h
@@ -618,9 +618,10 @@ enum android_lookup_status
 
 enum android_ic_mode
   {
-    ANDROID_IC_MODE_NULL   = 0,
-    ANDROID_IC_MODE_ACTION = 1,
-    ANDROID_IC_MODE_TEXT   = 2,
+    ANDROID_IC_MODE_NULL     = 0,
+    ANDROID_IC_MODE_ACTION   = 1,
+    ANDROID_IC_MODE_TEXT     = 2,
+    ANDROID_IC_MODE_PASSWORD = 3,
   };
 
 enum android_stack_mode
diff --git a/src/androidterm.c b/src/androidterm.c
index ba9b6d3b8a9..c920375fdbe 100644
--- a/src/androidterm.c
+++ b/src/androidterm.c
@@ -6276,6 +6276,8 @@ android_reset_conversion (struct frame *f)
 
   if (NILP (style) || conversion_disabled_p ())
     mode = ANDROID_IC_MODE_NULL;
+  else if (EQ (style, Qpassword))
+    mode = ANDROID_IC_MODE_PASSWORD;
   else if (EQ (style, Qaction) || EQ (f->selected_window,
                                      f->minibuffer_window))
     mode = ANDROID_IC_MODE_ACTION;
diff --git a/src/buffer.c b/src/buffer.c
index 07d19dfc078..9f954e1aba9 100644
--- a/src/buffer.c
+++ b/src/buffer.c
@@ -5900,12 +5900,19 @@ Use Custom to set this variable and update the display. 
 */);
                                                     text_conversion_style),
                     Qnil,
     doc: /* How the on screen keyboard's input method should insert in this 
buffer.
+
 When nil, the input method will be disabled and an ordinary keyboard
 will be displayed in its place.
+
 When the symbol `action', the input method will insert text directly, but
 will send `return' key events instead of inserting new line characters.
 Any other value means that the input method will insert text directly.
 
+When the symbol `password', an input method capable of ASCII input will
+be enabled, and will not save entered text where it will be retrieved
+for text suggestions or other features not suited to handling sensitive
+information, in addition to reporting `return' as when `action'.
+
 If you need to make non-buffer local changes to this variable, use
 `overriding-text-conversion-style', which see.
 
diff --git a/src/textconv.c b/src/textconv.c
index 0941848dd09..9625c884e16 100644
--- a/src/textconv.c
+++ b/src/textconv.c
@@ -2318,6 +2318,7 @@ void
 syms_of_textconv (void)
 {
   DEFSYM (Qaction, "action");
+  DEFSYM (Qpassword, "password");
   DEFSYM (Qtext_conversion, "text-conversion");
   DEFSYM (Qpush_mark, "push-mark");
   DEFSYM (Qunderline, "underline");
@@ -2325,7 +2326,7 @@ syms_of_textconv (void)
          "overriding-text-conversion-style");
 
   DEFVAR_LISP ("text-conversion-edits", Vtext_conversion_edits,
-    doc: /* List of buffers that were last edited as result of text conversion.
+    doc: /* List of buffers last edited as a result of text conversion.
 
 This list can be used while handling a `text-conversion' event to
 determine which changes have taken place.



reply via email to

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