use anyhow::Result;
use sequoia_net::wkd;
use sequoia_net::Policy;
use sequoia_openpgp::serialize::SerializeInto;
use sequoia_openpgp::{Fingerprint, KeyID};
use tokio::runtime::Runtime;
use crate::db::models;
use crate::pgp;
use crate::Oca;
pub fn update_from_wkd(oca: &Oca, cert: &models::Cert) -> Result<bool> {
let rt = Runtime::new()?;
let emails = oca.emails_get(cert)?;
let orig = pgp::to_cert(cert.pub_cert.as_bytes())?;
let mut merged = orig.clone();
for email in emails {
let res = rt.block_on(async move { wkd::get(&email.addr).await });
if let Ok(certs) = res {
for c in certs {
if c.fingerprint() == Fingerprint::from_hex(&cert.fingerprint)? {
if let Ok(m) = merged.clone().merge_public(c) {
merged = m;
}
}
}
}
}
if merged != orig {
oca.storage.cert_update(&merged.to_vec()?)?;
Ok(true)
} else {
Ok(false)
}
}
pub fn update_from_hagrid(oca: &Oca, cert: &models::Cert) -> Result<bool> {
let fp = (cert.fingerprint).parse::<Fingerprint>()?;
let c = pgp::to_cert(cert.pub_cert.as_bytes())?;
let mut hagrid = sequoia_net::KeyServer::keys_openpgp_org(Policy::Encrypted)?;
let rt = Runtime::new()?;
let update = rt.block_on(async move { hagrid.get(&KeyID::from(fp)).await })?;
if let Ok(merged) = c.clone().merge_public(update) {
if merged != c {
oca.storage.cert_update(&merged.to_vec()?)?;
return Ok(true);
}
}
Ok(false)
}