use std::fs;
use std::path::Path;
use assert_cmd::Command;
pub fn murk_bin(home: &Path) -> Command {
let mut cmd = Command::cargo_bin("murk").unwrap();
cmd.env("HOME", home)
.env("XDG_RUNTIME_DIR", home)
.env_remove("MURK_KEY")
.env_remove("MURK_KEY_FILE");
cmd
}
pub fn murk(dir: impl AsRef<Path>, key: &str) -> Command {
let dir = dir.as_ref();
let mut cmd = murk_bin(dir);
cmd.current_dir(dir).env("MURK_KEY", key);
cmd
}
pub fn init_vault(dir: impl AsRef<Path>) -> (String, String) {
let dir = dir.as_ref();
murk_bin(dir)
.args(["init", "--vault", "test.murk"])
.current_dir(dir)
.write_stdin("testuser\n")
.assert()
.success();
let env_contents = fs::read_to_string(dir.join(".env")).unwrap();
let murk_key = if let Some(path) = env_contents.lines().find_map(|l| {
l.strip_prefix("export MURK_KEY_FILE=")
.or_else(|| l.strip_prefix("MURK_KEY_FILE="))
}) {
let path = path.trim().trim_matches('\'');
fs::read_to_string(path).unwrap().trim().to_string()
} else if let Some(key) = env_contents.lines().find_map(|l| {
l.strip_prefix("export MURK_KEY=")
.or_else(|| l.strip_prefix("MURK_KEY="))
}) {
key.to_string()
} else {
panic!("no MURK_KEY or MURK_KEY_FILE found in .env");
};
assert!(murk_key.starts_with("AGE-SECRET-KEY-"));
let identity: age::x25519::Identity = murk_key.parse().unwrap();
let pubkey = identity.to_public().to_string();
(murk_key, pubkey)
}