summaryrefslogtreecommitdiff
path: root/src/cmd/init.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/cmd/init.rs')
-rw-r--r--src/cmd/init.rs33
1 files changed, 33 insertions, 0 deletions
diff --git a/src/cmd/init.rs b/src/cmd/init.rs
new file mode 100644
index 0000000..5950fbb
--- /dev/null
+++ b/src/cmd/init.rs
@@ -0,0 +1,33 @@
+//! The `init` subcommand.
+
+use crate::config::ClientConfig;
+use crate::error::ObnamError;
+use crate::passwords::{passwords_filename, Passwords};
+use clap::Parser;
+
+const PROMPT: &str = "Obnam passphrase: ";
+
+/// Initialize client by setting passwords.
+#[derive(Debug, Parser)]
+pub struct Init {
+ /// Only for testing.
+ #[clap(long)]
+ insecure_passphrase: Option<String>,
+}
+
+impl Init {
+ /// Run the command.
+ pub fn run(&self, config: &ClientConfig) -> Result<(), ObnamError> {
+ let passphrase = match &self.insecure_passphrase {
+ Some(x) => x.to_string(),
+ None => rpassword::prompt_password(PROMPT).unwrap(),
+ };
+
+ let passwords = Passwords::new(&passphrase);
+ let filename = passwords_filename(&config.filename);
+ passwords
+ .save(&filename)
+ .map_err(|err| ObnamError::PasswordSave(filename, err))?;
+ Ok(())
+ }
+}