rustfs_rsc/
provider.rs

1//! Credential provider
2use futures::Future;
3use std::{env, pin::Pin};
4
5use crate::Credentials;
6
7pub type CredentialFuture = Pin<Box<dyn Future<Output = Credentials> + Send>>;
8
9/// define Credential retriever.
10pub trait Provider: Send + Sync {
11    fn fetch(&self) -> CredentialFuture;
12}
13
14#[derive(Debug, Clone)]
15pub struct StaticProvider(Credentials);
16
17impl StaticProvider {
18    pub fn new<T: Into<String>>(ak: T, sk: T, st: Option<String>) -> Self {
19        Self(Credentials::new(ak, sk, st, None))
20    }
21
22    /// load Credentials from MinIO environment variables.
23    /// - `MINIO_ACCESS_KEY`
24    /// - `MINIO_SECRET_KEY`
25    /// - `MINIO_SESSION_TOKEN`
26    pub fn from_env() -> Option<Self> {
27        if let (Ok(ak), Ok(sk), st) = (
28            env::var("MINIO_ACCESS_KEY"),
29            env::var("MINIO_SECRET_KEY"),
30            env::var("MINIO_SESSION_TOKEN"),
31        ) {
32            Some(Self::new(ak, sk, st.ok()))
33        } else {
34            None
35        }
36    }
37
38    /// load Credentials from AWS environment variables.
39    /// - `AWS_ACCESS_KEY_ID` or `AWS_ACCESS_KEY`
40    /// - `AWS_SECRET_ACCESS_KEY` or `AWS_SECRET_KEY`
41    /// - `AWS_SESSION_TOKEN`
42    pub fn from_env_aws() -> Option<Self> {
43        let ak = env::var("AWS_ACCESS_KEY_ID");
44        let ak = if !ak.is_ok() {
45            env::var("AWS_ACCESS_KEY")
46        } else {
47            ak
48        };
49        let sk = env::var("AWS_ACCESS_KEY_ID");
50        let sk = if !sk.is_ok() {
51            env::var("AWS_ACCESS_KEY")
52        } else {
53            sk
54        };
55        if let (Ok(ak), Ok(sk), st) = (ak, sk, env::var("MINIO_SESSION_TOKEN")) {
56            Some(Self::new(ak, sk, st.ok()))
57        } else {
58            None
59        }
60    }
61}
62
63impl Provider for StaticProvider {
64    fn fetch(&self) -> CredentialFuture {
65        let cred = self.0.clone();
66        Box::pin(async move { cred })
67    }
68}