cdk_mintd/env_vars/
management_rpc.rs1use std::env;
4
5use crate::config::MintManagementRpc;
6
7pub 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}