cli: Make some UX improvements to `rad auth`
Better errors, messaging etc.
This commit is contained in:
parent
074b0e55c1
commit
1e948485be
|
|
@ -126,27 +126,23 @@ pub fn authenticate(options: Options, profile: &Profile) -> anyhow::Result<()> {
|
||||||
match ssh::agent::Agent::connect() {
|
match ssh::agent::Agent::connect() {
|
||||||
Ok(mut agent) => {
|
Ok(mut agent) => {
|
||||||
if agent.request_identities()?.contains(&profile.public_key) {
|
if agent.request_identities()?.contains(&profile.public_key) {
|
||||||
term::success!("Signing key already in ssh-agent");
|
term::success!("Radicle key already in ssh-agent");
|
||||||
return Ok(());
|
return Ok(());
|
||||||
}
|
}
|
||||||
|
|
||||||
term::headline(format!(
|
term::headline(format!(
|
||||||
"Authenticating as {}",
|
"Authenticating as 👾 {}",
|
||||||
term::format::Identity::new(profile).styled()
|
term::format::Identity::new(profile).styled()
|
||||||
));
|
));
|
||||||
|
|
||||||
// TODO: We should show the spinner on the passphrase prompt,
|
|
||||||
// otherwise it seems like the passphrase is valid even if it isn't.
|
|
||||||
term::warning("Adding your radicle key to ssh-agent...");
|
|
||||||
let passphrase = if options.stdin {
|
let passphrase = if options.stdin {
|
||||||
term::passphrase_stdin()
|
term::passphrase_stdin()
|
||||||
} else {
|
} else {
|
||||||
term::passphrase(RAD_PASSPHRASE)
|
term::passphrase(RAD_PASSPHRASE)
|
||||||
}?;
|
}?;
|
||||||
let spinner = term::spinner("Unlocking...");
|
|
||||||
register(&mut agent, profile, passphrase)?;
|
register(&mut agent, profile, passphrase)?;
|
||||||
spinner.finish();
|
|
||||||
term::success!("Radicle key added to ssh-agent");
|
term::success!("Radicle key added to {}", term::format::dim("ssh-agent"));
|
||||||
|
|
||||||
return Ok(());
|
return Ok(());
|
||||||
}
|
}
|
||||||
|
|
@ -173,7 +169,14 @@ pub fn register(
|
||||||
) -> anyhow::Result<()> {
|
) -> anyhow::Result<()> {
|
||||||
let secret = profile
|
let secret = profile
|
||||||
.keystore
|
.keystore
|
||||||
.secret_key(passphrase)?
|
.secret_key(passphrase)
|
||||||
|
.map_err(|e| {
|
||||||
|
if e.is_crypto_err() {
|
||||||
|
anyhow!("could not decrypt secret key: invalid passphrase")
|
||||||
|
} else {
|
||||||
|
e.into()
|
||||||
|
}
|
||||||
|
})?
|
||||||
.ok_or_else(|| anyhow!("Key not found in {:?}", profile.keystore.path()))?;
|
.ok_or_else(|| anyhow!("Key not found in {:?}", profile.keystore.path()))?;
|
||||||
|
|
||||||
agent.register(&secret)?;
|
agent.register(&secret)?;
|
||||||
|
|
|
||||||
|
|
@ -25,6 +25,13 @@ pub enum Error {
|
||||||
AlreadyInitialized,
|
AlreadyInitialized,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl Error {
|
||||||
|
/// Check if it's a decryption error.
|
||||||
|
pub fn is_crypto_err(&self) -> bool {
|
||||||
|
matches!(self, Self::Ssh(ssh_key::Error::Crypto))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// Stores keys on disk, in OpenSSH format.
|
/// Stores keys on disk, in OpenSSH format.
|
||||||
#[derive(Debug, Clone)]
|
#[derive(Debug, Clone)]
|
||||||
pub struct Keystore {
|
pub struct Keystore {
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue