nifi_rust_client/config/
auth.rs1#![deny(missing_docs)]
2use std::fmt;
9use std::sync::Arc;
10
11use crate::NifiClient;
12use crate::error::NifiError;
13
14#[async_trait::async_trait]
23pub trait AuthProvider: Send + Sync + fmt::Debug {
24 async fn authenticate(&self, client: &NifiClient) -> Result<(), NifiError>;
29}
30
31#[async_trait::async_trait]
33impl AuthProvider for Arc<dyn AuthProvider> {
34 async fn authenticate(&self, client: &NifiClient) -> Result<(), NifiError> {
35 (**self).authenticate(client).await
36 }
37}
38
39#[derive(Clone)]
47pub struct PasswordAuth {
48 username: String,
49 password: zeroize::Zeroizing<String>,
50}
51
52impl PasswordAuth {
53 pub fn new(username: impl Into<String>, password: impl Into<String>) -> Self {
55 Self {
56 username: username.into(),
57 password: zeroize::Zeroizing::new(password.into()),
58 }
59 }
60}
61
62impl fmt::Debug for PasswordAuth {
63 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
64 f.debug_struct("PasswordAuth")
65 .field("username", &self.username)
66 .field("password", &"[REDACTED]")
67 .finish()
68 }
69}
70
71#[async_trait::async_trait]
72impl AuthProvider for PasswordAuth {
73 async fn authenticate(&self, client: &NifiClient) -> Result<(), NifiError> {
74 client.login(&self.username, &self.password).await
75 }
76}
77
78#[derive(Debug, Clone)]
86pub struct EnvPasswordAuth {
87 username_var: String,
88 password_var: String,
89}
90
91impl EnvPasswordAuth {
92 pub fn new() -> Self {
95 Self {
96 username_var: "NIFI_USERNAME".to_string(),
97 password_var: "NIFI_PASSWORD".to_string(),
98 }
99 }
100
101 pub fn with_vars(username_var: impl Into<String>, password_var: impl Into<String>) -> Self {
103 Self {
104 username_var: username_var.into(),
105 password_var: password_var.into(),
106 }
107 }
108
109 pub fn username_var(&self) -> &str {
111 &self.username_var
112 }
113
114 pub fn password_var(&self) -> &str {
116 &self.password_var
117 }
118}
119
120impl Default for EnvPasswordAuth {
121 fn default() -> Self {
122 Self::new()
123 }
124}
125
126#[async_trait::async_trait]
127impl AuthProvider for EnvPasswordAuth {
128 async fn authenticate(&self, client: &NifiClient) -> Result<(), NifiError> {
129 let username = std::env::var(&self.username_var).map_err(|_| NifiError::Auth {
130 message: format!("environment variable {} is not set", self.username_var),
131 })?;
132 let password =
133 zeroize::Zeroizing::new(std::env::var(&self.password_var).map_err(|_| {
134 NifiError::Auth {
135 message: format!("environment variable {} is not set", self.password_var),
136 }
137 })?);
138 client.login(&username, &password).await
139 }
140}
141
142#[derive(Clone)]
150pub struct StaticTokenAuth {
151 token: zeroize::Zeroizing<String>,
152}
153
154impl StaticTokenAuth {
155 pub fn new(token: impl Into<String>) -> Self {
157 Self {
158 token: zeroize::Zeroizing::new(token.into()),
159 }
160 }
161}
162
163impl fmt::Debug for StaticTokenAuth {
164 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
165 f.debug_struct("StaticTokenAuth")
166 .field("token", &"[REDACTED]")
167 .finish()
168 }
169}
170
171#[async_trait::async_trait]
172impl AuthProvider for StaticTokenAuth {
173 async fn authenticate(&self, client: &NifiClient) -> Result<(), NifiError> {
174 client.set_token((*self.token).clone()).await;
175 Ok(())
176 }
177}