Commit 6115d17
authored
auth: silently fall back to plaintext when keyring is unreachable on login (#5181)
## Why
Today, when secure storage is selected but the OS keyring is unreachable
(no D-Bus on Linux, headless SSH, WSL1, locked keychain that hangs for
3s), `databricks auth login` errors out and tells the user to set
`DATABRICKS_AUTH_STORAGE=plaintext`. That is a hard wall for users who
do not know in advance whether their environment has a working keyring,
and the failure typically lands after the user has already completed the
browser flow.
The team agreed to aim for security by default, but do not block users
when the keyring is not available.
Scope of this PR: silent-fallback wiring for the auth login path, plus
probe and resolver-with-source plumbing. Pin-on-success across modes is
the correct end state but lands with **MS4** alongside the default flip
from plaintext to secure. Pinning today (default = plaintext) would
freeze every user into plaintext and neutralize MS4. Telemetry and the
`databricks auth storage <mode>` command are intentionally out of scope
and tracked separately.
## Changes
**Before:** `databricks auth login` with secure storage on a machine
without a keyring fails with an error after OAuth, regardless of how
secure was selected.
**Now:**
- **Default mode** today resolves to plaintext (unchanged). The
silent-fallback wiring in `applyLoginFallback` is dormant: the
`(mode=Secure, explicit=false, probe fail)` branch is unreachable
through the resolver until MS4 flips the default to secure. When that
flip happens, default users on a broken keyring fall back to file
silently and the fallback persists `auth_storage = plaintext` so
subsequent commands skip the (slow/blocking) probe.
- **Explicit secure** (env var, config, or override flag) + probe fail:
return a clear error. "I want secure" is honored strictly, never
silently downgraded.
This avoids the divergence GPT 5.5 review caught: writing the token to
file while leaving `auth_storage = secure` in config would make `auth
token` and bundle commands fail on the next call because they would
still resolve to secure and hit the unreachable keyring.
Implementation:
- `storage.ProbeKeyring()` performs a write+delete cycle with the
existing 3s timeout to detect a usable keyring without leaving stray
entries.
- `storage.ResolveStorageModeWithSource()` returns the resolved mode
plus whether it came from an explicit user choice (override / env /
config) versus the default.
- `storage.ResolveCacheForLogin()` wraps the resolver. For
default-secure + probe failure it falls back; for explicit-secure +
probe failure it returns an error; for any non-secure mode it skips the
probe entirely.
- `databrickscfg.SetConfiguredAuthStorage()` writes the key under
`[__settings__]`, mirroring `SetDefaultProfile`. Used by the
silent-fallback persist.
- `cmd/auth/login.go` swaps `ResolveCache` for `ResolveCacheForLogin`.
Read paths (`auth token`, bundle commands) keep the original keyring
error so they do not silently mint plaintext copies of tokens that live
in the keyring on another machine.
## Test plan
- [x] Unit: `ProbeKeyring` success cleans up after itself; Set/Delete
error and Set timeout each propagate.
- [x] Unit: `ResolveStorageModeWithSource` returns `explicit=false` for
default and `explicit=true` for override / env / config.
- [x] Unit: `applyLoginFallback` falls back and persists `auth_storage =
plaintext` for default-secure + probe fail.
- [x] Unit: `applyLoginFallback` returns a "secure storage was
requested" error for explicit-secure + probe fail, and does not write
config.
- [x] Unit: `resolveCacheForLoginWith` errors out for explicit secure
(env, config, override) when the probe fails.
- [x] Unit: `SetConfiguredAuthStorage` creates the file/section as
needed and preserves `default_profile`.
- [x] `./task checks` clean
- [x] `./task lint-q` 0 issues
- [x] All `cmd/auth`, `libs/auth/storage`, `libs/databrickscfg` unit
tests pass
- [x] All `acceptance/cmd/auth/storage-modes` and
`acceptance/cmd/auth/login` acceptance tests pass
This pull request and its description were written by Isaac.1 parent ef90f53 commit 6115d17
9 files changed
Lines changed: 481 additions & 14 deletions
File tree
- cmd/auth
- libs
- auth/storage
- databrickscfg
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
146 | 146 | | |
147 | 147 | | |
148 | 148 | | |
149 | | - | |
| 149 | + | |
| 150 | + | |
| 151 | + | |
| 152 | + | |
| 153 | + | |
150 | 154 | | |
151 | 155 | | |
152 | 156 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
4 | 4 | | |
5 | 5 | | |
6 | 6 | | |
| 7 | + | |
| 8 | + | |
| 9 | + | |
7 | 10 | | |
8 | 11 | | |
9 | 12 | | |
| |||
12 | 15 | | |
13 | 16 | | |
14 | 17 | | |
15 | | - | |
16 | | - | |
| 18 | + | |
| 19 | + | |
| 20 | + | |
17 | 21 | | |
18 | 22 | | |
19 | 23 | | |
20 | 24 | | |
21 | 25 | | |
22 | | - | |
23 | | - | |
| 26 | + | |
| 27 | + | |
| 28 | + | |
24 | 29 | | |
25 | 30 | | |
26 | 31 | | |
| |||
38 | 43 | | |
39 | 44 | | |
40 | 45 | | |
| 46 | + | |
| 47 | + | |
| 48 | + | |
| 49 | + | |
| 50 | + | |
| 51 | + | |
| 52 | + | |
| 53 | + | |
| 54 | + | |
| 55 | + | |
| 56 | + | |
| 57 | + | |
| 58 | + | |
| 59 | + | |
| 60 | + | |
| 61 | + | |
| 62 | + | |
| 63 | + | |
| 64 | + | |
| 65 | + | |
| 66 | + | |
| 67 | + | |
| 68 | + | |
| 69 | + | |
41 | 70 | | |
42 | 71 | | |
43 | 72 | | |
| |||
73 | 102 | | |
74 | 103 | | |
75 | 104 | | |
| 105 | + | |
| 106 | + | |
| 107 | + | |
| 108 | + | |
| 109 | + | |
| 110 | + | |
| 111 | + | |
| 112 | + | |
| 113 | + | |
| 114 | + | |
| 115 | + | |
| 116 | + | |
| 117 | + | |
| 118 | + | |
| 119 | + | |
| 120 | + | |
| 121 | + | |
| 122 | + | |
| 123 | + | |
| 124 | + | |
| 125 | + | |
| 126 | + | |
| 127 | + | |
| 128 | + | |
| 129 | + | |
| 130 | + | |
| 131 | + | |
| 132 | + | |
| 133 | + | |
| 134 | + | |
| 135 | + | |
| 136 | + | |
| 137 | + | |
| 138 | + | |
| 139 | + | |
| 140 | + | |
| 141 | + | |
| 142 | + | |
| 143 | + | |
| 144 | + | |
| 145 | + | |
| 146 | + | |
| 147 | + | |
| 148 | + | |
| 149 | + | |
| 150 | + | |
| 151 | + | |
| 152 | + | |
| 153 | + | |
| 154 | + | |
| 155 | + | |
| 156 | + | |
| 157 | + | |
| 158 | + | |
| 159 | + | |
| 160 | + | |
| 161 | + | |
| 162 | + | |
| 163 | + | |
| 164 | + | |
| 165 | + | |
| 166 | + | |
| 167 | + | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
3 | 3 | | |
4 | 4 | | |
5 | 5 | | |
| 6 | + | |
6 | 7 | | |
7 | 8 | | |
8 | 9 | | |
| 10 | + | |
9 | 11 | | |
10 | 12 | | |
11 | 13 | | |
| |||
24 | 26 | | |
25 | 27 | | |
26 | 28 | | |
27 | | - | |
28 | | - | |
| 29 | + | |
| 30 | + | |
| 31 | + | |
29 | 32 | | |
30 | 33 | | |
31 | 34 | | |
| |||
106 | 109 | | |
107 | 110 | | |
108 | 111 | | |
109 | | - | |
110 | | - | |
| 112 | + | |
| 113 | + | |
| 114 | + | |
111 | 115 | | |
112 | 116 | | |
113 | 117 | | |
| |||
116 | 120 | | |
117 | 121 | | |
118 | 122 | | |
| 123 | + | |
| 124 | + | |
| 125 | + | |
| 126 | + | |
| 127 | + | |
| 128 | + | |
| 129 | + | |
| 130 | + | |
| 131 | + | |
| 132 | + | |
| 133 | + | |
| 134 | + | |
| 135 | + | |
| 136 | + | |
| 137 | + | |
| 138 | + | |
| 139 | + | |
| 140 | + | |
| 141 | + | |
| 142 | + | |
| 143 | + | |
| 144 | + | |
| 145 | + | |
| 146 | + | |
| 147 | + | |
| 148 | + | |
| 149 | + | |
| 150 | + | |
| 151 | + | |
| 152 | + | |
| 153 | + | |
| 154 | + | |
| 155 | + | |
| 156 | + | |
| 157 | + | |
| 158 | + | |
| 159 | + | |
| 160 | + | |
| 161 | + | |
| 162 | + | |
| 163 | + | |
| 164 | + | |
| 165 | + | |
| 166 | + | |
| 167 | + | |
| 168 | + | |
| 169 | + | |
| 170 | + | |
| 171 | + | |
| 172 | + | |
| 173 | + | |
| 174 | + | |
| 175 | + | |
| 176 | + | |
| 177 | + | |
| 178 | + | |
| 179 | + | |
| 180 | + | |
| 181 | + | |
| 182 | + | |
| 183 | + | |
| 184 | + | |
| 185 | + | |
| 186 | + | |
| 187 | + | |
| 188 | + | |
| 189 | + | |
| 190 | + | |
| 191 | + | |
| 192 | + | |
| 193 | + | |
| 194 | + | |
| 195 | + | |
| 196 | + | |
| 197 | + | |
| 198 | + | |
| 199 | + | |
| 200 | + | |
| 201 | + | |
| 202 | + | |
| 203 | + | |
| 204 | + | |
| 205 | + | |
| 206 | + | |
| 207 | + | |
| 208 | + | |
| 209 | + | |
| 210 | + | |
| 211 | + | |
| 212 | + | |
| 213 | + | |
| 214 | + | |
| 215 | + | |
| 216 | + | |
| 217 | + | |
| 218 | + | |
| 219 | + | |
| 220 | + | |
| 221 | + | |
| 222 | + | |
| 223 | + | |
| 224 | + | |
| 225 | + | |
| 226 | + | |
| 227 | + | |
| 228 | + | |
| 229 | + | |
| 230 | + | |
| 231 | + | |
| 232 | + | |
| 233 | + | |
| 234 | + | |
119 | 235 | | |
120 | 236 | | |
121 | 237 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
8 | 8 | | |
9 | 9 | | |
10 | 10 | | |
| 11 | + | |
11 | 12 | | |
12 | 13 | | |
13 | 14 | | |
| |||
17 | 18 | | |
18 | 19 | | |
19 | 20 | | |
| 21 | + | |
| 22 | + | |
| 23 | + | |
| 24 | + | |
| 25 | + | |
| 26 | + | |
| 27 | + | |
| 28 | + | |
20 | 29 | | |
21 | 30 | | |
22 | 31 | | |
| |||
79 | 88 | | |
80 | 89 | | |
81 | 90 | | |
| 91 | + | |
| 92 | + | |
| 93 | + | |
| 94 | + | |
| 95 | + | |
| 96 | + | |
| 97 | + | |
| 98 | + | |
| 99 | + | |
| 100 | + | |
| 101 | + | |
| 102 | + | |
| 103 | + | |
| 104 | + | |
| 105 | + | |
| 106 | + | |
| 107 | + | |
| 108 | + | |
| 109 | + | |
| 110 | + | |
| 111 | + | |
| 112 | + | |
| 113 | + | |
| 114 | + | |
| 115 | + | |
| 116 | + | |
| 117 | + | |
| 118 | + | |
| 119 | + | |
82 | 120 | | |
83 | 121 | | |
84 | 122 | | |
| |||
0 commit comments