fix(calendar): thread raw credentials to caldav AsyncDAVClient

caldav 3.x lists niquests as a mandatory dependency and prefers it over
httpx. Passing httpx.BasicAuth via the auth= argument breaks under the
niquests backend with "Unexpected non-callable authentication" — see #731.

Switch CalendarClient.__init__ from auth=Auth|None to keyword-only
password/token, and forward them to AsyncDAVClient as password= plus an
explicit auth_type ("basic" or "bearer"). caldav then builds whichever
auth object its active backend needs (niquests.auth.HTTPBasicAuth or
httpx.BasicAuth), so we stay backend-agnostic.

Threaded raw credentials through NextcloudClient — added keyword-only
password/token to its __init__, and updated from_env, from_token, and
the four call sites that build NextcloudClient (context.py basic-auth
and Login Flow paths, auth/userinfo_routes.py, vector/oauth_sync.py).

Four new unit tests pin the construction wiring so the niquests
regression can't recur silently — basic, bearer, no-creds, and
password-precedence cases.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
Chris Coutinho
2026-04-26 16:52:58 +02:00
co-authored by Claude Opus 4.7
parent 4e669781ee
commit 2f1b0d2500
6 changed files with 156 additions and 9 deletions
+2
View File
@@ -148,6 +148,7 @@ def _get_client_from_basic_auth(ctx: Context) -> NextcloudClient:
base_url=settings.nextcloud_host,
username=username,
auth=BasicAuth(username, password),
password=password,
)
@@ -196,4 +197,5 @@ async def _get_client_from_login_flow(
base_url=nextcloud_host,
username=username,
auth=BasicAuth(username, app_data["app_password"]),
password=app_data["app_password"],
)