mod encrypted_file;
mod environment;
use std::collections::BTreeMap;
use std::fmt;
use std::sync::Arc;
use rocketmq_security_api::SecretProvider;
use rocketmq_security_api::SecretProviderId;
use crate::AuthFailureKind;
use crate::AuthOperation;
use crate::AuthServiceError;
use crate::AuthServiceResult;
pub use encrypted_file::EncryptedFileSecretProvider;
pub use environment::EnvironmentSecretProvider;
#[derive(Default)]
pub struct SecretProviderRegistry {
providers: BTreeMap<SecretProviderId, Arc<dyn SecretProvider>>,
}
impl SecretProviderRegistry {
pub fn new() -> Self {
Self::default()
}
pub fn register(&mut self, provider: Arc<dyn SecretProvider>) -> AuthServiceResult<()> {
let id = provider.id().clone();
if self.providers.contains_key(&id) {
return Err(AuthServiceError::new(
AuthOperation::LoadSecret,
AuthFailureKind::Conflict,
));
}
self.providers.insert(id, provider);
Ok(())
}
pub fn provider(&self, id: &SecretProviderId) -> AuthServiceResult<&Arc<dyn SecretProvider>> {
self.providers
.get(id)
.ok_or_else(|| AuthServiceError::new(AuthOperation::LoadSecret, AuthFailureKind::NotFound))
}
pub fn len(&self) -> usize {
self.providers.len()
}
pub fn is_empty(&self) -> bool {
self.providers.is_empty()
}
}
impl fmt::Debug for SecretProviderRegistry {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.debug_struct("SecretProviderRegistry")
.field("provider_ids", &self.providers.keys().collect::<Vec<_>>())
.finish()
}
}