diff --git a/radicle-cli/src/commands/node/control.rs b/radicle-cli/src/commands/node/control.rs index 2f9cec5b..82ff72c2 100644 --- a/radicle-cli/src/commands/node/control.rs +++ b/radicle-cli/src/commands/node/control.rs @@ -81,14 +81,14 @@ pub fn logs(lines: usize, follow: Option, profile: &Profile) -> let logs = profile.home.node().join("node.log"); let mut file = BufReader::new(File::open(logs)?); - file.seek(SeekFrom::End(-1))?; + file.seek(SeekFrom::End(0))?; let mut tail = Vec::new(); let mut nlines = 0; - for i in (0..=file.stream_position()?).rev() { + for i in (1..=file.stream_position()?).rev() { let mut buf = [0; 1]; - file.seek(SeekFrom::Start(i))?; + file.seek(SeekFrom::Start(i - 1))?; file.read_exact(&mut buf)?; if buf[0] == b'\n' { diff --git a/radicle-crypto/src/ssh/keystore.rs b/radicle-crypto/src/ssh/keystore.rs index 93bc53b9..b29ee938 100644 --- a/radicle-crypto/src/ssh/keystore.rs +++ b/radicle-crypto/src/ssh/keystore.rs @@ -153,6 +153,8 @@ pub enum MemorySignerError { Keystore(#[from] Error), #[error("key not found in '{0}'")] NotFound(PathBuf), + #[error("invalid passphrase")] + InvalidPassphrase, } /// An in-memory signer that keeps its secret key internally @@ -217,7 +219,14 @@ impl MemorySigner { .public_key()? .ok_or_else(|| MemorySignerError::NotFound(keystore.path().to_path_buf()))?; let secret = keystore - .secret_key(passphrase)? + .secret_key(passphrase) + .map_err(|e| { + if e.is_crypto_err() { + MemorySignerError::InvalidPassphrase + } else { + e.into() + } + })? .ok_or_else(|| MemorySignerError::NotFound(keystore.path().to_path_buf()))?; Ok(Self { public, secret }) diff --git a/radicle-node/src/main.rs b/radicle-node/src/main.rs index 8b41040d..b3779919 100644 --- a/radicle-node/src/main.rs +++ b/radicle-node/src/main.rs @@ -1,7 +1,7 @@ use std::io; use std::{env, fs, net, process}; -use anyhow::anyhow; +use anyhow::{anyhow, Context}; use crossbeam_channel as chan; use cyphernet::addr::PeerAddr; use localtime::LocalDuration; @@ -142,7 +142,7 @@ fn execute() -> anyhow::Result<()> { let passphrase = profile::env::passphrase(); let keystore = Keystore::new(&home.keys()); - let signer = MemorySigner::load(&keystore, passphrase)?; + let signer = MemorySigner::load(&keystore, passphrase).context("couldn't load secret key")?; log::info!(target: "node", "Node ID is {}", signer.public_key());