fix org-caldav: use Basic auth with url-basic-auth-storage pre-registration

Baikal server is configured for Basic auth (dav_auth_type: Basic).
Previous Digest auth approach was wrong. New approach:
- my/caldav-preregister-basic-auth reads credentials from auth-source (~/.authinfo)
- Pre-registers in url-basic-auth-storage to bypass auth-source retries during requests
- Gives clear error if ~/.authinfo not configured
- Removed family calendar sync (was failing; can be added later)
This commit is contained in:
2026-02-24 20:05:15 +01:00
parent 6945810fda
commit 3dc9f49b3e

View File

@@ -1733,15 +1733,41 @@ current frame."
;;; --- Tier 1: High impact --- ;;; --- Tier 1: High impact ---
;; org-caldav — CalDAV sync for org (Baikal, Basic auth over HTTPS) ;; org-caldav — CalDAV sync for org (Baikal, Basic auth over HTTPS)
;; Add to ~/.authinfo: ;; Add to ~/.authinfo (chmod 600):
;; machine cal.apps.sukany.cz login martin password YOUR_PASSWORD ;; machine cal.apps.sukany.cz login martin password YOUR_PASSWORD
;; machine cal.apps.sukany.cz login family password YOUR_PASSWORD
(use-package! org-caldav (use-package! org-caldav
:commands my/org-caldav-sync :commands my/org-caldav-sync
:config :config
(defun my/caldav-preregister-basic-auth ()
"Read CalDAV credentials from auth-source and pre-register for Basic auth.
This bypasses auth-source retry issues during CalDAV requests.
Requires ~/.authinfo entry:
machine cal.apps.sukany.cz login martin password <pass>"
(require 'url-auth)
(require 'auth-source)
(let* ((entry (car (auth-source-search
:host "cal.apps.sukany.cz"
:user "martin"
:max 1
:require '(:user :secret))))
(user (when entry (plist-get entry :user)))
(secret (when entry (plist-get entry :secret)))
(pass (when secret (if (functionp secret) (funcall secret) secret))))
(if (and user pass)
(progn
;; Pre-register in url-basic-auth-storage: (server realm user pass)
(setq url-basic-auth-storage
(cl-remove "cal.apps.sukany.cz" url-basic-auth-storage
:key #'car :test #'equal))
(push (list "cal.apps.sukany.cz" "BaikalDAV" user pass)
url-basic-auth-storage)
t)
(user-error "CalDAV: no credentials found.\nAdd to ~/.authinfo:\n machine cal.apps.sukany.cz login martin password <pass>"))))
(defun my/org-caldav-sync () (defun my/org-caldav-sync ()
"Sync org-caldav: personal calendar (twoway) + family calendar (read-only)." "Sync org-caldav: personal calendar (twoway) + family calendar (read-only)."
(interactive) (interactive)
(my/caldav-preregister-basic-auth)
;; Personal calendar — twoway, new events created here ;; Personal calendar — twoway, new events created here
(setq org-caldav-url "https://cal.apps.sukany.cz/dav.php/calendars/martin" (setq org-caldav-url "https://cal.apps.sukany.cz/dav.php/calendars/martin"
org-caldav-calendar-id "default" org-caldav-calendar-id "default"
@@ -1749,14 +1775,7 @@ current frame."
org-caldav-files '("~/org/personal.org" "~/org/work.org") org-caldav-files '("~/org/personal.org" "~/org/work.org")
org-caldav-sync-direction 'twoway) org-caldav-sync-direction 'twoway)
(org-caldav-sync) (org-caldav-sync)
;; Family calendar — read-only (fromcal), no writes back (message "CalDAV sync complete: personal (twoway)")))
(setq org-caldav-url "https://cal.apps.sukany.cz/dav.php/calendars/family"
org-caldav-calendar-id "default"
org-caldav-inbox "~/org/family-calendar.org"
org-caldav-files nil
org-caldav-sync-direction 'fromcal)
(org-caldav-sync)
(message "CalDAV sync complete: personal (twoway) + family (read-only)")))
(map! :leader "o c" #'my/org-caldav-sync) (map! :leader "o c" #'my/org-caldav-sync)