Port sq key approvals list to the user ID designator framework.

- See #434.
This commit is contained in:
Neal H. Walfield 2024-11-13 16:29:39 +01:00
parent b203dacd00
commit c7795149c2
No known key found for this signature in database
GPG Key ID: 6863C9AD5B4D22D3
2 changed files with 23 additions and 25 deletions

View File

@ -13,6 +13,8 @@ use crate::cli::types::FileOrStdout;
use crate::cli::examples::*;
use crate::cli::types::cert_designator::*;
use crate::cli::types::UserIDDesignators;
use crate::cli::types::userid_designator;
#[derive(Debug, Subcommand)]
#[clap(
@ -99,29 +101,16 @@ pub struct ListCommand {
OneValue,
ApprovalsListDoc>,
#[command(flatten)]
pub userids: UserIDDesignators<
userid_designator::ExistingUserIDEmailNameArgs,
userid_designator::OptionalValue>,
#[clap(
long = "pending",
help = "List unapproved certifications",
)]
pub pending: bool,
#[clap(
long = "name",
help = "List certifications on this name user ID",
)]
pub names: Vec<String>,
#[clap(
long = "email",
help = "List certifications on this email address user ID",
)]
pub emails: Vec<String>,
#[clap(
long = "userid",
help = "List certifications on this user ID",
)]
pub userids: Vec<String>,
}
/// Documentation for the cert designators for the key approvals list

View File

@ -25,15 +25,23 @@ pub fn dispatch(sq: Sq, command: approvals::Command)
}
fn list(sq: Sq, cmd: approvals::ListCommand) -> Result<()> {
let cert =
sq.resolve_cert(&cmd.cert, sequoia_wot::FULLY_TRUSTED)?.0;
let vcert = cert.with_policy(sq.policy, sq.time)?;
let store = sq.cert_store_or_else()?;
let uid_filter = make_userid_filter(
&cmd.names, &cmd.emails, &cmd.userids)?;
for uid in vcert.userids().filter(uid_filter) {
let cert =
sq.resolve_cert(&cmd.cert, sequoia_wot::FULLY_TRUSTED)?.0;
let vcert = cert.with_policy(sq.policy, sq.time)?;
let userids = cmd.userids.resolve(&vcert)?;
// resolve returns ResolvedUserIDs, which contain UserIDs, but we
// need ValidUserIDAmalgamations.
let all = userids.is_empty();
let mut designated_userids = BTreeSet::from_iter(
userids.into_iter().map(|u| u.userid().clone()));
for uid in vcert.userids() {
if ! all && ! designated_userids.remove(uid.userid()) {
continue;
}
wprintln!(initial_indent = " - ", "{}",
String::from_utf8_lossy(uid.value()));
@ -89,6 +97,7 @@ fn list(sq: Sq, cmd: approvals::ListCommand) -> Result<()> {
});
}
}
assert!(designated_userids.is_empty());
Ok(())
}