diff --git a/src/routes/channels/group_create.rs b/src/routes/channels/group_create.rs index 6fccf6a2..1410600a 100644 --- a/src/routes/channels/group_create.rs +++ b/src/routes/channels/group_create.rs @@ -12,6 +12,8 @@ use serde::{Deserialize, Serialize}; use ulid::Ulid; use validator::Validate; +use crate::util::variables::MAX_GROUP_SIZE; + #[derive(Validate, Serialize, Deserialize)] pub struct Data { #[validate(length(min = 1, max = 32))] @@ -32,9 +34,8 @@ pub async fn req(db: &Db, user: User, info: Json) -> Result> let mut set: HashSet = HashSet::from_iter(info.users.into_iter()); set.insert(user.id.clone()); - // ! FIXME: un hard code this - if set.len() > 50 { - return Err(Error::GroupTooLarge { max: 50 }); + if set.len() > *MAX_GROUP_SIZE { + return Err(Error::GroupTooLarge { max: *MAX_GROUP_SIZE }); } for target in &set { diff --git a/src/routes/root.rs b/src/routes/root.rs index 1b8ea7dd..2f7daeea 100644 --- a/src/routes/root.rs +++ b/src/routes/root.rs @@ -1,15 +1,14 @@ -/*use crate::util::{ratelimit::Ratelimiter, variables::{ +use crate::util::{/*ratelimit::Ratelimiter,*/ variables::{ APP_URL, AUTUMN_URL, EXTERNAL_WS_URL, HCAPTCHA_SITEKEY, INVITE_ONLY, JANUARY_URL, USE_AUTUMN, USE_EMAIL, USE_HCAPTCHA, USE_JANUARY, USE_VOSO, VAPID_PUBLIC_KEY, VOSO_URL, VOSO_WS_HOST, -}};*/ +}}; use mongodb::bson::doc; use rocket::{http::Status, serde::json::Value}; #[get("/")] pub async fn root() -> Value { - todo!(); - /*json!({ + json!({ "revolt": crate::version::VERSION, "features": { "captcha": { @@ -35,7 +34,7 @@ pub async fn root() -> Value { "ws": *EXTERNAL_WS_URL, "app": *APP_URL, "vapid": *VAPID_PUBLIC_KEY - })*/ + }) } #[get("/ping")] diff --git a/src/util/mod.rs b/src/util/mod.rs index cf3e7364..c4850377 100644 --- a/src/util/mod.rs +++ b/src/util/mod.rs @@ -1,5 +1,5 @@ // pub mod result; -// pub mod variables; +pub mod variables; // pub mod ratelimit; pub mod regex; // pub mod idempotency; diff --git a/src/util/variables.rs b/src/util/variables.rs new file mode 100644 index 00000000..ad5d8121 --- /dev/null +++ b/src/util/variables.rs @@ -0,0 +1,105 @@ +use std::env; + +#[cfg(debug_assertions)] +use log::warn; + +lazy_static! { + // Application Settings + pub static ref MONGO_URI: String = + env::var("REVOLT_MONGO_URI").expect("Missing REVOLT_MONGO_URI environment variable."); + pub static ref REDIS_URI: String = + env::var("REVOLT_REDIS_URI").expect("Missing REVOLT_REDIS_URI environment variable."); + pub static ref WS_HOST: String = + env::var("REVOLT_WS_HOST").unwrap_or_else(|_| "0.0.0.0:9000".to_string()); + pub static ref PUBLIC_URL: String = + env::var("REVOLT_PUBLIC_URL").expect("Missing REVOLT_PUBLIC_URL environment variable."); + pub static ref APP_URL: String = + env::var("REVOLT_APP_URL").expect("Missing REVOLT_APP_URL environment variable."); + pub static ref EXTERNAL_WS_URL: String = + env::var("REVOLT_EXTERNAL_WS_URL").expect("Missing REVOLT_EXTERNAL_WS_URL environment variable."); + + pub static ref AUTUMN_URL: String = + env::var("AUTUMN_PUBLIC_URL").unwrap_or_else(|_| "https://example.com".to_string()); + pub static ref JANUARY_URL: String = + env::var("JANUARY_PUBLIC_URL").unwrap_or_else(|_| "https://example.com".to_string()); + pub static ref VOSO_URL: String = + env::var("VOSO_PUBLIC_URL").unwrap_or_else(|_| "https://example.com".to_string()); + pub static ref VOSO_WS_HOST: String = + env::var("VOSO_WS_HOST").unwrap_or_else(|_| "wss://example.com".to_string()); + pub static ref VOSO_MANAGE_TOKEN: String = + env::var("VOSO_MANAGE_TOKEN").unwrap_or_else(|_| "0".to_string()); + + pub static ref HCAPTCHA_KEY: String = + env::var("REVOLT_HCAPTCHA_KEY").unwrap_or_else(|_| "0x0000000000000000000000000000000000000000".to_string()); + pub static ref HCAPTCHA_SITEKEY: String = + env::var("REVOLT_HCAPTCHA_SITEKEY").unwrap_or_else(|_| "10000000-ffff-ffff-ffff-000000000001".to_string()); + pub static ref VAPID_PRIVATE_KEY: String = + env::var("REVOLT_VAPID_PRIVATE_KEY").expect("Missing REVOLT_VAPID_PRIVATE_KEY environment variable."); + pub static ref VAPID_PUBLIC_KEY: String = + env::var("REVOLT_VAPID_PUBLIC_KEY").expect("Missing REVOLT_VAPID_PUBLIC_KEY environment variable."); + + // Application Flags + pub static ref INVITE_ONLY: bool = env::var("REVOLT_INVITE_ONLY").map_or(false, |v| v == "1"); + pub static ref USE_EMAIL: bool = env::var("REVOLT_USE_EMAIL_VERIFICATION").map_or( + env::var("REVOLT_SMTP_HOST").is_ok() + && env::var("REVOLT_SMTP_USERNAME").is_ok() + && env::var("REVOLT_SMTP_PASSWORD").is_ok() + && env::var("REVOLT_SMTP_FROM").is_ok(), + |v| v == *"1" + ); + pub static ref USE_HCAPTCHA: bool = env::var("REVOLT_HCAPTCHA_KEY").is_ok(); + pub static ref USE_AUTUMN: bool = env::var("AUTUMN_PUBLIC_URL").is_ok(); + pub static ref USE_JANUARY: bool = env::var("JANUARY_PUBLIC_URL").is_ok(); + pub static ref USE_VOSO: bool = env::var("VOSO_PUBLIC_URL").is_ok() && env::var("VOSO_MANAGE_TOKEN").is_ok(); + + // SMTP Settings + pub static ref SMTP_HOST: String = + env::var("REVOLT_SMTP_HOST").unwrap_or_else(|_| "".to_string()); + pub static ref SMTP_USERNAME: String = + env::var("REVOLT_SMTP_USERNAME").unwrap_or_else(|_| "".to_string()); + pub static ref SMTP_PASSWORD: String = + env::var("REVOLT_SMTP_PASSWORD").unwrap_or_else(|_| "".to_string()); + pub static ref SMTP_FROM: String = env::var("REVOLT_SMTP_FROM").unwrap_or_else(|_| "".to_string()); + + // Application Logic Settings + pub static ref MAX_GROUP_SIZE: usize = + env::var("REVOLT_MAX_GROUP_SIZE").unwrap_or_else(|_| "50".to_string()).parse().unwrap(); + pub static ref MAX_BOT_COUNT: usize = + env::var("REVOLT_MAX_BOT_COUNT").unwrap_or_else(|_| "5".to_string()).parse().unwrap(); + pub static ref MAX_EMBED_COUNT: usize = + env::var("REVOLT_MAX_EMBED_COUNT").unwrap_or_else(|_| "5".to_string()).parse().unwrap(); + pub static ref MAX_SERVER_COUNT: usize = + env::var("REVOLT_MAX_SERVER_COUNT").unwrap_or_else(|_| "100".to_string()).parse().unwrap(); + pub static ref EARLY_ADOPTER_BADGE: i64 = + env::var("REVOLT_EARLY_ADOPTER_BADGE").unwrap_or_else(|_| "0".to_string()).parse().unwrap(); +} + +pub fn preflight_checks() { + format!("url = {}", *APP_URL); + format!("mongo = {}", *MONGO_URI); + format!("public = {}", *PUBLIC_URL); + format!("external = {}", *EXTERNAL_WS_URL); + + format!("privkey = {}", *VAPID_PRIVATE_KEY); + format!("pubkey = {}", *VAPID_PUBLIC_KEY); + + if !(*USE_EMAIL) { + #[cfg(not(debug_assertions))] + if !env::var("REVOLT_UNSAFE_NO_EMAIL").map_or(false, |v| v == *"1") { + panic!("Running in production without email is not recommended, set REVOLT_UNSAFE_NO_EMAIL=1 to override."); + } + + #[cfg(debug_assertions)] + warn!("No SMTP settings specified! Remember to configure email."); + } + + if !(*USE_HCAPTCHA) { + #[cfg(not(debug_assertions))] + if !env::var("REVOLT_UNSAFE_NO_CAPTCHA").map_or(false, |v| v == *"1") { + panic!("Running in production without CAPTCHA is not recommended, set REVOLT_UNSAFE_NO_CAPTCHA=1 to override."); + } + + #[cfg(debug_assertions)] + warn!("No Captcha key specified! Remember to add hCaptcha key."); + } +}