use std::collections::HashSet;
use dpp_domain::Audience;
pub trait TrustedIssuerRegistry: Send + Sync {
fn is_trusted_for_audience(&self, issuer_did: &str, audience: Audience) -> bool;
}
pub struct StaticTrustedIssuers {
legitimate_interest_dids: HashSet<String>,
authority_dids: HashSet<String>,
}
impl StaticTrustedIssuers {
pub fn new(
legitimate_interest_dids: impl IntoIterator<Item = impl Into<String>>,
authority_dids: impl IntoIterator<Item = impl Into<String>>,
) -> Self {
Self {
legitimate_interest_dids: legitimate_interest_dids
.into_iter()
.map(Into::into)
.collect(),
authority_dids: authority_dids.into_iter().map(Into::into).collect(),
}
}
pub fn single(trusted_did: impl Into<String>) -> Self {
let did = trusted_did.into();
Self {
legitimate_interest_dids: HashSet::from([did.clone()]),
authority_dids: HashSet::from([did]),
}
}
}
impl TrustedIssuerRegistry for StaticTrustedIssuers {
fn is_trusted_for_audience(&self, issuer_did: &str, audience: Audience) -> bool {
match audience {
Audience::Public => true,
Audience::LegitimateInterest => {
self.legitimate_interest_dids.contains(issuer_did)
|| self.authority_dids.contains(issuer_did)
}
Audience::Authority => self.authority_dids.contains(issuer_did),
_ => false,
}
}
}
pub struct AllowAllIssuers;
impl TrustedIssuerRegistry for AllowAllIssuers {
fn is_trusted_for_audience(&self, _issuer_did: &str, _audience: Audience) -> bool {
true
}
}