use std::sync::Arc;
use super::{
acl_authentication_settings::AclAuthenticationSettings,
authentication_settings::{AuthSetup, IAuthenticationSettings},
};
use crate::{
AccessControlList, AclError,
auth::{GarnetAclWithPasswordAuthenticator, GarnetAuthenticator},
};
pub struct AclAuthenticationPasswordSettings {
pub base: AclAuthenticationSettings,
}
impl AclAuthenticationPasswordSettings {
pub fn new(acl_configuration_file: Option<String>, default_password: String) -> Self {
Self {
base: AclAuthenticationSettings::new(acl_configuration_file, default_password),
}
}
fn create_authenticator_internal(
&self,
acl: &Arc<AccessControlList>,
) -> Result<GarnetAuthenticator, AclError> {
Ok(GarnetAuthenticator::AclWithPassword(
GarnetAclWithPasswordAuthenticator::new(Arc::clone(acl)),
))
}
}
impl IAuthenticationSettings for AclAuthenticationPasswordSettings {
fn create_authenticator(&self, setup: &AuthSetup) -> Result<GarnetAuthenticator, AclError> {
let acl = setup.acl.clone().ok_or_else(|| {
AclError::Acl("ACL authentication settings require a loaded AccessControlList".into())
})?;
self.create_authenticator_internal(&acl)
}
}