From 7ba93e94392a7a5ffe0c3c2d87f04f26b6054026 Mon Sep 17 00:00:00 2001 From: Gnus developers Date: Thu, 17 Feb 2011 23:46:18 +0000 Subject: [PATCH] Merge chagnes made in Gnus trunk. auth.texi (GnuPG and EasyPG Assistant Configuration): Mention the default now is to have two files in `auth-sources'. nnimap.el (nnimap-open-connection-1): Delete duplicate server names when getting credentials. gnus-util.el (gnus-delete-duplicates): New function. nnimap.el (nnimap-credentials): Instead of picking the first port as a creation default, pass the whole port list down. It will be completed. auth-source.el (auth-source-search): Updated docs to talk about multiple creation choices. (auth-source-netrc-create): Accept a list as a value (from the search parameters) and do completion on that list. Keep a separate netrc line with the password obscured for showing the user. nnimap.el (nnimap-open-connection-1): Make the `nnimap-address' the first choice to `auth-source-search' so it will be used for entry creation instead of the server's Gnus-specific name. (nnimap-credentials): Rely on the auth-source library to select which port is actually wanted in the new netrc entry, so don't override `auth-source-creation-defaults'. --- doc/misc/ChangeLog | 2 ++ doc/misc/auth.texi | 4 ++- lisp/gnus/ChangeLog | 24 ++++++++++++++++++ lisp/gnus/auth-source.el | 54 ++++++++++++++++++++++++++++------------ lisp/gnus/gnus-util.el | 9 +++++++ lisp/gnus/nnimap.el | 10 ++++---- 6 files changed, 81 insertions(+), 22 deletions(-) diff --git a/doc/misc/ChangeLog b/doc/misc/ChangeLog index 9a292c03c8d..c075f1785d3 100644 --- a/doc/misc/ChangeLog +++ b/doc/misc/ChangeLog @@ -2,6 +2,8 @@ * auth.texi (Help for users): Use :port instead of :protocol for all auth-source docs. + (GnuPG and EasyPG Assistant Configuration): Mention the default now is + to have two files in `auth-sources'. 2011-02-16 Glenn Morris diff --git a/doc/misc/auth.texi b/doc/misc/auth.texi index 0e19bce0b9f..67f5b52b694 100644 --- a/doc/misc/auth.texi +++ b/doc/misc/auth.texi @@ -262,7 +262,9 @@ TODO: how to include docstring? @appendix GnuPG and EasyPG Assistant Configuration If you don't customize @code{auth-sources}, the auth-source library -reads @code{~/.authinfo.gpg}, which is a GnuPG encrypted file. +reads @code{~/.authinfo.gpg}, which is a GnuPG encrypted file. Then +it will check @code{~/.authinfo} but it's not recommended to use such +an unencrypted file. In Emacs 23 or later there is an option @code{auto-encryption-mode} to automatically decrypt @code{*.gpg} files. It is enabled by default. diff --git a/lisp/gnus/ChangeLog b/lisp/gnus/ChangeLog index cc405410db9..7b6aa86ac06 100644 --- a/lisp/gnus/ChangeLog +++ b/lisp/gnus/ChangeLog @@ -1,5 +1,29 @@ +2011-02-17 Lars Ingebrigtsen + + * nnimap.el (nnimap-open-connection-1): Delete duplicate server names + when getting credentials. + + * gnus-util.el (gnus-delete-duplicates): New function. + 2011-02-17 Teodor Zlatanov + * nnimap.el (nnimap-credentials): Instead of picking the first port as + a creation default, pass the whole port list down. It will be + completed. + + * auth-source.el (auth-source-search): Updated docs to talk about + multiple creation choices. + (auth-source-netrc-create): Accept a list as a value (from the search + parameters) and do completion on that list. Keep a separate netrc line + with the password obscured for showing the user. + + * nnimap.el (nnimap-open-connection-1): Make the `nnimap-address' the + first choice to `auth-source-search' so it will be used for entry + creation instead of the server's Gnus-specific name. + (nnimap-credentials): Rely on the auth-source library to select which + port is actually wanted in the new netrc entry, so don't override + `auth-source-creation-defaults'. + * auth-source.el (auth-source-netrc-parse): Use :port instead of :protocol and accept a missing user, host, or port as a wildcard match. (auth-source-debug): Default to off. diff --git a/lisp/gnus/auth-source.el b/lisp/gnus/auth-source.el index 29a3ca06707..338dd01e77b 100644 --- a/lisp/gnus/auth-source.el +++ b/lisp/gnus/auth-source.el @@ -453,8 +453,8 @@ which says: search to find only entries that have P set to 'pppp'.\" When multiple values are specified in the search parameter, the -first one is used for creation. So :host (X Y Z) would create a -token for host X, for instance. +user is prompted for which one. So :host (X Y Z) would ask the +user to choose between X, Y, and Z. This creation can fail if the search was not specific enough to create a new token (it's up to the backend to decide that). You @@ -851,6 +851,7 @@ See `auth-source-search' for details on SPEC." (required (append base-required create-extra)) (file (oref backend source)) (add "") + (show "") ;; `valist' is an alist valist ;; `artificial' will be returned if no creation is needed @@ -858,12 +859,16 @@ See `auth-source-search' for details on SPEC." ;; only for base required elements (defined as function parameters): ;; fill in the valist with whatever data we may have from the search - ;; we take the first value if it's a list, the whole value otherwise + ;; we complete the first value if it's a list and use the value otherwise (dolist (br base-required) (when (symbol-value br) - (aput 'valist br (if (listp (symbol-value br)) - (nth 0 (symbol-value br)) - (symbol-value br))))) + (let ((br-choice (cond + ;; all-accepting choice (predicate is t) + ((eq t (symbol-value br)) nil) + ;; just the value otherwise + (t (symbol-value br))))) + (when br-choice + (aput 'valist br br-choice))))) ;; for extra required elements, see if the spec includes a value for them (dolist (er create-extra) @@ -894,6 +899,8 @@ See `auth-source-search' for details on SPEC." (user-value (aget valist 'user)) (host-value (aget valist 'host)) (port-value (aget valist 'port)) + ;; note this handles lists by just printing them + ;; later we allow the user to use completing-read to pick (info-so-far (concat (if user-value (format "%s@" user-value) "[USER?]") @@ -921,6 +928,16 @@ See `auth-source-search' for details on SPEC." (format "Enter %s for %s%s: " r info-so-far default-string) nil nil default)) + ((listp data) + (completing-read + (format "Enter %s for %s (TAB to see the choices): " + r info-so-far) + data + nil ; no predicate + t ; require a match + ;; note the default is nil, but if the user + ;; hits RET we'll get "", which is handled OK later + nil)) (t data)))) (when data @@ -934,20 +951,25 @@ See `auth-source-search' for details on SPEC." ;; when r is not an empty string... (when (and (stringp data) (< 0 (length data))) - ;; append the key (the symbol name of r) and the value in r - (setq add (concat add - (format "%s%s %S" - ;; prepend a space - (if (zerop (length add)) "" " ") - ;; remap auth-source tokens to netrc - (case r + (let ((printer (lambda (hide) + ;; append the key (the symbol name of r) + ;; and the value in r + (format "%s%s %S" + ;; prepend a space + (if (zerop (length add)) "" " ") + ;; remap auth-source tokens to netrc + (case r ('user "login") ('host "machine") ('secret "password") ('port "port") ; redundant but clearer (t (symbol-name r))) - ;; the value will be printed in %S format - data)))))) + ;; the value will be printed in %S format + (if (and hide (eq r 'secret)) + "HIDDEN_SECRET" + data))))) + (setq add (concat add (funcall printer nil))) + (setq show (concat show (funcall printer t))))))) (with-temp-buffer (when (file-exists-p file) @@ -964,7 +986,7 @@ See `auth-source-search' for details on SPEC." (goto-char (point-max)) ;; ask AFTER we've successfully opened the file - (if (y-or-n-p (format "Add to file %s: line [%s]" file add)) + (if (y-or-n-p (format "Add to file %s: line [%s]" file show)) (progn (unless (bolp) (insert "\n")) diff --git a/lisp/gnus/gnus-util.el b/lisp/gnus/gnus-util.el index 67c49096b92..42dbd5948cf 100644 --- a/lisp/gnus/gnus-util.el +++ b/lisp/gnus/gnus-util.el @@ -871,6 +871,15 @@ Bind `print-quoted' and `print-readably' to t, and `print-length' and (when (file-exists-p file) (delete-file file))) +(defun gnus-delete-duplicates (list) + "Remove duplicate entries from LIST." + (let ((result nil)) + (while list + (unless (member (car list) result) + (push (car list) result)) + (pop list)) + (nreverse result))) + (defun gnus-delete-directory (directory) "Delete files in DIRECTORY. Subdirectories remain. If there's no subdirectory, delete DIRECTORY as well." diff --git a/lisp/gnus/nnimap.el b/lisp/gnus/nnimap.el index fc8873ff565..7f8ecc1710f 100644 --- a/lisp/gnus/nnimap.el +++ b/lisp/gnus/nnimap.el @@ -277,8 +277,7 @@ textual parts.") (current-buffer))) (defun nnimap-credentials (address ports) - (let* ((auth-source-creation-defaults `((port . ,(nth 0 ports)))) - (found (nth 0 (auth-source-search :max 1 + (let* ((found (nth 0 (auth-source-search :max 1 :host address :port ports :create t))) @@ -385,9 +384,10 @@ textual parts.") ;; Look for the credentials based on ;; the virtual server name and the address (nnimap-credentials - (list - (nnoo-current-server 'nnimap) - nnimap-address) + (gnus-delete-duplicates + (list + nnimap-address + (nnoo-current-server 'nnimap))) ports)))) (setq nnimap-object nil) (let ((nnimap-inhibit-logging t)) -- 2.39.2