use std::fmt;
use crate::error::NifiError;
#[derive(Clone)]
pub struct Redacted<T>(T);
impl<T> Redacted<T> {
pub fn new(value: T) -> Self {
Self(value)
}
pub fn inner(&self) -> &T {
&self.0
}
}
impl<T> fmt::Debug for Redacted<T> {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.write_str("[REDACTED]")
}
}
#[async_trait::async_trait]
pub trait CredentialProvider: Send + Sync + fmt::Debug {
async fn credentials(&self) -> Result<(String, String), NifiError>;
}
#[derive(Debug, Clone)]
pub struct StaticCredentials {
username: String,
password: Redacted<String>,
}
impl StaticCredentials {
pub fn new(username: impl Into<String>, password: impl Into<String>) -> Self {
Self {
username: username.into(),
password: Redacted::new(password.into()),
}
}
}
#[async_trait::async_trait]
impl CredentialProvider for StaticCredentials {
async fn credentials(&self) -> Result<(String, String), NifiError> {
Ok((self.username.clone(), self.password.inner().clone()))
}
}
#[derive(Debug, Clone)]
pub struct EnvCredentials {
username_var: String,
password_var: String,
}
impl EnvCredentials {
pub fn new() -> Self {
Self {
username_var: "NIFI_USERNAME".to_string(),
password_var: "NIFI_PASSWORD".to_string(),
}
}
pub fn with_vars(username_var: impl Into<String>, password_var: impl Into<String>) -> Self {
Self {
username_var: username_var.into(),
password_var: password_var.into(),
}
}
pub fn username_var(&self) -> &str {
&self.username_var
}
pub fn password_var(&self) -> &str {
&self.password_var
}
}
impl Default for EnvCredentials {
fn default() -> Self {
Self::new()
}
}
#[async_trait::async_trait]
impl CredentialProvider for EnvCredentials {
async fn credentials(&self) -> Result<(String, String), NifiError> {
let username = std::env::var(&self.username_var).map_err(|_| NifiError::Auth {
message: format!("environment variable {} is not set", self.username_var),
})?;
let password = std::env::var(&self.password_var).map_err(|_| NifiError::Auth {
message: format!("environment variable {} is not set", self.password_var),
})?;
Ok((username, password))
}
}