From 08c1aa6f5d4f110baf7a5a217f4bbaa3220e9790 Mon Sep 17 00:00:00 2001 From: Paul Date: Thu, 4 Nov 2021 20:50:30 +0000 Subject: [PATCH] feat(messaging): add masquerade to messages --- set_version.sh | 2 +- src/database/entities/message.rs | 20 ++++++++++++++++++-- src/database/migrations/scripts.rs | 2 +- src/database/permissions/channel.rs | 5 ++++- src/routes/channels/message_send.rs | 11 ++++++++++- src/version.rs | 2 +- 6 files changed, 35 insertions(+), 7 deletions(-) diff --git a/set_version.sh b/set_version.sh index f758cd74..b08cb9d9 100755 --- a/set_version.sh +++ b/set_version.sh @@ -1,3 +1,3 @@ #!/bin/bash -export version=0.5.3-alpha.7 +export version=0.5.3-alpha.8 echo "pub const VERSION: &str = \"${version}\";" > src/version.rs diff --git a/src/database/entities/message.rs b/src/database/entities/message.rs index 462f9ba2..27a9229d 100644 --- a/src/database/entities/message.rs +++ b/src/database/entities/message.rs @@ -9,6 +9,7 @@ use mongodb::bson::{doc, to_bson, DateTime}; use rocket::serde::json::Value; use serde::{Deserialize, Serialize}; use ulid::Ulid; +use validator::Validate; use std::time::SystemTime; #[derive(Serialize, Deserialize, Debug, Clone)] @@ -123,6 +124,7 @@ impl Content { target.id().to_string(), self, None, + None, None ) .publish(&target, false) @@ -130,6 +132,16 @@ impl Content { } } +#[derive(Serialize, Deserialize, Debug, Clone, Validate)] +pub struct Masquerade { + #[serde(skip_serializing_if = "Option::is_none")] + #[validate(length(min = 1, max = 32))] + name: Option, + #[serde(skip_serializing_if = "Option::is_none")] + #[validate(length(min = 1, max = 128))] + avatar: Option +} + #[derive(Serialize, Deserialize, Debug, Clone)] pub struct Message { #[serde(rename = "_id")] @@ -149,7 +161,9 @@ pub struct Message { #[serde(skip_serializing_if = "Option::is_none")] pub mentions: Option>, #[serde(skip_serializing_if = "Option::is_none")] - pub replies: Option> + pub replies: Option>, + #[serde(skip_serializing_if = "Option::is_none")] + pub masquerade: Option } impl Message { @@ -159,6 +173,7 @@ impl Message { content: Content, mentions: Option>, replies: Option>, + masquerade: Option, ) -> Message { Message { id: Ulid::new().to_string(), @@ -170,7 +185,8 @@ impl Message { edited: None, embeds: None, mentions, - replies + replies, + masquerade } } diff --git a/src/database/migrations/scripts.rs b/src/database/migrations/scripts.rs index 7273d61b..cbf5ac3d 100644 --- a/src/database/migrations/scripts.rs +++ b/src/database/migrations/scripts.rs @@ -11,7 +11,7 @@ struct MigrationInfo { revision: i32, } -pub const LATEST_REVISION: i32 = 10; +pub const LATEST_REVISION: i32 = 11; pub async fn migrate_database() { let migrations = get_collection("migrations"); diff --git a/src/database/permissions/channel.rs b/src/database/permissions/channel.rs index f303090c..6427d741 100644 --- a/src/database/permissions/channel.rs +++ b/src/database/permissions/channel.rs @@ -17,6 +17,7 @@ pub enum ChannelPermission { InviteOthers = 0b00000000000000000000000000100000, // 32 EmbedLinks = 0b00000000000000000000000001000000, // 64 UploadFiles = 0b00000000000000000000000010000000, // 128 + Masquerade = 0b00000000000000000000000100000000, // 256 } lazy_static! { @@ -27,7 +28,8 @@ lazy_static! { + ChannelPermission::VoiceCall + ChannelPermission::InviteOthers + ChannelPermission::EmbedLinks - + ChannelPermission::UploadFiles; + + ChannelPermission::UploadFiles + + ChannelPermission::Masquerade; pub static ref DEFAULT_PERMISSION_SERVER: u32 = ChannelPermission::View @@ -52,6 +54,7 @@ bitfield! { pub get_invite_others, _: 26; pub get_embed_links, _: 25; pub get_upload_files, _: 24; + pub get_masquerade, _: 23; } impl<'a> PermissionCalculator<'a> { diff --git a/src/routes/channels/message_send.rs b/src/routes/channels/message_send.rs index 97d0e24c..d58b0890 100644 --- a/src/routes/channels/message_send.rs +++ b/src/routes/channels/message_send.rs @@ -26,6 +26,8 @@ pub struct Data { attachments: Option>, nonce: Option, replies: Option>, + #[validate] + masquerade: Option } lazy_static! { @@ -62,11 +64,17 @@ pub async fn message_send(user: User, _r: Ratelimiter, mut idempotency: Idempote let mut mentions = HashSet::new(); for capture in RE_MENTION.captures_iter(&message.content) { - if let Some(mention) = capture.get(1) { + if let Some(mention) = capture.get(1) { mentions.insert(mention.as_str().to_string()); } } + if let Some(_) = &message.masquerade { + if !perm.get_masquerade() { + return Err(Error::MissingPermission) + } + } + let mut replies = HashSet::new(); if let Some(entries) = message.replies { // ! FIXME: move this to app config @@ -127,6 +135,7 @@ pub async fn message_send(user: User, _r: Ratelimiter, mut idempotency: Idempote } else { None }, + masquerade: message.masquerade }; msg.clone().publish(&target, perm.get_embed_links()).await?; diff --git a/src/version.rs b/src/version.rs index 60f16ed0..0283a23c 100644 --- a/src/version.rs +++ b/src/version.rs @@ -1 +1 @@ -pub const VERSION: &str = "0.5.3-alpha.7"; +pub const VERSION: &str = "0.5.3-alpha.8";