fix: proxy passwords and TOTP seeds live only in the secret store

SshConfig no longer has proxyPassword or totpSecret fields, so neither
can sit in clear in nexus.db or travel in an export. The proxy password
is a SecretKind (profile:<id>:proxy-password) edited like other saved
credentials and purged with the profile; the session manager hands both
it and the TOTP seed to the SSH client from the keychain/vault at
connect time.

This drops compatibility with Go-era profiles and .link/.nexus files
that carry these values inline: they are ignored on read and must be
re-entered (SEC-20261012-011).
This commit is contained in:
Andy Dixon
2026-10-12 10:02:08 +01:00
parent 2e11d40034
commit 672c71e26f
7 changed files with 39 additions and 25 deletions
+4 -1
View File
@@ -30,12 +30,13 @@ pub enum SecretKind {
IrcNickServPassword,
IrcSshPassword,
IrcSshPassphrase,
ProxyPassword,
}
impl SecretKind {
/// Every kind, so deleting a profile can purge them all from the keychain. A new variant
/// must be added here as well as to `as_str`.
pub const ALL: [SecretKind; 11] = [
pub const ALL: [SecretKind; 12] = [
Self::Password,
Self::Passphrase,
Self::Totp,
@@ -47,6 +48,7 @@ impl SecretKind {
Self::IrcNickServPassword,
Self::IrcSshPassword,
Self::IrcSshPassphrase,
Self::ProxyPassword,
];
/// The storage name, shared with the Go app.
@@ -63,6 +65,7 @@ impl SecretKind {
Self::IrcNickServPassword => "irc-nickserv-password",
Self::IrcSshPassword => "irc-ssh-password",
Self::IrcSshPassphrase => "irc-ssh-passphrase",
Self::ProxyPassword => "proxy-password",
}
}