From e7e9b4919593761f2ee57ce3a6a23bcf0e28dfb8 Mon Sep 17 00:00:00 2001 From: trisua Date: Sun, 30 Mar 2025 22:33:07 -0400 Subject: [PATCH] fix: make usernames and community titles case insensitive --- crates/app/src/routes/pages/communities.rs | 2 +- crates/core/src/database/auth.rs | 7 ++++++- crates/core/src/database/common.rs | 2 ++ crates/core/src/database/communities.rs | 8 ++++++-- 4 files changed, 15 insertions(+), 4 deletions(-) diff --git a/crates/app/src/routes/pages/communities.rs b/crates/app/src/routes/pages/communities.rs index 456c1da..371d454 100644 --- a/crates/app/src/routes/pages/communities.rs +++ b/crates/app/src/routes/pages/communities.rs @@ -101,7 +101,7 @@ pub async fn feed_request( let data = data.read().await; let user = get_user_from_token!(jar, data.0); - let community = match data.0.get_community_by_title(&title).await { + let community = match data.0.get_community_by_title(&title.to_lowercase()).await { Ok(ua) => ua, Err(e) => return Err(Html(render_error(e, &jar, &data, &user).await)), }; diff --git a/crates/core/src/database/auth.rs b/crates/core/src/database/auth.rs index 7da7a47..b3e7df9 100644 --- a/crates/core/src/database/auth.rs +++ b/crates/core/src/database/auth.rs @@ -84,6 +84,11 @@ impl DataManager { return Err(Error::DataTooShort("password".to_string())); } + // make sure username isn't taken + if self.get_user_by_username(&data.username).await.is_ok() { + return Err(Error::MiscError("Username in use".to_string())); + } + // ... let conn = match self.connect().await { Ok(c) => c, @@ -96,7 +101,7 @@ impl DataManager { &[ &data.id.to_string().as_str(), &data.created.to_string().as_str(), - &data.username.as_str(), + &data.username.to_lowercase().as_str(), &data.password.as_str(), &data.salt.as_str(), &serde_json::to_string(&data.settings).unwrap().as_str(), diff --git a/crates/core/src/database/common.rs b/crates/core/src/database/common.rs index 703a53a..bbe0740 100644 --- a/crates/core/src/database/common.rs +++ b/crates/core/src/database/common.rs @@ -98,6 +98,8 @@ macro_rules! auto_method { ($name:ident($selector_t:ty)@$select_fn:ident -> $query:literal --name=$name_:literal --returns=$returns_:tt --cache-key-tmpl=$cache_key_tmpl:literal) => { pub async fn $name(&self, selector: $selector_t) -> Result<$returns_> { + let selector = selector.to_string().to_lowercase(); + if let Some(cached) = self.2.get(format!($cache_key_tmpl, selector)).await { return Ok(serde_json::from_str(&cached).unwrap()); } diff --git a/crates/core/src/database/communities.rs b/crates/core/src/database/communities.rs index 66344e9..a5846bc 100644 --- a/crates/core/src/database/communities.rs +++ b/crates/core/src/database/communities.rs @@ -61,7 +61,11 @@ impl DataManager { } // make sure community doesn't already exist with title - if self.get_community_by_title(&data.title).await.is_ok() { + if self + .get_community_by_title(&data.title.to_lowercase()) + .await + .is_ok() + { return Err(Error::MiscError("Title already in use".to_string())); } @@ -77,7 +81,7 @@ impl DataManager { &[ &data.id.to_string().as_str(), &data.created.to_string().as_str(), - &data.title.as_str(), + &data.title.to_lowercase().as_str(), &serde_json::to_string(&data.context).unwrap().as_str(), &data.owner.to_string().as_str(), &serde_json::to_string(&data.read_access).unwrap().as_str(),