use crate::common::{issuer_utils::IssClaim, policy_store::TrustedIssuer};
use super::IssuerConfig;
use ahash::{HashMap, HashMapExt};
use std::{
collections::HashSet,
sync::{Arc, RwLock},
};
const MUTEX_POISONED_ERR: &str =
"IssuerIndex RwLock poisoned due to another thread panicking while holding the lock";
pub(super) struct IssuerIndex {
issuer_idx: RwLock<HashMap<String, Arc<IssuerConfig>>>,
iss_index: RwLock<HashMap<IssClaim, Arc<IssuerConfig>>>,
}
impl IssuerIndex {
pub(super) fn new() -> Self {
Self {
issuer_idx: RwLock::new(HashMap::new()),
iss_index: RwLock::new(HashMap::new()),
}
}
pub(super) fn insert(&self, iss: IssClaim, config: IssuerConfig) {
let issuer_id = config.issuer_id.clone();
let rc_config = Arc::new(config);
self.issuer_idx
.write()
.expect(MUTEX_POISONED_ERR)
.insert(issuer_id, rc_config.clone());
self.iss_index
.write()
.expect(MUTEX_POISONED_ERR)
.insert(iss, rc_config);
}
pub(super) fn get_trusted_issuer(&self, iss: &IssClaim) -> Option<Arc<TrustedIssuer>> {
let index = self.iss_index.read().expect(MUTEX_POISONED_ERR);
index.get(iss).map(|config| config.policy.clone())
}
pub(super) fn find_token_metadata_key(&self, entity_type_name: &str) -> Option<String> {
let index = self.iss_index.read().expect(MUTEX_POISONED_ERR);
for issuer_config in index.values() {
for (token_key, token_metadata) in &issuer_config.policy.token_metadata {
if token_metadata.entity_type_name == entity_type_name {
return Some(token_key.clone());
}
}
}
None
}
pub(super) fn len(&self) -> usize {
let index = self.iss_index.read().expect(MUTEX_POISONED_ERR);
index.len()
}
pub(super) fn contains_iss(&self, iss: &IssClaim) -> bool {
let index = self.iss_index.read().expect(MUTEX_POISONED_ERR);
index.contains_key(iss)
}
pub(super) fn is_issuer_id_present(&self, issuer_id: &str) -> bool {
self.issuer_idx
.read()
.expect(MUTEX_POISONED_ERR)
.get(issuer_id)
.is_some()
}
pub(super) fn loaded_issuer_ids(&self) -> HashSet<String> {
let index = self.iss_index.read().expect(MUTEX_POISONED_ERR);
index
.values()
.map(|config| config.issuer_id.clone())
.collect()
}
}