Function: sieve-sasl-auth
sieve-sasl-auth is a byte-compiled function defined in
sieve-manage.el.gz.
Signature
(sieve-sasl-auth BUFFER MECH)
Documentation
Login to server using the SASL MECH method.
Source Code
;; Defined in /usr/src/emacs/lisp/net/sieve-manage.el.gz
;; Authenticators
(defun sieve-sasl-auth (buffer mech)
"Login to server using the SASL MECH method."
(sieve-manage--message "Authenticating using %s..." mech)
(with-current-buffer buffer
(let* ((auth-info (auth-source-search :host sieve-manage-server
:port "sieve"
:max 1
:create t))
(user-name (or (plist-get (nth 0 auth-info) :user) ""))
(user-password (or (auth-info-password (nth 0 auth-info)) ""))
(client (sasl-make-client (sasl-find-mechanism (list mech))
user-name "sieve" sieve-manage-server))
(sasl-read-passphrase
;; We *need* to copy the password, because sasl will modify it
;; somehow.
(lambda (_prompt) (copy-sequence user-password)))
(step (sasl-next-step client nil))
(_tag (sieve-manage-send
(concat
"AUTHENTICATE \""
mech
"\""
(and (sasl-step-data step)
(concat
" \""
(base64-encode-string
(sasl-step-data step)
'no-line-break)
"\"")))))
data rsp)
(catch 'done
(while t
(setq rsp nil)
(goto-char (point-min))
(while (null (or (progn
(setq rsp (sieve-manage-is-string))
(if (not (and rsp (looking-at
sieve-manage-server-eol)))
(setq rsp nil)
(goto-char (match-end 0))
rsp))
(setq rsp (sieve-manage-is-okno))))
(accept-process-output sieve-manage-process 1)
(goto-char (point-min)))
(sieve-manage-erase)
(when (sieve-manage-ok-p rsp)
(when (and (cadr rsp)
(string-match "^SASL \"\\([^\"]+\\)\"" (cadr rsp)))
(sasl-step-set-data
step (base64-decode-string (match-string 1 (cadr rsp)))))
(if (and (setq step (sasl-next-step client step))
(setq data (sasl-step-data step)))
;; We got data for server but it's finished
(sieve-manage--error
"Server not ready for SASL data: %s" data)
;; The authentication process is finished.
(sieve-manage--message "Logged in as %s using %s"
user-name mech)
(throw 'done t)))
(unless (stringp rsp)
(sieve-manage--error
"Server aborted SASL authentication: %s" (caddr rsp)))
(sasl-step-set-data step (base64-decode-string rsp))
(setq step (sasl-next-step client step))
(sieve-manage-send
(if (sasl-step-data step)
(concat "\""
(base64-encode-string (sasl-step-data step)
'no-line-break)
"\"")
"")))))))