From aa50dc1883c3f5445603511d094db866657609f6 Mon Sep 17 00:00:00 2001 From: Aravinth Manivannan Date: Thu, 29 Dec 2022 02:55:51 +0530 Subject: [PATCH] chore: update config and env var reading hack --- Cargo.lock | 221 +++++++++++++++++++++++++++++------------------- Cargo.toml | 2 +- src/settings.rs | 115 +++++++++++++------------ 3 files changed, 198 insertions(+), 140 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 4f2e7ed..18b51ee 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -75,7 +75,7 @@ dependencies = [ "bytestring", "http", "regex", - "serde 1.0.152", + "serde", "tracing", ] @@ -161,7 +161,7 @@ dependencies = [ "once_cell", "pin-project-lite", "regex", - "serde 1.0.152", + "serde", "serde_json", "serde_urlencoded", "smallvec", @@ -284,25 +284,30 @@ version = "0.3.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a4c527152e37cf757a3f78aae5a06fbeefdb07ccc535c980a3208ee3060dd544" -[[package]] -name = "arrayvec" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23b62fc65de8e4e7f52534fb52b0f3ed04746ae267519eef2a83941e8085068b" - [[package]] name = "arrayvec" version = "0.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8da52d66c7071e2e3fa2a1e5c6d088fec47b593032b254f5e980de8ea54454d6" +[[package]] +name = "async-trait" +version = "0.1.60" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "677d1d8ab452a3936018a687b20e6f7cf5363d713b732b8884001317b0e48aa3" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "atoi" version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d7c57d12312ff59c811c0643f4d80830505833c9ffaebd193d819392b265be8e" dependencies = [ - "num-traits 0.2.15", + "num-traits", ] [[package]] @@ -341,7 +346,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "72936ee4afc7f8f736d1c38383b56480b5497b4617b4a77bdbf1d2ababc76127" dependencies = [ "arrayref", - "arrayvec 0.7.2", + "arrayvec", "constant_time_eq", ] @@ -456,15 +461,18 @@ dependencies = [ [[package]] name = "config" -version = "0.11.0" +version = "0.13.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b1b9d958c2b1368a663f05538fc1b5975adce1e19f435acceae987aceeeb369" +checksum = "d379af7f68bfc21714c6c7dea883544201741d2ce8274bb12fa54f89507f52a7" dependencies = [ + "async-trait", + "json5", "lazy_static", - "nom 5.1.2", + "nom", + "pathdiff", + "ron", "rust-ini", - "serde 1.0.152", - "serde-hjson", + "serde", "serde_json", "toml", "yaml-rust", @@ -665,6 +673,12 @@ dependencies = [ "winapi", ] +[[package]] +name = "dlv-list" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0688c2a7f92e427f44895cd63841bff7b29f8d7a1648b9e7e07a4a365b2e1257" + [[package]] name = "dotenvy" version = "0.15.6" @@ -677,7 +691,7 @@ version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "90e5c1c8368803113bf0c9584fc495a58b86dc8a29edbf8fe877d21d9507e797" dependencies = [ - "serde 1.0.152", + "serde", ] [[package]] @@ -771,7 +785,7 @@ dependencies = [ "futures-util", "lazy_static", "pretty_env_logger", - "serde 1.0.152", + "serde", "serde_json", "sqlx", "tracing", @@ -1103,6 +1117,17 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +name = "json5" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96b0db21af676c1ce64250b5f40f3ce2cf27e4e47cb91ed91eb6fe9350b430c1" +dependencies = [ + "pest", + "pest_derive", + "serde", +] + [[package]] name = "language-tags" version = "0.3.2" @@ -1115,19 +1140,6 @@ version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" -[[package]] -name = "lexical-core" -version = "0.7.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6607c62aa161d23d17a9072cc5da0be67cdfc89d3afb1e8d9c842bebc2525ffe" -dependencies = [ - "arrayvec 0.5.2", - "bitflags", - "cfg-if", - "ryu", - "static_assertions", -] - [[package]] name = "libc" version = "0.2.139" @@ -1269,17 +1281,6 @@ version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e4a24736216ec316047a1fc4252e27dabb04218aa4a3f37c6e7ddbf1f9782b54" -[[package]] -name = "nom" -version = "5.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ffb4262d26ed83a1c0a33a38fe2bb15797329c85770da05e6b828ddb782627af" -dependencies = [ - "lexical-core", - "memchr", - "version_check", -] - [[package]] name = "nom" version = "7.1.1" @@ -1290,15 +1291,6 @@ dependencies = [ "minimal-lexical", ] -[[package]] -name = "num-traits" -version = "0.1.43" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92e5113e9fd4cc14ded8e499429f396a20f98c772a47cc8622a736e1ec843c31" -dependencies = [ - "num-traits 0.2.15", -] - [[package]] name = "num-traits" version = "0.2.15" @@ -1324,6 +1316,16 @@ version = "1.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "86f0b0d4bf799edbc74508c1e8bf170ff5f41238e5f8225603ca7caaae2b7860" +[[package]] +name = "ordered-multimap" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ccd746e37177e1711c20dd619a1620f34f5c8b569c53590a72dedd5344d8924a" +dependencies = [ + "dlv-list", + "hashbrown", +] + [[package]] name = "os_str_bytes" version = "6.4.1" @@ -1384,12 +1386,62 @@ version = "1.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d01a5bd0424d00070b0098dd17ebca6f961a959dead1dbcbbbc1d1cd8d3deeba" +[[package]] +name = "pathdiff" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8835116a5c179084a830efb3adc117ab007512b535bc1a21c991d3b32a6b44dd" + [[package]] name = "percent-encoding" version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "478c572c3d73181ff3c2539045f6eb99e5491218eae919370993b890cdbdd98e" +[[package]] +name = "pest" +version = "2.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0f6e86fb9e7026527a0d46bc308b841d73170ef8f443e1807f6ef88526a816d4" +dependencies = [ + "thiserror", + "ucd-trie", +] + +[[package]] +name = "pest_derive" +version = "2.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96504449aa860c8dcde14f9fba5c58dc6658688ca1fe363589d6327b8662c603" +dependencies = [ + "pest", + "pest_generator", +] + +[[package]] +name = "pest_generator" +version = "2.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "798e0220d1111ae63d66cb66a5dcb3fc2d986d520b98e49e1852bfdb11d7c5e7" +dependencies = [ + "pest", + "pest_meta", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "pest_meta" +version = "2.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "984298b75898e30a843e278a9f2452c31e349a073a0ce6fd950a12a74464e065" +dependencies = [ + "once_cell", + "pest", + "sha1", +] + [[package]] name = "phf" version = "0.10.1" @@ -1592,6 +1644,17 @@ dependencies = [ "winapi", ] +[[package]] +name = "ron" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "88073939a61e5b7680558e6be56b419e208420c2adb92be54921fa6b72283f1a" +dependencies = [ + "base64", + "bitflags", + "serde", +] + [[package]] name = "rust-argon2" version = "1.0.0" @@ -1606,9 +1669,13 @@ dependencies = [ [[package]] name = "rust-ini" -version = "0.13.0" +version = "0.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3e52c148ef37f8c375d49d5a73aa70713125b7f19095948a923f80afdeb22ec2" +checksum = "f6d5f2436026b4f6e79dc829837d467cc7e9a55ee40e750d716713540715a2df" +dependencies = [ + "cfg-if", + "ordered-multimap", +] [[package]] name = "rustc_version" @@ -1682,12 +1749,6 @@ version = "1.0.16" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "58bc9567378fc7690d6b2addae4e60ac2eeea07becb2c64b9f218b53865cba2a" -[[package]] -name = "serde" -version = "0.8.23" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9dad3f759919b92c3068c696c15c3d17238234498bbdcc80f2c469606f948ac8" - [[package]] name = "serde" version = "1.0.152" @@ -1697,18 +1758,6 @@ dependencies = [ "serde_derive", ] -[[package]] -name = "serde-hjson" -version = "0.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a3a4e0ea8a88553209f6cc6cfe8724ecad22e1acf372793c27d995290fe74f8" -dependencies = [ - "lazy_static", - "num-traits 0.1.43", - "regex", - "serde 0.8.23", -] - [[package]] name = "serde_derive" version = "1.0.152" @@ -1728,7 +1777,7 @@ checksum = "877c235533714907a8c2464236f5c4b2a17262ef1bd71f38f35ea592c8da6883" dependencies = [ "itoa", "ryu", - "serde 1.0.152", + "serde", ] [[package]] @@ -1740,7 +1789,7 @@ dependencies = [ "form_urlencoded", "itoa", "ryu", - "serde 1.0.152", + "serde", ] [[package]] @@ -1818,7 +1867,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f87e292b4291f154971a43c3774364e2cbcaec599d3f5bf6fa9d122885dbc38a" dependencies = [ "itertools", - "nom 7.1.1", + "nom", "unicode_categories", ] @@ -1870,7 +1919,7 @@ dependencies = [ "rand", "rustls", "rustls-pemfile", - "serde 1.0.152", + "serde", "serde_json", "sha1", "sha2", @@ -1899,7 +1948,7 @@ dependencies = [ "once_cell", "proc-macro2", "quote", - "serde 1.0.152", + "serde", "serde_json", "sha2", "sqlx-core", @@ -1919,12 +1968,6 @@ dependencies = [ "tokio-rustls", ] -[[package]] -name = "static_assertions" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" - [[package]] name = "string_cache" version = "0.8.4" @@ -1936,7 +1979,7 @@ dependencies = [ "parking_lot 0.12.1", "phf_shared", "precomputed-hash", - "serde 1.0.152", + "serde", ] [[package]] @@ -2031,7 +2074,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a561bf4617eebd33bca6434b988f39ed798e527f51a1e797d0ee4f61c0a38376" dependencies = [ "itoa", - "serde 1.0.152", + "serde", "time-core", "time-macros", ] @@ -2127,7 +2170,7 @@ version = "0.5.10" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1333c76748e868a4d9d1017b5ab53171dfd095f70c712fdb4653a406547f598f" dependencies = [ - "serde 1.0.152", + "serde", ] [[package]] @@ -2169,6 +2212,12 @@ version = "1.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "497961ef93d974e23eb6f433eb5fe1b7930b659f06d12dec6fc44a8f554c0bba" +[[package]] +name = "ucd-trie" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e79c4d996edb816c91e4308506774452e55e95c3c9de07b6729e17e15a5ef81" + [[package]] name = "unicode-bidi" version = "0.3.8" @@ -2217,7 +2266,7 @@ dependencies = [ "form_urlencoded", "idna 0.3.0", "percent-encoding", - "serde 1.0.152", + "serde", ] [[package]] @@ -2235,7 +2284,7 @@ dependencies = [ "idna 0.2.3", "lazy_static", "regex", - "serde 1.0.152", + "serde", "serde_derive", "serde_json", "url", diff --git a/Cargo.toml b/Cargo.toml index 83864e6..f7f1c57 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -20,7 +20,7 @@ serde = { version = "1", features=["derive"]} actix-web-codegen-const-routes = { version = "0.1.0", tag = "0.1.0", git = "https://github.com/realaravinth/actix-web-codegen-const-routes" } derive_builder = "0.11.2" argon2-creds = { branch = "master", git = "https://github.com/realaravinth/argon2-creds"} -config = "0.11" +config = "0.13" derive_more = "0.99.17" url = { version = "2.2.2", features = ["serde"]} serde_json = { version ="1", features = ["raw_value"]} diff --git a/src/settings.rs b/src/settings.rs index e1d5117..359b460 100644 --- a/src/settings.rs +++ b/src/settings.rs @@ -17,13 +17,16 @@ use std::env; use std::path::Path; -use config::{Config, ConfigError, Environment, File}; +use config::{builder::DefaultState, Config, ConfigBuilder, ConfigError, Environment, File}; use derive_more::Display; use serde::Deserialize; use serde::Serialize; -use tracing::warn; +use tracing::{info, warn}; use url::Url; +const PREFIX: &str = "LPFORMS"; +const SEPARATOR: &str = "_"; + #[derive(Debug, Clone, Deserialize)] pub struct Dashboard { pub api_key: String, @@ -83,85 +86,91 @@ pub struct Settings { #[cfg(not(tarpaulin_include))] impl Settings { pub fn new() -> Result { - let mut s = Config::new(); + let mut s = Config::builder(); const CURRENT_DIR: &str = "./config/default.toml"; const ETC: &str = "/etc/lpforms/config.toml"; if let Ok(path) = env::var("LPFORMS_CONFIG") { - s.merge(File::with_name(&path))?; + s = s.add_source(File::with_name(&path)); } else if Path::new(CURRENT_DIR).exists() { // merging default config from file - s.merge(File::with_name(CURRENT_DIR))?; + s = s.add_source(File::with_name(CURRENT_DIR)); } else if Path::new(ETC).exists() { - s.merge(File::with_name(ETC))?; + s = s.add_source(File::with_name(ETC)); } else { warn!("configuration file not found"); } - s.merge(Environment::with_prefix("LPFORMS").separator("_"))?; - - check_url(&s); + s = s.add_source(Environment::with_prefix(PREFIX).separator(SEPARATOR)); + s = set_separator_field(s); match env::var("PORT") { Ok(val) => { - s.set("server.port", val).unwrap(); + s = s.set_override("server.port", val).unwrap(); } Err(e) => warn!("couldn't interpret PORT: {}", e), } - match env::var("DATABASE_URL") { - Ok(val) => { - let url = Url::parse(&val).expect("couldn't parse Database URL"); - s.set("database.url", url.to_string()).unwrap(); - let database_type = DBType::from_url(&url).unwrap(); - s.set("database.database_type", database_type.to_string()) - .unwrap(); - } - Err(_e) => { - set_database_url(&mut s); - } + if let Ok(val) = env::var("DATABASE_URL") { + let url = Url::parse(&val).expect("couldn't parse Database URL"); + s = s.set_override("database.url", url.to_string()).unwrap(); + let database_type = DBType::from_url(&url).unwrap(); + s = s + .set_override("database.database_type", database_type.to_string()) + .unwrap(); } - // // setting default values - // #[cfg(test)] - // s.set("database.pool", 2.to_string()) - // .expect("Couldn't set database pool count"); - - match s.try_into::() { + let s = s.build()?; + match s.try_deserialize::() { Ok(val) => { Ok(val) }, - Err(e) => Err(ConfigError::Message(format!("\n\nError: {}. If it says missing fields, then please refer to https://github.com/mCaptcha/mcaptcha#configuration to learn more about how mcaptcha reads configuration\n\n", e))), + Err(e) => Err(ConfigError::Message(format!("\n\nError: {}. If it says missing fields, then please refer to https://git.batsense.net/LibrePages/forms to learn more about how forms reads configuration\n\n", e))), } } } -fn set_database_url(s: &mut Config) { - s.set( - "database.url", - format!( - r"postgres://{}:{}@{}:{}/{}", - s.get::("database.username") - .expect("Couldn't access database username"), - s.get::("database.password") - .expect("Couldn't access database password"), - s.get::("database.hostname") - .expect("Couldn't access database hostname"), - s.get::("database.port") - .expect("Couldn't access database port"), - s.get::("database.name") - .expect("Couldn't access database name") - ), - ) - .expect("Couldn't set database url"); -} - #[cfg(not(tarpaulin_include))] -fn check_url(s: &Config) { - let url = s - .get::("source_code") - .expect("Couldn't access source_code"); +fn set_separator_field(mut s: ConfigBuilder) -> ConfigBuilder { + // ref: https://github.com/mehcode/config-rs/issues/391 - Url::parse(&url).expect("Please enter a URL for source_code in settings"); + fn from_env( + s: ConfigBuilder, + env_name: &str, + config_name: &str, + ) -> ConfigBuilder { + if let Ok(val) = env::var(env_name) { + info!("Overriding {config_name} with data from env var {env_name}"); + s.set_override(config_name, val) + .unwrap_or_else(|_| panic!("Couldn't set {config_name} from env var {env_name}")) + } else { + s + } + } + s = from_env(s, &format!("{PREFIX}{SEPARATOR}SOURCE_CODE"), "source_code"); + s = from_env( + s, + &format!("{PREFIX}{SEPARATOR}DASH{SEPARATOR}API_KEY"), + "dash.api_key", + ); + + s = from_env( + s, + &format!("{PREFIX}{SEPARATOR}SERVER{SEPARATOR}URL_PREFIX"), + "server.url_prefix", + ); + + s = from_env( + s, + &format!("{PREFIX}{SEPARATOR}DATABASE{SEPARATOR}POOL"), + "server.url_prefix", + ); + + s = from_env( + s, + &format!("{PREFIX}{SEPARATOR}SERVER{SEPARATOR}PROXY_HAS_TLS"), + "server.proxy_has_tls", + ); + s }