From 345e4d5f13035d2eda85332d74a2f814c234e903 Mon Sep 17 00:00:00 2001 From: Paul Makles Date: Thu, 1 Sep 2022 09:41:00 +0100 Subject: [PATCH] fix: validate categories --- .../delta/src/routes/servers/server_edit.rs | 42 +++++++++++++------ .../quark/src/impl/generic/servers/server.rs | 14 ++++--- crates/quark/src/traits/mod.rs | 2 + 3 files changed, 39 insertions(+), 19 deletions(-) diff --git a/crates/delta/src/routes/servers/server_edit.rs b/crates/delta/src/routes/servers/server_edit.rs index 29961b5a..3c891078 100644 --- a/crates/delta/src/routes/servers/server_edit.rs +++ b/crates/delta/src/routes/servers/server_edit.rs @@ -1,3 +1,5 @@ +use std::collections::HashSet; + use revolt_quark::{ models::{ server::{Category, FieldsServer, PartialServer, SystemMessageChannels}, @@ -135,29 +137,43 @@ pub async fn req( } } - // 2. Apply new icon + // 2. Validate changes + let mut unknown_channels = HashSet::new(); + if let Some(system_messages) = &partial.system_messages { + unknown_channels = system_messages.clone().into_channel_ids(); + } + + if let Some(categories) = &partial.categories { + let mut channel_ids = HashSet::new(); + for category in categories { + for channel in &category.channels { + if channel_ids.contains(channel) { + return Err(Error::InvalidOperation); + } + + channel_ids.insert(channel.to_string()); + } + } + + unknown_channels.extend(channel_ids); + } + + if !db.check_channels_exist(&unknown_channels).await? { + return Err(Error::NotFound); + } + + // 3. Apply new icon if let Some(icon) = icon { partial.icon = Some(File::use_server_icon(db, &icon, &server.id).await?); server.icon = partial.icon.clone(); } - // 3. Apply new banner + // 4. Apply new banner if let Some(banner) = banner { partial.banner = Some(File::use_banner(db, &banner, &server.id).await?); server.banner = partial.banner.clone(); } - // 4. Validate changes - if let Some(system_messages) = &partial.system_messages { - let channels = system_messages.clone().into_channel_ids(); - if !db - .check_channels_exist(&channels.into_iter().collect()) - .await? - { - return Err(Error::NotFound); - } - } - server .update(db, partial, remove.unwrap_or_default()) .await?; diff --git a/crates/quark/src/impl/generic/servers/server.rs b/crates/quark/src/impl/generic/servers/server.rs index 6b522358..63ec02c9 100644 --- a/crates/quark/src/impl/generic/servers/server.rs +++ b/crates/quark/src/impl/generic/servers/server.rs @@ -1,3 +1,5 @@ +use std::collections::HashSet; + use iso8601_timestamp::Timestamp; use ulid::Ulid; @@ -310,23 +312,23 @@ impl Server { } impl SystemMessageChannels { - pub fn into_channel_ids(self) -> Vec { - let mut ids = vec![]; + pub fn into_channel_ids(self) -> HashSet { + let mut ids = HashSet::new(); if let Some(id) = self.user_joined { - ids.push(id); + ids.insert(id); } if let Some(id) = self.user_left { - ids.push(id); + ids.insert(id); } if let Some(id) = self.user_kicked { - ids.push(id); + ids.insert(id); } if let Some(id) = self.user_banned { - ids.push(id); + ids.insert(id); } ids diff --git a/crates/quark/src/traits/mod.rs b/crates/quark/src/traits/mod.rs index 93764ed8..34637000 100644 --- a/crates/quark/src/traits/mod.rs +++ b/crates/quark/src/traits/mod.rs @@ -1,3 +1,5 @@ +use crate::Result; + mod admin { pub mod migrations; }