diff --git a/CHANGELOG.md b/CHANGELOG.md index cac36f8..cd1c9ee 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,19 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +### Changed + +- **The libsecret backend is now documented as GNOME Keyring only** (#19). It was described + as working with "GNOME Keyring, KWallet's shim, any Secret Service implementation", which + testing disproved. KWallet's shim (`ksecretd`) fails unattended in two distinct ways: it does + not provide the `session` collection GNOME Keyring offers, so selecting it fails with + *"No such object path `/org/freedesktop/secrets/aliases/session`"*; and against the default + collection it raises a wallet-unlock prompt which, with no GUI, blocks the caller forever. + The README and the XML docs now say what is actually validated, and `KeyringCollection` + notes that `"session"` is a GNOME convenience rather than a portable value. Documentation + only — no behaviour change. The blocking-call defect the validation surfaced is tracked + separately in #74. + ### Fixed - **The Keychain backend could see another CLI's credentials** (#55). App scoping was a diff --git a/README.md b/README.md index 9a929ad..822fded 100644 --- a/README.md +++ b/README.md @@ -304,9 +304,22 @@ services.AddCredentialStore(opts => > ⚠️ **Experimental.** Requires a running Secret Service daemon — headless > containers and SSH-only servers typically don't have one, and operations -> will throw with a clear message. Primarily validated against GNOME -> Keyring on Ubuntu. `UseKeyring = true` on non-Linux platforms throws -> `PlatformNotSupportedException` at registration time. +> will throw with a clear message. `UseKeyring = true` on non-Linux platforms +> throws `PlatformNotSupportedException` at registration time. + +**Validated against GNOME Keyring only.** KWallet's Secret Service shim +(`ksecretd`) was tested and does *not* work unattended (see +[#19](https://github.com/StuartMeeks/NextIteration.SpectreConsole.Auth/issues/19)): + +- It does not provide the `session` collection that GNOME Keyring does, so + `KeyringCollection = "session"` fails outright with *"No such object path + `/org/freedesktop/secrets/aliases/session`"*. +- With the default collection it prompts to unlock the wallet. In a desktop KDE + session a user can answer that; with no GUI the call **blocks indefinitely**, + because libsecret's synchronous API is invoked without a cancellable. + +Treat KWallet as unsupported until that is addressed. Other Secret Service +implementations are untested. `UseKeyring` and `UseKeychain` are mutually exclusive — setting both throws. The file-based backend remains the default when neither is set. @@ -373,7 +386,7 @@ Everything else is transitive. ## Contributing -Issues and PRs welcome. Outstanding hardening is tracked in [GitHub issues](https://github.com/StuartMeeks/NextIteration.SpectreConsole.Auth/issues) — currently KWallet validation for the libsecret backend ([#19](https://github.com/StuartMeeks/NextIteration.SpectreConsole.Auth/issues/19)). +Issues and PRs welcome. Outstanding hardening is tracked in [GitHub issues](https://github.com/StuartMeeks/NextIteration.SpectreConsole.Auth/issues) — currently the libsecret backend blocking on a Secret Service prompt ([#74](https://github.com/StuartMeeks/NextIteration.SpectreConsole.Auth/issues/74)). When contributing code, please keep the zero-warning, fully-documented public surface. `TreatWarningsAsErrors` is on for a reason. diff --git a/src/NextIteration.SpectreConsole.Auth/CredentialStoreOptions.cs b/src/NextIteration.SpectreConsole.Auth/CredentialStoreOptions.cs index 861a191..552ab72 100644 --- a/src/NextIteration.SpectreConsole.Auth/CredentialStoreOptions.cs +++ b/src/NextIteration.SpectreConsole.Auth/CredentialStoreOptions.cs @@ -59,10 +59,11 @@ public sealed class CredentialStoreOptions /// registration. /// /// - /// The libsecret backend is marked experimental. Requires a - /// running Secret Service (GNOME Keyring, KWallet's shim, etc.); - /// headless containers typically lack one and registration will - /// surface a clear error. + /// The libsecret backend is marked experimental and is validated + /// against GNOME Keyring only — KWallet's shim was tested and does not work + /// unattended (see the remarks on LibsecretCredentialManager). Requires a + /// running Secret Service; headless containers typically lack one and + /// registration will surface a clear error. /// public bool UseKeyring { get; set; } @@ -76,6 +77,11 @@ public sealed class CredentialStoreOptions /// /// Secret Service collection that stored items are written to. /// Defaults to "default" (usually the user's login keyring). + /// + /// Note that "session" is a GNOME Keyring convenience and is not + /// universal: KWallet's shim does not provide it, so a value that works under + /// one Secret Service implementation may not under another (#19). + /// /// Set to "session" for the in-memory session keyring that /// always exists on a running Secret Service daemon — useful for /// CI environments where the login keyring has not been diff --git a/src/NextIteration.SpectreConsole.Auth/Persistence/Libsecret/LibsecretCredentialManager.cs b/src/NextIteration.SpectreConsole.Auth/Persistence/Libsecret/LibsecretCredentialManager.cs index 0319398..9a6d8e8 100644 --- a/src/NextIteration.SpectreConsole.Auth/Persistence/Libsecret/LibsecretCredentialManager.cs +++ b/src/NextIteration.SpectreConsole.Auth/Persistence/Libsecret/LibsecretCredentialManager.cs @@ -9,14 +9,22 @@ namespace NextIteration.SpectreConsole.Auth.Persistence.Libsecret /// /// implementation backed by the Secret /// Service API (libsecret). Each credential becomes a libsecret item in - /// the user's default keyring (GNOME Keyring, KWallet's shim, etc.). + /// the user's default keyring. /// /// /// - /// This backend is marked experimental. Tested against - /// gnome-keyring-daemon on Ubuntu; behaviour on other Secret - /// Service implementations (KWallet, kwallet-secrets, or the - /// pass shim) has not been verified. + /// This backend is marked experimental and is validated against + /// gnome-keyring-daemon only. + /// + /// + /// KWallet is not supported. Its Secret Service shim (ksecretd) was + /// tested and fails unattended in two ways (#19): it does not provide the + /// session collection GNOME Keyring offers, so selecting it fails with + /// No such object path '/org/freedesktop/secrets/aliases/session'; and against + /// the default collection it raises a wallet-unlock prompt, which with no GUI blocks + /// the calling thread forever because the synchronous libsecret entry points here are + /// invoked with a NULL GCancellable. Other Secret Service implementations are + /// untested. /// /// /// Requires a running Secret Service daemon. Headless containers and