use crate::error::JacsError;
use crate::simple::{SignedDocument, VerificationResult};
pub(crate) mod attachment;
pub(crate) mod canonicalize;
mod sign;
mod verify;
pub mod error;
pub use error::EmailError;
pub mod types;
pub use types::{
AttachmentEntry, BodyPartEntry, ChainEntry, ContentVerificationResult, EmailSignatureHeaders,
EmailSignaturePayload, FieldResult, FieldStatus, JacsEmailMetadata, JacsEmailSignature,
JacsEmailSignatureDocument, ParsedAttachment, ParsedBodyPart, ParsedEmailParts,
SignedHeaderEntry, VerifiedEmailDocument,
};
pub use sign::{canonicalize_json_rfc8785, sign_email};
pub use verify::{normalize_algorithm, verify_email, verify_email_content, verify_email_document};
pub use attachment::{add_jacs_attachment, get_jacs_attachment, remove_jacs_attachment};
pub use canonicalize::{canonicalize_header, extract_email_parts};
pub trait JacsSigner {
fn sign_message(&self, data: &serde_json::Value) -> Result<SignedDocument, JacsError>;
fn verify_with_key(
&self,
signed_document: &str,
public_key: Vec<u8>,
) -> Result<VerificationResult, JacsError>;
}
impl JacsSigner for crate::simple::SimpleAgent {
fn sign_message(&self, data: &serde_json::Value) -> Result<SignedDocument, JacsError> {
crate::simple::SimpleAgent::sign_message(self, data)
}
fn verify_with_key(
&self,
signed_document: &str,
public_key: Vec<u8>,
) -> Result<VerificationResult, JacsError> {
crate::simple::SimpleAgent::verify_with_key(self, signed_document, public_key)
}
}
#[cfg(test)]
pub(crate) static EMAIL_TEST_MUTEX: std::sync::Mutex<()> = std::sync::Mutex::new(());
#[cfg(test)]
pub(crate) struct EmailTestEnvGuard {
previous: Vec<(&'static str, Option<String>)>,
}
#[cfg(test)]
impl EmailTestEnvGuard {
pub(crate) fn set(vars: &[(&'static str, String)]) -> Self {
let mut previous = Vec::with_capacity(vars.len());
for (key, value) in vars {
let prior = std::env::var(key).ok();
previous.push((*key, prior));
unsafe {
std::env::set_var(key, value);
}
}
Self { previous }
}
}
#[cfg(test)]
impl Drop for EmailTestEnvGuard {
fn drop(&mut self) {
for (key, value) in &self.previous {
unsafe {
match value {
Some(v) => std::env::set_var(key, v),
None => std::env::remove_var(key),
}
}
}
}
}