harness-providers: auth.json credential storage (M3)

- auth.rs: AuthRecord (OAuth {access, refresh, expires} | Api {key}) with
  is_expired(now, skew) honoring expires==0 = never; AuthStorage keyed by
  provider id over ~/.local/share/ai-harness/auth.json.
- Read-modify-write on every op so concurrent refresh/login don't clobber;
  writes go through a temp-file rename set to 0600 (unix) to avoid truncated
  auth files.
- 6 tempdir tests: missing→empty, set/get/overwrite, multi-provider coexist,
  scoped remove (+ no-op on absent), expiry skew/never, 0600 perms.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
2026-07-08 23:37:34 +02:00
co-authored by Claude Opus 4.8
parent e2706a1560
commit 39d62348d8
4 changed files with 234 additions and 0 deletions
Generated
+2
View File
@@ -723,12 +723,14 @@ dependencies = [
"async-stream",
"async-trait",
"bytes",
"dirs",
"eventsource-stream",
"futures",
"harness-core",
"reqwest",
"serde",
"serde_json",
"tempfile",
"thiserror 2.0.18",
"tokio",
"tokio-util",