From 0d0d354d557f5c13ef836c5d5c3001998ee8ba1c Mon Sep 17 00:00:00 2001 From: Alexis Sellier Date: Thu, 29 Jun 2023 15:02:08 +0200 Subject: [PATCH] cli: Ask for passphrase upfront in `node start` --- radicle-cli/src/commands/node/control.rs | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/radicle-cli/src/commands/node/control.rs b/radicle-cli/src/commands/node/control.rs index 16deed12..ecca8695 100644 --- a/radicle-cli/src/commands/node/control.rs +++ b/radicle-cli/src/commands/node/control.rs @@ -4,12 +4,20 @@ use std::io::{BufRead, BufReader, Read, Seek, SeekFrom}; use std::time::Duration; use std::{process, thread}; +use anyhow::Context as _; + use radicle::node::{Address, Handle as _, NodeId}; +use radicle::profile; use radicle::Node; use crate::terminal as term; pub fn start(daemon: bool, options: Vec) -> anyhow::Result<()> { + // Ask passphrase here, otherwise it'll be a fatal error when running the daemon + // without `RAD_PASSPHRASE`. To keep things consistent, we also use this in foreground mode. + let passphrase = term::io::passphrase(profile::env::RAD_PASSPHRASE) + .context(format!("`{}` must be set", profile::env::RAD_PASSPHRASE))?; + if daemon { let home = radicle::profile::home()?; let log = OpenOptions::new() @@ -18,6 +26,7 @@ pub fn start(daemon: bool, options: Vec) -> anyhow::Result<()> { .open(home.node().join("node.log"))?; process::Command::new("radicle-node") .args(options) + .env(profile::env::RAD_PASSPHRASE, passphrase) .stdin(process::Stdio::null()) .stdout(process::Stdio::from(log)) .stderr(process::Stdio::null()) @@ -25,6 +34,7 @@ pub fn start(daemon: bool, options: Vec) -> anyhow::Result<()> { } else { let mut child = process::Command::new("radicle-node") .args(options) + .env(profile::env::RAD_PASSPHRASE, passphrase) .spawn()?; child.wait()?;