]> git.eshelyaron.com Git - emacs.git/commitdiff
Hide passwords in .authinfo and .netrc files
authorLars Ingebrigtsen <larsi@gnus.org>
Sat, 21 Sep 2019 10:03:55 +0000 (12:03 +0200)
committerLars Ingebrigtsen <larsi@gnus.org>
Sat, 21 Sep 2019 10:04:00 +0000 (12:04 +0200)
* lisp/auth-source.el (authinfo-mode): New mode (bug#28785).
(authinfo--hide-passwords, authinfo--toggle-display): New functions.

* lisp/files.el (auto-mode-alist): Use authinfo-mode for .authinfo
and .netrc files.

etc/NEWS
lisp/auth-source.el
lisp/files.el

index 02fe93a782d1bff8b04d05eac97e3b19f18200a0..82b8506ae0cbab21b50662ae54274d42b0507745 100644 (file)
--- a/etc/NEWS
+++ b/etc/NEWS
@@ -1488,6 +1488,11 @@ To recover the previous behavior, set new user option
 ---
 *** The Secret Service backend supports the ':create' key now.
 
+*** .authinfo and .netrc files now use a new mode: 'authinfo-mode'.
+This is just like 'fundamental-mode', except that it hides passwords
+under a "****" display property.  When the cursor moves to this text,
+the real password is revealed (via `reveal-mode').
+
 ** Tramp
 
 +++
index 2164a550b0ab64f2fe395cc4ddd8969da1c7aa83..9669ae976ccea25e8cf59ed638bbc87720f17839 100644 (file)
@@ -2397,6 +2397,38 @@ MODE can be \"login\" or \"password\"."
       (setq password (funcall password)))
     (list user password auth-info)))
 
+;;; Tiny mode for editing .netrc/.authinfo modes (that basically just
+;;; hides passwords).
+
+;;;###autoload
+(define-derived-mode authinfo-mode fundamental-mode "Authinfo"
+  "Mode for editing .authinfo/.netrc files.
+
+This is just like `fundamental-mode', but hides passwords.  The
+passwords are revealed when point moved into the password.
+
+\\{authinfo-mode-map}"
+  (authinfo--hide-passwords (point-min) (point-max))
+  (reveal-mode))
+
+(defun authinfo--hide-passwords (start end)
+  (save-excursion
+    (save-restriction
+      (narrow-to-region start end)
+      (goto-char start)
+      (while (re-search-forward "\\bpassword +\\([^\n\t ]+\\)"
+                                nil t)
+        (let ((overlay (make-overlay (match-beginning 1) (match-end 1))))
+          (overlay-put overlay 'display (propertize "****"
+                                                    'face 'warning))
+          (overlay-put overlay 'reveal-toggle-invisible
+                       #'authinfo--toggle-display))))))
+
+(defun authinfo--toggle-display (overlay hide)
+  (if hide
+      (overlay-put overlay 'display (propertize "****" 'face 'warning))
+    (overlay-put overlay 'display nil)))
+
 (provide 'auth-source)
 
 ;;; auth-source.el ends here
index 0c3da1fe3cc28f67e9db8dedf576b544eac71b0a..8c355b02aa1d32eca04ed4eab60ed308b50786c9 100644 (file)
@@ -2811,6 +2811,7 @@ ARC\\|ZIP\\|LZH\\|LHA\\|ZOO\\|[JEW]AR\\|XPI\\|RAR\\|CBR\\|7Z\\)\\'" . archive-mo
      ("\\.docbook\\'" . sgml-mode)
      ("\\.com\\'" . dcl-mode)
      ("/config\\.\\(?:bat\\|log\\)\\'" . fundamental-mode)
+     ("/\\.\\(authinfo\\|netrc\\)\\'" . authinfo-mode)
      ;; Windows candidates may be opened case sensitively on Unix
      ("\\.\\(?:[iI][nN][iI]\\|[lL][sS][tT]\\|[rR][eE][gG]\\|[sS][yY][sS]\\)\\'" . conf-mode)
      ("\\.la\\'" . conf-unix-mode)