Can specify environment variables in client configuration

This commit is contained in:
2022-04-15 21:58:07 +02:00
parent 937343c5f9
commit 489f938b71
6 changed files with 67 additions and 3 deletions

View File

@ -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<Client> {
}
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);
}
}
}

View File

@ -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<E> EntityManager<E>
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<E> {
self.list.clone()

View File

@ -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)

View File

@ -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
}