*-watch-for-password-prompt: Use run-at-time to read password

* lisp/comint.el (comint-watch-for-password-prompt):
* lisp/eshell/esh-mode.el (eshell-watch-for-password-prompt):
* lisp/term.el (term-watch-for-password-prompt):
Use run-at-time to read a password (bug#51263).
This commit is contained in:
Miha Rihtaršič 2021-10-18 15:24:54 +02:00 committed by Lars Ingebrigtsen
parent f3c5a1b368
commit a6f156a7b0
3 changed files with 29 additions and 7 deletions

View file

@ -2455,11 +2455,19 @@ This function could be in the list `comint-output-filter-functions'."
(when (let ((case-fold-search t))
(string-match comint-password-prompt-regexp
(string-replace "\r" "" string)))
(let ((comint--prompt-recursion-depth (1+ comint--prompt-recursion-depth)))
(if (> comint--prompt-recursion-depth 10)
(message "Password prompt recursion too deep")
(comint-send-invisible
(string-trim string "[ \n\r\t\v\f\b\a]+" "\n+"))))))
;; Use `run-at-time' in order not to pause execution of the
;; process filter with a minibuffer
(run-at-time
0 nil
(lambda (current-buf)
(with-current-buffer current-buf
(let ((comint--prompt-recursion-depth
(1+ comint--prompt-recursion-depth)))
(if (> comint--prompt-recursion-depth 10)
(message "Password prompt recursion too deep")
(comint-send-invisible
(string-trim string "[ \n\r\t\v\f\b\a]+" "\n+"))))))
(current-buffer))))
;; Low-level process communication

View file

@ -940,7 +940,14 @@ This function could be in the list `eshell-output-filter-functions'."
(beginning-of-line)
(if (re-search-forward eshell-password-prompt-regexp
eshell-last-output-end t)
(eshell-send-invisible))))))
;; Use `run-at-time' in order not to pause execution of
;; the process filter with a minibuffer
(run-at-time
0 nil
(lambda (current-buf)
(with-current-buffer current-buf
(eshell-send-invisible)))
(current-buffer)))))))
(custom-add-option 'eshell-output-filter-functions
'eshell-watch-for-password-prompt)

View file

@ -2409,7 +2409,14 @@ Checks if STRING contains a password prompt as defined by
(when (term-in-line-mode)
(when (let ((case-fold-search t))
(string-match comint-password-prompt-regexp string))
(term-send-invisible (read-passwd string)))))
;; Use `run-at-time' in order not to pause execution of the
;; process filter with a minibuffer
(run-at-time
0 nil
(lambda (current-buf)
(with-current-buffer current-buf
(term-send-invisible (read-passwd string))))
(current-buffer)))))
;;; Low-level process communication