use std::time::Duration;
use crate::biome::credentials::store::PasswordEncryptionCost;
use crate::error::InvalidStateError;
const DEFAULT_ISSUER: &str = "self-issued";
const DEFAULT_DURATION: u64 = 5400; const DEFAULT_REFRESH_DURATION: u64 = 5_184_000;
#[derive(Deserialize, Debug)]
pub struct BiomeCredentialsRestConfig {
issuer: String,
access_token_duration: Duration,
refresh_token_duration: Duration,
password_encryption_cost: PasswordEncryptionCost,
}
impl BiomeCredentialsRestConfig {
pub fn issuer(&self) -> String {
self.issuer.to_owned()
}
pub fn access_token_duration(&self) -> Duration {
self.access_token_duration.to_owned()
}
pub fn refresh_token_duration(&self) -> Duration {
self.refresh_token_duration.to_owned()
}
pub fn password_encryption_cost(&self) -> PasswordEncryptionCost {
self.password_encryption_cost
}
}
pub struct BiomeCredentialsRestConfigBuilder {
issuer: Option<String>,
access_token_duration: Option<Duration>,
refresh_token_duration: Option<Duration>,
password_encryption_cost: Option<String>,
}
impl Default for BiomeCredentialsRestConfigBuilder {
fn default() -> BiomeCredentialsRestConfigBuilder {
BiomeCredentialsRestConfigBuilder {
issuer: Some(DEFAULT_ISSUER.to_string()),
access_token_duration: Some(Duration::from_secs(DEFAULT_DURATION)),
refresh_token_duration: Some(Duration::from_secs(DEFAULT_REFRESH_DURATION)),
password_encryption_cost: Some("high".to_string()),
}
}
}
impl BiomeCredentialsRestConfigBuilder {
pub fn new() -> Self {
BiomeCredentialsRestConfigBuilder {
issuer: None,
access_token_duration: None,
refresh_token_duration: None,
password_encryption_cost: None,
}
}
pub fn with_issuer(mut self, issuer: &str) -> Self {
self.issuer = Some(issuer.to_string());
self
}
pub fn with_access_token_duration_in_secs(mut self, duration: u64) -> Self {
self.access_token_duration = Some(Duration::from_secs(duration));
self
}
pub fn with_refresh_token_duration_in_secs(mut self, duration: u64) -> Self {
self.refresh_token_duration = Some(Duration::from_secs(duration));
self
}
pub fn with_password_encryption_cost(mut self, cost: &str) -> Self {
self.password_encryption_cost = Some(cost.to_string());
self
}
pub fn build(self) -> Result<BiomeCredentialsRestConfig, InvalidStateError> {
let issuer = self.issuer.unwrap_or_else(|| {
debug!("Using default value for issuer");
DEFAULT_ISSUER.to_string()
});
let access_token_duration = self.access_token_duration.unwrap_or_else(|| {
debug!("Using default value for access_token_duration");
Duration::from_secs(DEFAULT_DURATION)
});
let refresh_token_duration = self
.refresh_token_duration
.unwrap_or_else(|| Duration::from_secs(DEFAULT_REFRESH_DURATION));
let password_encryption_cost: PasswordEncryptionCost = self
.password_encryption_cost
.unwrap_or_else(|| "high".to_string())
.parse()
.map_err(|err| {
InvalidStateError::with_message(format!(
"Invalid password encryption cost: {}",
err
))
})?;
Ok(BiomeCredentialsRestConfig {
issuer,
access_token_duration,
refresh_token_duration,
password_encryption_cost,
})
}
}