diff --git a/src/cli/cli_args.rs b/src/cli/cli_args.rs index 5416b54..f925380 100644 --- a/src/cli/cli_args.rs +++ b/src/cli/cli_args.rs @@ -104,6 +104,13 @@ pub struct IntroducerRemoveCommand { help = "Certificate to be removed as introducer." )] pub cert: String, + + #[clap( + long = "demote", + help = "Remove introducing capabilities, but keep certificate authenticated.", + default_value_t = false, + )] + pub demote: bool, } // Local subcommands diff --git a/src/commands/introducer.rs b/src/commands/introducer.rs index 26e9889..90310c2 100644 --- a/src/commands/introducer.rs +++ b/src/commands/introducer.rs @@ -3,7 +3,7 @@ use anyhow::Result; use crate::cli::cli_args::{IntroducerCommand, IntroducerSubcommand}; use crate::config::HuskConfigContainer; use crate::types::husk_context::HuskContext; -use crate::crypto; +use crate::common::crypto; pub mod add; pub mod remove; @@ -14,7 +14,7 @@ pub async fn dispatch(cmd: IntroducerCommand, config: HuskConfigContainer) -> Re add::dispatch(add_cmd, config).await?; }, IntroducerSubcommand::Remove(rm_cmd) => { - remove::dispatch(rm_cmd, &config).await?; + remove::dispatch(rm_cmd, config).await?; }, IntroducerSubcommand::List => { println!("list"); diff --git a/src/commands/introducer/remove.rs b/src/commands/introducer/remove.rs index 8e05611..aaf4210 100644 --- a/src/commands/introducer/remove.rs +++ b/src/commands/introducer/remove.rs @@ -1,11 +1,30 @@ use anyhow::Result; -use crate::cli::cli_args::IntroducerRemoveCommand; -use crate::config::HuskConfigContainer; +use sequoia_openpgp::{Fingerprint, KeyHandle}; +use sequoia_cert_store::Store; -pub async fn dispatch(cmd: IntroducerRemoveCommand, _config: &HuskConfigContainer) -> Result<()> { +use crate::cli::cli_args::IntroducerRemoveCommand; +use crate::commands::CommandError; +use crate::config::HuskConfigContainer; +use crate::types::husk_context::HuskContext; +use crate::types::introducer::Introducer; + +pub async fn dispatch(cmd: IntroducerRemoveCommand, config: HuskConfigContainer) -> Result<()> { println!("remove"); println!(" {:?}", cmd.cert); + println!(" {:?}", cmd.demote); + + let context = HuskContext::new(&config.into())?; + let policy = &context.policy; + let cert_store = &context.cert_store; + + // Get the certificate + let fpr = Fingerprint::from_hex(&cmd.cert)?; + let certs = cert_store.lookup_by_cert(&KeyHandle::try_from(&fpr)?) + .map_err(|_| CommandError::CertNotFound(fpr.clone()))?; + + + Ok(()) } diff --git a/src/crypto.rs b/src/common/crypto.rs similarity index 99% rename from src/crypto.rs rename to src/common/crypto.rs index 204fccc..994e59c 100644 --- a/src/crypto.rs +++ b/src/common/crypto.rs @@ -1,8 +1,4 @@ -// -// Husk milter -// -// cryptographic functions -// +//! cryptographic functions use std::io::Write; use std::sync::Arc; diff --git a/src/common/mod.rs b/src/common/mod.rs index 46e0349..b390873 100644 --- a/src/common/mod.rs +++ b/src/common/mod.rs @@ -1 +1,2 @@ +pub mod crypto; pub mod escape; diff --git a/src/daemon/mod.rs b/src/daemon/mod.rs index 22266f1..5826960 100644 --- a/src/daemon/mod.rs +++ b/src/daemon/mod.rs @@ -1,8 +1,4 @@ -// -// Husk milter -// -// the actual daemon -// +//! the actual daemon use anyhow; use bytes::Bytes; @@ -25,7 +21,7 @@ use indymilter::{ use crate::types::husk_context::HuskContext; use crate::config::{HuskConfig, HuskConfigContainer}; use crate::mail; -use crate::crypto; +use crate::common::crypto; use crate::types::mail_context::ProtectionPossibility; pub struct Daemon { } diff --git a/src/main.rs b/src/main.rs index f840387..b1df41c 100644 --- a/src/main.rs +++ b/src/main.rs @@ -14,7 +14,6 @@ pub mod commands; pub mod config; use config::{HuskConfig, HuskConfigContainer}; pub mod types; -pub mod crypto; pub mod mail; pub mod daemon; use daemon::Daemon; diff --git a/src/types/defaults.rs b/src/types/defaults.rs index 404cae8..b645273 100644 --- a/src/types/defaults.rs +++ b/src/types/defaults.rs @@ -1,5 +1,3 @@ -// -// Some defaults -// +//! Defaults pub const CONFIG_FILE_LOCATION: &'static str = "/etc/husk/config.toml"; diff --git a/src/types/errors.rs b/src/types/errors.rs index ce92b0b..58fd52b 100644 --- a/src/types/errors.rs +++ b/src/types/errors.rs @@ -1,8 +1,4 @@ -// -// Husk milter -// -// Error typ -// +//! Error typ use thiserror::Error; diff --git a/src/types/husk_context.rs b/src/types/husk_context.rs index e93229d..f124801 100644 --- a/src/types/husk_context.rs +++ b/src/types/husk_context.rs @@ -1,8 +1,6 @@ -// -// Husk milter -// -// Context -// +//! HuskContext +//! +//! Keep data in HuskContext while processing a mail. use anyhow; use sequoia_openpgp::policy::StandardPolicy; @@ -11,7 +9,8 @@ use sequoia_openpgp::Cert; use sequoia_cert_store::CertStore; use sequoia_directories::Home; -use crate::{config::HuskConfig, crypto}; +use crate::config::HuskConfig; +use crate::common::crypto; use crate::types::mail_context::MailContext; use crate::types::introducer::Introducer; diff --git a/src/types/introducer.rs b/src/types/introducer.rs index 71c3559..efaac37 100644 --- a/src/types/introducer.rs +++ b/src/types/introducer.rs @@ -1,11 +1,6 @@ -// -// husk-milter -// -// introducers -// +//! introducers use std::sync::Arc; -use std::collections::HashSet; use anyhow::Result; diff --git a/src/types/mail_context.rs b/src/types/mail_context.rs index bd126b4..b622f6f 100644 --- a/src/types/mail_context.rs +++ b/src/types/mail_context.rs @@ -1,8 +1,4 @@ -// -// Husk milter -// -// Mail Context -// +//! Mail Context use std::sync::Arc; use bytes::{Bytes, BytesMut}; diff --git a/src/types/recipient.rs b/src/types/recipient.rs index 2dddddb..b803fac 100644 --- a/src/types/recipient.rs +++ b/src/types/recipient.rs @@ -1,8 +1,4 @@ -// -// Husk milter -// -// Recipient -// +//! Recipient use anyhow; use std::sync::Arc;