use anyhow::Context as _;
use itertools::Itertools;
use std::time::{SystemTime, Duration};
use sequoia_openpgp as openpgp;
use openpgp::KeyHandle;
use openpgp::Packet;
use openpgp::Result;
use openpgp::armor::{Writer, Kind};
use openpgp::cert::prelude::*;
use openpgp::packet::prelude::*;
use openpgp::packet::signature::subpacket::SubpacketTag;
use openpgp::parse::Parse;
use openpgp::policy::{Policy, HashAlgoSecurity};
use openpgp::serialize::Serialize;
use openpgp::types::KeyFlags;
use 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;
pub fn dispatch(config: Config, command: sq_cli::key::Command) -> Result<()> {
use sq_cli::key::Subcommands::*;
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: sq_cli::key::GenerateCommand,
) -> 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);
},
(None, Some(d)) if d == "never" =>
builder = builder.set_validity_period(None),
(None, Some(d)) => {
let d = parse_duration(&d)?;
builder = builder.set_validity_period(