Skip to main content

cdk_mintd/env_vars/
management_rpc.rs

1//! Management RPC environment variables
2
3use std::env;
4
5use crate::config::MintManagementRpc;
6
7// Mint RPC Server environment variables
8pub const ENV_MINT_MANAGEMENT_ENABLED: &str = "CDK_MINTD_MANAGEMENT_ENABLED";
9pub const ENV_MINT_MANAGEMENT_ENABLED_LEGACY: &str = "CDK_MINTD_MINT_MANAGEMENT_ENABLED";
10pub const ENV_MINT_MANAGEMENT_ADDRESS: &str = "CDK_MINTD_MANAGEMENT_ADDRESS";
11pub const ENV_MINT_MANAGEMENT_PORT: &str = "CDK_MINTD_MANAGEMENT_PORT";
12pub const ENV_MINT_MANAGEMENT_TLS_DIR_PATH: &str = "CDK_MINTD_MANAGEMENT_TLS_DIR_PATH";
13
14impl MintManagementRpc {
15    pub fn from_env(mut self) -> Self {
16        if let Ok(enabled) = env::var(ENV_MINT_MANAGEMENT_ENABLED)
17            .or_else(|_| env::var(ENV_MINT_MANAGEMENT_ENABLED_LEGACY))
18        {
19            if let Ok(enabled) = enabled.parse() {
20                self.enabled = enabled;
21            }
22        }
23
24        if let Ok(address) = env::var(ENV_MINT_MANAGEMENT_ADDRESS) {
25            self.address = Some(address);
26        }
27
28        if let Ok(port) = env::var(ENV_MINT_MANAGEMENT_PORT) {
29            if let Ok(port) = port.parse::<u16>() {
30                self.port = Some(port);
31            }
32        }
33
34        if let Ok(tls_path) = env::var(ENV_MINT_MANAGEMENT_TLS_DIR_PATH) {
35            self.tls_dir_path = Some(tls_path.into());
36        }
37
38        self
39    }
40}
41
42#[cfg(test)]
43mod tests {
44    use std::collections::BTreeSet;
45    use std::path::PathBuf;
46
47    use super::*;
48
49    fn env_lock() -> std::sync::MutexGuard<'static, ()> {
50        static ENV_LOCK: std::sync::Mutex<()> = std::sync::Mutex::new(());
51
52        ENV_LOCK
53            .lock()
54            .expect("management RPC env test lock should not be poisoned")
55    }
56
57    fn clear_env_vars() {
58        env::remove_var(ENV_MINT_MANAGEMENT_ENABLED);
59        env::remove_var(ENV_MINT_MANAGEMENT_ENABLED_LEGACY);
60        env::remove_var(ENV_MINT_MANAGEMENT_ADDRESS);
61        env::remove_var(ENV_MINT_MANAGEMENT_PORT);
62        env::remove_var(ENV_MINT_MANAGEMENT_TLS_DIR_PATH);
63    }
64
65    #[test]
66    fn management_env_var_names_share_consistent_prefix() {
67        let names = [
68            ENV_MINT_MANAGEMENT_ENABLED,
69            ENV_MINT_MANAGEMENT_ADDRESS,
70            ENV_MINT_MANAGEMENT_PORT,
71            ENV_MINT_MANAGEMENT_TLS_DIR_PATH,
72        ];
73
74        let prefixes: BTreeSet<&str> = names
75            .iter()
76            .map(|name| {
77                let idx = name
78                    .find("MANAGEMENT")
79                    .expect("management env var name should contain MANAGEMENT");
80                &name[..idx]
81            })
82            .collect();
83
84        assert_eq!(
85            prefixes.len(),
86            1,
87            "inconsistent management RPC env var prefixes: {prefixes:?}"
88        );
89    }
90
91    #[test]
92    fn management_rpc_from_env_reads_canonical_env_vars() {
93        let _guard = env_lock();
94        clear_env_vars();
95
96        env::set_var(ENV_MINT_MANAGEMENT_ENABLED, "true");
97        env::set_var(ENV_MINT_MANAGEMENT_ADDRESS, "0.0.0.0");
98        env::set_var(ENV_MINT_MANAGEMENT_PORT, "10000");
99        env::set_var(ENV_MINT_MANAGEMENT_TLS_DIR_PATH, "/var/lib/cdk/tls");
100
101        let management_rpc = MintManagementRpc::default().from_env();
102
103        assert!(management_rpc.enabled);
104        assert_eq!(management_rpc.address.as_deref(), Some("0.0.0.0"));
105        assert_eq!(management_rpc.port, Some(10000));
106        assert_eq!(
107            management_rpc.tls_dir_path,
108            Some(PathBuf::from("/var/lib/cdk/tls"))
109        );
110
111        clear_env_vars();
112    }
113
114    #[test]
115    fn management_rpc_from_env_still_reads_legacy_enabled_env_var() {
116        let _guard = env_lock();
117        clear_env_vars();
118
119        env::set_var(ENV_MINT_MANAGEMENT_ENABLED_LEGACY, "true");
120
121        let management_rpc = MintManagementRpc::default().from_env();
122
123        assert!(management_rpc.enabled);
124
125        clear_env_vars();
126    }
127
128    #[test]
129    fn management_rpc_from_env_allows_no_tls_configuration() {
130        let _guard = env_lock();
131        clear_env_vars();
132
133        env::set_var(ENV_MINT_MANAGEMENT_ENABLED, "true");
134
135        let management_rpc = MintManagementRpc::default().from_env();
136
137        assert!(management_rpc.enabled);
138        assert_eq!(management_rpc.tls_dir_path, None);
139
140        clear_env_vars();
141    }
142}