fix(org-caldav): fallback HA1 hash + boundp guard for url-digest-auth-storage

This commit is contained in:
2026-02-24 19:52:24 +01:00
parent 37fb7802e8
commit be351d39b9

View File

@@ -1747,26 +1747,29 @@ current frame."
;; Baikal uses Digest auth. Pre-register credentials from ~/.authinfo ;; Baikal uses Digest auth. Pre-register credentials from ~/.authinfo
;; so Emacs url package doesn't prompt interactively. ;; so Emacs url package doesn't prompt interactively.
(defun my/caldav-setup-digest-auth () (defun my/caldav-setup-digest-auth ()
"Load Digest auth credentials for Baikal from auth-source (~/.authinfo). "Pre-register Baikal Digest auth. HA1 = MD5(user:realm:pass) from authinfo.
Baikal uses Digest auth. url-digest-auth-storage stores HA1 = MD5(user:realm:pass)." Falls back to hardcoded hash if auth-source lookup fails.
url-digest-auth-storage format: ((\"server:port\" (\"realm\" user ha1)) ...)"
(require 'url-auth) (require 'url-auth)
(let* ((found (car (auth-source-search :host "cal.apps.sukany.cz" (let* ((user "martin")
:user "martin" :max 1))) (realm "BaikalDAV")
(server "cal.apps.sukany.cz:443")
(found (car (auth-source-search :host "cal.apps.sukany.cz"
:user user :max 1)))
(pass (when found (pass (when found
(let ((s (plist-get found :secret))) (let ((s (plist-get found :secret)))
(if (functionp s) (funcall s) s)))) (if (functionp s) (funcall s) s))))
(user "martin") ;; Compute HA1 from authinfo password, or use pre-computed fallback
(realm "BaikalDAV") (ha1 (if pass
(server "cal.apps.sukany.cz:443")) (md5 (concat user ":" realm ":" pass))
(when pass ;; Fallback: MD5("martin:BaikalDAV:treasure-Hunter")
;; url-digest-auth-storage format: (("server:port" ("realm" user ha1) ...) ...) "7cf9c41c78f4986fd65948029bcc4743")))
;; (cdr realm-entry) must be a list (user ha1), NOT a bare string. (if (boundp 'url-digest-auth-storage)
(let ((ha1 (md5 (concat user ":" realm ":" pass))) ;; Modern Emacs: inject into url-digest-auth-storage
(existing (assoc server url-digest-auth-storage))) (setq url-digest-auth-storage
(if existing (list (list server (list realm user ha1))))
(setcdr existing (list (list realm user ha1))) ;; Older Emacs: warn and skip
(push (list server (list realm user ha1)) (message "org-caldav: url-digest-auth-storage not available, auth may fail"))))
url-digest-auth-storage))))))
(defun my/org-caldav-sync () (defun my/org-caldav-sync ()
"Sync org-caldav after pre-registering Baikal Digest auth." "Sync org-caldav after pre-registering Baikal Digest auth."