Function: mail-source-set-1

mail-source-set-1 is a byte-compiled function defined in mail-source.el.gz.

Signature

(mail-source-set-1 SOURCE)

Source Code

;; Defined in /usr/src/emacs/lisp/gnus/mail-source.el.gz
(defun mail-source-set-1 (source)
  (let* ((type (pop source))
         (defaults (cdr (assq type mail-source-keyword-map)))
         (search '(:max 1))
         found default value keyword user-auth pass-auth) ;; auth-info

    ;; append to the search the useful info from the source and the defaults:
    ;; user, host, and port

    ;; the msname is the mail-source parameter
    (dolist (msname '(:server :user :port))
      ;; the asname is the auth-source parameter
      (let* ((asname (cl-case msname
                       (:server :host)  ; auth-source uses :host
                       (t msname)))
             ;; this is the mail-source default
             (msdef1 (or (plist-get source msname)
                         (nth 1 (assoc msname defaults))))
             ;; ...evaluated
             (msdef (mail-source-value msdef1)))
        (setq search (append (list asname
                                   (if msdef msdef t))
                             search))))
    ;; if the port is unknown yet, get it from the mail-source type
    (unless (plist-get search :port)
      (setq search (append (list :port (symbol-name type)))))

    (while (setq default (pop defaults))
      ;; for each default :SYMBOL, set SYMBOL to the plist value for :SYMBOL
      ;; using `mail-source-value' to evaluate the plist value
      (set (mail-source-strip-keyword (setq keyword (car default)))
           ;; note the following reasons for this structure:
           ;; 1) the auth-sources user and password override everything
           ;; 2) it avoids macros, so it's cleaner
           ;; 3) it falls through to the mail-sources and then default values
           (cond
            ((and
             (eq keyword :user)
             (setq user-auth
                   (plist-get
                    ;; cache the search result in `found'
                    (or found
                        (setq found (nth 0 (apply #'auth-source-search
                                                  search))))
                    :user)))
             user-auth)
            ((and
              (eq keyword :password)
              (setq pass-auth
                    (plist-get
                     ;; cache the search result in `found'
                     (or found
                         (setq found (nth 0 (apply #'auth-source-search
                                                   search))))
                     :secret)))
             ;; maybe set the password to the return of the :secret function
             (if (functionp pass-auth)
                 (setq pass-auth (funcall pass-auth))
               pass-auth))
            (t (if (setq value (plist-get source keyword))
                 (mail-source-value value)
               (mail-source-value (cadr default)))))))))