fix: temp fix for spam attack via notification bug abuse, but git actually commits the changes this time

This commit is contained in:
IAmTomahawkx
2024-10-06 13:22:13 -07:00
parent d9deadc65a
commit 397b9878e1

View File

@@ -1,4 +1,4 @@
use std::collections::HashSet; use std::{collections::HashSet, hash::RandomState};
use indexmap::{IndexMap, IndexSet}; use indexmap::{IndexMap, IndexSet};
use iso8601_timestamp::Timestamp; use iso8601_timestamp::Timestamp;
@@ -305,6 +305,18 @@ impl Message {
..Default::default() ..Default::default()
}; };
// Parse mentions in message.
let mut mentions = HashSet::new();
if allow_mentions {
if let Some(content) = &data.content {
for capture in RE_MENTION.captures_iter(content) {
if let Some(mention) = capture.get(1) {
mentions.insert(mention.as_str().to_string());
}
}
}
}
// Verify replies are valid. // Verify replies are valid.
let mut replies = HashSet::new(); let mut replies = HashSet::new();
if let Some(entries) = data.replies { if let Some(entries) = data.replies {
@@ -325,29 +337,27 @@ impl Message {
} }
} }
// Parse mentions in message.
let mut mentions = HashSet::new();
if allow_mentions {
if let Some(content) = &data.content {
for capture in RE_MENTION.captures_iter(content) {
if let Some(mention) = capture.get(1) {
mentions.insert(mention.as_str().to_string());
}
}
}
}
if !mentions.is_empty() { if !mentions.is_empty() {
// FIXME: temp fix to stop spam attacks // FIXME: temp fix to stop spam attacks
match channel { match channel {
Channel::DirectMessage { recipients, .. } | Channel::Group { recipients, .. } => { Channel::DirectMessage { ref recipients, .. }
mentions = mentions.intersection(recipients); | Channel::Group { ref recipients, .. } => {
let recipients_hash: HashSet<&String, RandomState> =
HashSet::from_iter(recipients.iter());
mentions.retain(|m| recipients_hash.contains(m));
} }
Channel::TextChannel { server, .. } | Channel::VoiceChannel { server, .. } => { Channel::TextChannel { ref server, .. }
let valid_members = db.fetch_members(server.into(), mentions).await; | Channel::VoiceChannel { ref server, .. } => {
let mentions_vec = Vec::from_iter(mentions.iter().cloned());
let valid_members = db.fetch_members(server.as_str(), &mentions_vec[..]).await;
if let Ok(valid_members) = valid_members { if let Ok(valid_members) = valid_members {
let valid_ids = valid_members.iter().map(|member| member.id.user); let valid_ids: HashSet<String, RandomState> = HashSet::from_iter(
mentions = mentions.intersection(valid_ids); valid_members.iter().map(|member| member.id.user.clone()),
);
mentions.retain(|m| valid_ids.contains(m));
} else {
revolt_config::capture_error(&valid_members.unwrap_err());
} }
} }
Channel::SavedMessages { .. } => mentions.clear(), Channel::SavedMessages { .. } => mentions.clear(),