diff --git a/Cargo.lock b/Cargo.lock index 2cada7c..3ff4761 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -421,6 +421,7 @@ dependencies = [ "futures-util", "include_dir", "jwt-simple", + "lazy-regex", "log", "mime_guess", "rand", @@ -1211,6 +1212,29 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d4345964bb142484797b161f473a503a434de77149dd8c7427788c6e13379388" +[[package]] +name = "lazy-regex" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6b12f2eb6ed7d39405c5eb25a034b4c106a9ad87a6d9be3298de6c5f32fd57d" +dependencies = [ + "lazy-regex-proc_macros", + "once_cell", + "regex", +] + +[[package]] +name = "lazy-regex-proc_macros" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2496e5264069bc726ccf37eb76b9cd89406ae110d836c3f76729f99c8a23293" +dependencies = [ + "proc-macro2", + "quote", + "regex", + "syn", +] + [[package]] name = "lazy_static" version = "1.4.0" diff --git a/Cargo.toml b/Cargo.toml index 79c62d8..4736922 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -26,4 +26,5 @@ rand = "0.8.5" base64 = "0.13.0" jwt-simple = "0.10.9" digest = "0.10.3" -sha2 = "0.10.2" \ No newline at end of file +sha2 = "0.10.2" +lazy-regex = "2.3.0" \ No newline at end of file diff --git a/src/data/client.rs b/src/data/client.rs index bab0c01..08948bf 100644 --- a/src/data/client.rs +++ b/src/data/client.rs @@ -1,4 +1,5 @@ use crate::data::entity_manager::EntityManager; +use crate::utils::string_utils::apply_env_vars; #[derive(Clone, Debug, serde::Serialize, serde::Deserialize, Eq, PartialEq)] pub struct ClientID(pub String); @@ -32,4 +33,14 @@ impl EntityManager { } None } + + pub fn apply_environment_variables(&mut self) { + for c in self.iter_mut() { + c.id = ClientID(apply_env_vars(&c.id.0)); + c.name = apply_env_vars(&c.name); + c.description = apply_env_vars(&c.description); + c.secret = apply_env_vars(&c.secret); + c.redirect_uri = apply_env_vars(&c.redirect_uri); + } + } } \ No newline at end of file diff --git a/src/data/entity_manager.rs b/src/data/entity_manager.rs index 9dbedc9..0241b43 100644 --- a/src/data/entity_manager.rs +++ b/src/data/entity_manager.rs @@ -1,5 +1,5 @@ use std::path::{Path, PathBuf}; -use std::slice::Iter; +use std::slice::{Iter, IterMut}; use crate::utils::err::Res; @@ -87,6 +87,11 @@ impl EntityManager self.list.iter() } + /// Iterate over the entries of this entity manager + pub fn iter_mut(&mut self) -> IterMut<'_, E> { + self.list.iter_mut() + } + /// Get a cloned list of entries pub fn cloned(&self) -> Vec { self.list.clone() diff --git a/src/main.rs b/src/main.rs index 33ce497..a54ecd7 100644 --- a/src/main.rs +++ b/src/main.rs @@ -74,8 +74,9 @@ async fn main() -> std::io::Result<()> { let listen_address = config.listen_address.to_string(); HttpServer::new(move || { - let clients = ClientManager::open_or_create(config.clients_file()) + let mut clients = ClientManager::open_or_create(config.clients_file()) .expect("Failed to load clients list!"); + clients.apply_environment_variables(); let policy = CookieIdentityPolicy::new(config.token_key.as_bytes()) .name(SESSION_COOKIE_NAME) diff --git a/src/utils/string_utils.rs b/src/utils/string_utils.rs index 237d8c2..418d924 100644 --- a/src/utils/string_utils.rs +++ b/src/utils/string_utils.rs @@ -1,3 +1,4 @@ +use lazy_regex::regex_find; use rand::distributions::Alphanumeric; use rand::Rng; @@ -9,3 +10,24 @@ pub fn rand_str(len: usize) -> String { .take(len) .collect() } + +/// Parse environment variables +pub fn apply_env_vars(val: &str) -> String { + let mut val = val.to_string(); + + if let Some(varname_with_wrapper) = regex_find!(r#"\$\{[a-zA-Z0-9_-]+\}"#, &val) { + let varname = varname_with_wrapper.strip_prefix("${").unwrap().strip_suffix('}').unwrap(); + let value = match std::env::var(varname) { + Ok(v) => v, + Err(e) => { + log::error!("Failed to find environment variable {}!", varname); + eprintln!("Failed to find environment variable! {:?}", e); + std::process::exit(2); + } + }; + + val = val.replace(varname_with_wrapper, &value); + } + + val +} \ No newline at end of file