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: &str = "CDK_MINTD_MANAGEMENT_TLS_DIR";
13pub const ENV_MINT_MANAGEMENT_ALLOW_INSECURE: &str = "CDK_MINTD_MANAGEMENT_ALLOW_INSECURE";
14pub const ENV_MINT_MANAGEMENT_ALLOW_MINT_QUOTE_PAYMENT_OVERRIDE: &str =
15    "CDK_MINTD_MANAGEMENT_ALLOW_MINT_QUOTE_PAYMENT_OVERRIDE";
16
17impl MintManagementRpc {
18    pub fn from_env(mut self) -> Self {
19        if let Ok(enabled) = env::var(ENV_MINT_MANAGEMENT_ENABLED)
20            .or_else(|_| env::var(ENV_MINT_MANAGEMENT_ENABLED_LEGACY))
21        {
22            if let Ok(enabled) = enabled.parse() {
23                self.enabled = enabled;
24            }
25        }
26
27        if let Ok(address) = env::var(ENV_MINT_MANAGEMENT_ADDRESS) {
28            self.address = Some(address);
29        }
30
31        if let Ok(port) = env::var(ENV_MINT_MANAGEMENT_PORT) {
32            if let Ok(port) = port.parse::<u16>() {
33                self.port = Some(port);
34            }
35        }
36
37        if let Ok(tls_dir) = env::var(ENV_MINT_MANAGEMENT_TLS_DIR) {
38            self.tls_dir = Some(tls_dir.into());
39        }
40
41        if let Ok(allow_insecure) = env::var(ENV_MINT_MANAGEMENT_ALLOW_INSECURE) {
42            if let Ok(allow_insecure) = allow_insecure.parse() {
43                self.allow_insecure = allow_insecure;
44            }
45        }
46
47        if let Ok(allow_override) = env::var(ENV_MINT_MANAGEMENT_ALLOW_MINT_QUOTE_PAYMENT_OVERRIDE)
48        {
49            self.allow_mint_quote_payment_override = allow_override.parse().unwrap_or(false);
50        }
51
52        self
53    }
54}
55
56#[cfg(test)]
57mod tests {
58    use std::collections::BTreeSet;
59    use std::path::PathBuf;
60
61    use super::*;
62
63    fn env_lock() -> std::sync::MutexGuard<'static, ()> {
64        crate::test_utils::env_lock()
65    }
66
67    fn clear_env_vars() {
68        env::remove_var(ENV_MINT_MANAGEMENT_ENABLED);
69        env::remove_var(ENV_MINT_MANAGEMENT_ENABLED_LEGACY);
70        env::remove_var(ENV_MINT_MANAGEMENT_ADDRESS);
71        env::remove_var(ENV_MINT_MANAGEMENT_PORT);
72        env::remove_var(ENV_MINT_MANAGEMENT_TLS_DIR);
73        env::remove_var(ENV_MINT_MANAGEMENT_ALLOW_INSECURE);
74        env::remove_var(ENV_MINT_MANAGEMENT_ALLOW_MINT_QUOTE_PAYMENT_OVERRIDE);
75    }
76
77    #[test]
78    fn management_env_var_names_share_consistent_prefix() {
79        let names = [
80            ENV_MINT_MANAGEMENT_ENABLED,
81            ENV_MINT_MANAGEMENT_ADDRESS,
82            ENV_MINT_MANAGEMENT_PORT,
83            ENV_MINT_MANAGEMENT_TLS_DIR,
84            ENV_MINT_MANAGEMENT_ALLOW_INSECURE,
85            ENV_MINT_MANAGEMENT_ALLOW_MINT_QUOTE_PAYMENT_OVERRIDE,
86        ];
87
88        let prefixes: BTreeSet<&str> = names
89            .iter()
90            .map(|name| {
91                let idx = name
92                    .find("MANAGEMENT")
93                    .expect("management env var name should contain MANAGEMENT");
94                &name[..idx]
95            })
96            .collect();
97
98        assert_eq!(
99            prefixes.len(),
100            1,
101            "inconsistent management RPC env var prefixes: {prefixes:?}"
102        );
103    }
104
105    #[test]
106    fn management_rpc_from_env_reads_canonical_env_vars() {
107        let _guard = env_lock();
108        clear_env_vars();
109
110        env::set_var(ENV_MINT_MANAGEMENT_ENABLED, "true");
111        env::set_var(ENV_MINT_MANAGEMENT_ADDRESS, "0.0.0.0");
112        env::set_var(ENV_MINT_MANAGEMENT_PORT, "10000");
113        env::set_var(ENV_MINT_MANAGEMENT_TLS_DIR, "/var/lib/cdk/tls");
114        env::set_var(ENV_MINT_MANAGEMENT_ALLOW_INSECURE, "true");
115        env::set_var(
116            ENV_MINT_MANAGEMENT_ALLOW_MINT_QUOTE_PAYMENT_OVERRIDE,
117            "true",
118        );
119
120        let management_rpc = MintManagementRpc::default().from_env();
121
122        assert!(management_rpc.enabled);
123        assert_eq!(management_rpc.address.as_deref(), Some("0.0.0.0"));
124        assert_eq!(management_rpc.port, Some(10000));
125        assert_eq!(
126            management_rpc.tls_dir,
127            Some(PathBuf::from("/var/lib/cdk/tls"))
128        );
129        assert!(management_rpc.allow_insecure);
130        assert!(management_rpc.allow_mint_quote_payment_override);
131
132        clear_env_vars();
133    }
134
135    #[test]
136    fn management_rpc_from_env_still_reads_legacy_enabled_env_var() {
137        let _guard = env_lock();
138        clear_env_vars();
139
140        env::set_var(ENV_MINT_MANAGEMENT_ENABLED_LEGACY, "true");
141
142        let management_rpc = MintManagementRpc::default().from_env();
143
144        assert!(management_rpc.enabled);
145
146        clear_env_vars();
147    }
148
149    #[test]
150    fn management_rpc_from_env_allows_no_tls_configuration() {
151        let _guard = env_lock();
152        clear_env_vars();
153
154        env::set_var(ENV_MINT_MANAGEMENT_ENABLED, "true");
155
156        let management_rpc = MintManagementRpc::default().from_env();
157
158        assert!(management_rpc.enabled);
159        assert_eq!(management_rpc.tls_dir, None);
160        assert!(!management_rpc.allow_insecure);
161        assert!(!management_rpc.allow_mint_quote_payment_override);
162
163        clear_env_vars();
164    }
165
166    #[test]
167    fn management_rpc_payment_override_env_fails_closed() {
168        let _guard = env_lock();
169        clear_env_vars();
170        let management_rpc = MintManagementRpc {
171            allow_mint_quote_payment_override: true,
172            ..Default::default()
173        };
174
175        env::set_var(
176            ENV_MINT_MANAGEMENT_ALLOW_MINT_QUOTE_PAYMENT_OVERRIDE,
177            "false",
178        );
179        assert!(
180            !management_rpc
181                .clone()
182                .from_env()
183                .allow_mint_quote_payment_override
184        );
185
186        env::set_var(
187            ENV_MINT_MANAGEMENT_ALLOW_MINT_QUOTE_PAYMENT_OVERRIDE,
188            "not-a-boolean",
189        );
190        assert!(!management_rpc.from_env().allow_mint_quote_payment_override);
191
192        clear_env_vars();
193    }
194}