use affinidi_tdk::messaging::ATM;
use vti_common::vault::VaultSecret;
pub enum UnsealError {
UnpackFailed(String),
MissingSender,
SenderMismatch { sender: String, caller: String },
CleartextInvalid(String),
}
pub async fn unseal_secret(
atm: &ATM,
caller_did: &str,
jwe: &str,
) -> Result<VaultSecret, UnsealError> {
let (msg, _metadata) = atm
.unpack(jwe)
.await
.map_err(|e| UnsealError::UnpackFailed(e.to_string()))?;
let sender = msg
.from
.as_deref()
.map(|s| s.split('#').next().unwrap_or(s).to_string())
.ok_or(UnsealError::MissingSender)?;
if sender != caller_did {
return Err(UnsealError::SenderMismatch {
sender,
caller: caller_did.to_string(),
});
}
serde_json::from_value(msg.body).map_err(|e| UnsealError::CleartextInvalid(e.to_string()))
}