diff --git a/module.nix b/module.nix index 9ec4ff6..10f26a1 100644 --- a/module.nix +++ b/module.nix @@ -63,6 +63,12 @@ in description = "Maximum length for messages. 0 for unlimited."; }; + maxWebsiteLength = mkOption { + type = types.int; + default = 100; + description = "Maximum length for website URLs. 0 for unlimited."; + }; + user = mkOption { type = types.str; default = "guestbook"; @@ -101,6 +107,7 @@ in BOOK_HONEYPOT = if cfg.honeypot then "true" else "false"; BOOK_MAX_NAME_LENGTH = toString cfg.maxNameLength; BOOK_MAX_MESSAGE_LENGTH = toString cfg.maxMessageLength; + BOOK_MAX_WEBSITE_LENGTH = toString cfg.maxWebsiteLength; }; serviceConfig = { Type = "simple"; diff --git a/src/config.rs b/src/config.rs index cccf1d4..64f67c7 100644 --- a/src/config.rs +++ b/src/config.rs @@ -12,6 +12,7 @@ pub struct Config { pub honeypot: bool, pub max_name_length: usize, pub max_message_length: usize, + pub max_website_length: usize, } impl Config { @@ -47,6 +48,10 @@ impl Config { .unwrap_or_else(|_| "1000".into()) .parse() .map_err(|_| "BOOK_MAX_MESSAGE_LENGTH must be a number")?, + max_website_length: env::var("BOOK_MAX_WEBSITE_LENGTH") + .unwrap_or_else(|_| "100".into()) + .parse() + .map_err(|_| "BOOK_MAX_WEBSITE_LENGTH must be a number")?, }) } } @@ -54,9 +59,13 @@ impl Config { #[cfg(test)] mod tests { use super::*; + use std::sync::Mutex; + + static ENV_LOCK: Mutex<()> = Mutex::new(()); #[test] fn test_from_env() { + let _lock = ENV_LOCK.lock().unwrap(); env::set_var("BOOK_PORT", "9999"); env::set_var("BOOK_DATA_DIR", "/tmp/gb"); env::set_var("BOOK_SITE_TITLE", "test.rs"); @@ -83,6 +92,7 @@ mod tests { #[test] fn test_defaults() { + let _lock = ENV_LOCK.lock().unwrap(); env::set_var("BOOK_SITE_URL", "https://test.rs"); env::set_var("BOOK_TELEGRAM_BOT_TOKEN", "123:ABC"); env::set_var("BOOK_TELEGRAM_CHAT_ID", "12345"); @@ -99,6 +109,7 @@ mod tests { #[test] fn test_missing_required() { + let _lock = ENV_LOCK.lock().unwrap(); env::remove_var("BOOK_SITE_URL"); env::remove_var("BOOK_TELEGRAM_BOT_TOKEN"); env::remove_var("BOOK_TELEGRAM_CHAT_ID"); diff --git a/src/web.rs b/src/web.rs index 17f9761..7a53b51 100644 --- a/src/web.rs +++ b/src/web.rs @@ -69,8 +69,9 @@ async fn submit( if max_name > 0 && name.len() > max_name { return Html(format!("Name is too long (max {max_name} chars).")); } - if website.len() > 100 { - return Html("Website is too long (max 100 chars).".to_string()); + let max_web = state.config.max_website_length; + if max_web > 0 && website.len() > max_web { + return Html(format!("Website is too long (max {max_web} chars).")); } let max_msg = state.config.max_message_length; if max_msg > 0 && message.len() > max_msg {