use anyhow::Context as _;
use itertools::Itertools;
use std::time::{SystemTime, Duration};
use crate::openpgp::KeyHandle;
use crate::openpgp::Packet;
use crate::openpgp::Result;
use crate::openpgp::armor::{Writer, Kind};
use crate::openpgp::cert::prelude::*;
use crate::openpgp::packet::prelude::*;
use crate::openpgp::packet::signature::subpacket::SubpacketTag;
use crate::openpgp::parse::Parse;
use crate::openpgp::policy::{Policy, HashAlgoSecurity};
use crate::openpgp::serialize::Serialize;
use crate::openpgp::types::KeyFlags;
use crate::openpgp::types::SignatureType;
use crate::{
open_or_stdin,
};
use crate::commands::get_primary_keys;
use crate::Config;
use crate::SECONDS_IN_YEAR;
use crate::parse_duration;
use crate::decrypt_key;
use crate::sq_cli::KeyCommand;
use crate::sq_cli::KeyGenerateCommand;
use crate::sq_cli::KeyPasswordCommand;
use crate::sq_cli::KeyUseridCommand;
use crate::sq_cli::KeyUseridAddCommand;
use crate::sq_cli::KeyUseridStripCommand;
use crate::sq_cli::KeyExtractCertCommand;
use crate::sq_cli::KeyAdoptCommand;
use crate::sq_cli::KeyAttestCertificationsCommand;
use crate::sq_cli::KeySubcommands::*;
pub fn dispatch(config: Config, command: KeyCommand) -> Result<()> {
match command.subcommand {
Generate(c) => generate(config, c)?,
Password(c) => password(config, c)?,
Userid(c) => userid(config, c)?,
ExtractCert(c) => extract_cert(config, c)?,
Adopt(c) => adopt(config, c)?,
AttestCertifications(c) => attest_certifications(config, c)?,
}
Ok(())
}
fn generate(config: Config, command: KeyGenerateCommand) -> Result<()> {
let mut builder = CertBuilder::new();
// User ID
match command.userid {
Some(uids) => for uid in uids {
builder = builder.add_userid(uid);
},
None => {
eprintln!("No user ID given, using direct key signature");
}
}
// Creation time.
if let Some(t) = command.creation_time {
builder = builder.set_creation_time(SystemTime::from(t.time));
};
// Expiration.
match (command.expires, command.expires_in) {
(None, None) => // Default expiration.
builder = builder.set_validity_period(
Some(Duration::new(3 * SECONDS_IN_YEAR, 0))),
(Some(t), None) if t == "never" =>
builder = builder.set_validity_period(None),
(Some(t), None) => {
let now = builder.creation_time()
.unwrap_or_else(std::time::SystemTime::now);
let expiration = SystemTime::from(
crate::parse_iso8601(&t, chrono::NaiveTime::from_hms(0, 0, 0))?);
let validity = expiration.duration_since(now)?;
builder = builder.set_creation_time(now)
.set_validity_period(validity);
},
(