Merge chagnes made in Gnus trunk.
authorGnus developers <ding@gnus.org>
Thu, 17 Feb 2011 23:46:18 +0000 (23:46 +0000)
committerKatsumi Yamaoka <yamaoka@jpl.org>
Thu, 17 Feb 2011 23:46:18 +0000 (23:46 +0000)
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
doc/misc/auth.texi
lisp/gnus/ChangeLog
lisp/gnus/auth-source.el
lisp/gnus/gnus-util.el
lisp/gnus/nnimap.el

index 9a292c0..c075f17 100644 (file)
@@ -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  <rgm@gnu.org>
 
index 0e19bce..67f5b52 100644 (file)
@@ -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.
index cc40541..7b6aa86 100644 (file)
@@ -1,5 +1,29 @@
+2011-02-17  Lars Ingebrigtsen  <larsi@gnus.org>
+
+       * 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  <tzz@lifelogs.com>
 
+       * 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.
index 29a3ca0..338dd01 100644 (file)
@@ -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"))
index 67c4909..42dbd59 100644 (file)
@@ -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."
index fc8873f..7f8ecc1 100644 (file)
@@ -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))