feat: add Linux OAuth adapters

Add a bounded libcurl transport with verified TLS, no redirects or retries, sanitized failures, binary-safe requests, and resolved-address enforcement for cleartext loopback traffic.

Add shell-free xdg-open launching and a one-shot IPv4 loopback callback receiver with strict HTTP/query parsing, deadlines, fixed callback path, and RAII cleanup. Token parsing, Secret Service, and Graph remain follow-up phases.
This commit is contained in:
2026-07-18 11:33:06 +01:00
parent dd6e02cb55
commit 295acbc125
12 changed files with 2095 additions and 28 deletions

View File

@@ -132,11 +132,23 @@ or expected.
The generic HTTP boundary uses injected transports and deterministic fakes. It
does not retry requests: provider code must later make retry decisions with the
operation's idempotency and server response in view. This remains foundation,
not working Office 365 integration. There is no concrete HTTP transport,
browser/loopback adapter, token JSON parser, Secret Service backend, Graph call,
or usable account setup yet. OAuth tokens and other secrets will never be
stored in SQLite; they belong in the Freedesktop Secret Service. The next
implementation sequence is concrete desktop, HTTP, and Secret Service adapters,
followed by read-only Microsoft Graph calendar discovery and delta
synchronization.
operation's idempotency and server response in view. The concrete Linux adapter
uses libcurl with TLS verification and bounded
responses and timeouts, and neither automatic redirects nor retries. Cleartext
HTTP is limited to loopback tests. Browser launch executes `xdg-open` directly,
never through a shell.
The loopback receiver binds only `127.0.0.1`, advertises a dynamic-port
`localhost` URL at the fixed `/nocal/oauth/callback` path, and accepts one
bounded callback. Register Nocal in Entra as a Mobile and desktop public client
with `http://localhost/nocal/oauth/callback`. Microsoft documents that the port
is ignored when matching a `localhost` redirect, allowing a fresh local port;
an HTTP `127.0.0.1` redirect requires manifest editing, while IPv6 loopback
redirects are currently unsupported.
This remains foundation, not working Office 365 integration. There is no token
JSON parser, Secret Service backend, Graph call, account UI, or usable account
setup yet. OAuth tokens and other secrets will never be stored in SQLite. The
synchronous libsecret API may block, so its concrete adapter will run off the
render thread in the next phase. Read-only Microsoft Graph calendar discovery and delta
synchronization follows that token and secret-storage work.