use std::path::PathBuf;
use clap::Parser;
use crate::cli::Result;
#[derive(Debug, Clone, Parser)]
#[clap(about = "Generate a new signing key to sign files")]
pub struct Options {
#[clap(long, env = "CARGO_PACKAGER_SIGN_PRIVATE_KEY_PASSWORD")]
password: Option<String>,
#[clap(long)]
path: Option<PathBuf>,
#[clap(short, long)]
force: bool,
#[clap(long)]
ci: bool,
}
pub fn command(mut options: Options) -> Result<()> {
options.ci = options.ci || std::env::var("CI").is_ok();
if options.ci && options.password.is_none() {
tracing::warn!("Generating a new private key without a password, for security reasons, we recommend setting a password instead.");
options.password.replace("".into());
}
tracing::info!("Generating a new signing key.");
let keypair = crate::sign::generate_key(options.password)?;
match options.path {
Some(path) => {
let keys = crate::sign::save_keypair(&keypair, path, options.force)?;
tracing::info!(
"Finished generating and saving the keys:\n {}\n {}",
keys.0.display(),
keys.1.display()
);
}
None => {
tracing::info!("Finished generating secret key:\n{}", keypair.sk);
tracing::info!("Finished generating public key:\n{}", keypair.pk);
}
}
Ok(())
}