feat: block mentions from low trust users (account created < 12 hours)

This commit is contained in:
Paul Makles
2024-02-10 01:04:52 +00:00
parent 513461c99a
commit 8f4d6c864b
4 changed files with 48 additions and 5 deletions

View File

@@ -212,6 +212,7 @@ impl Message {
author: MessageAuthor<'_>, author: MessageAuthor<'_>,
mut idempotency: IdempotencyKey, mut idempotency: IdempotencyKey,
generate_embeds: bool, generate_embeds: bool,
allow_mentions: bool,
) -> Result<Message> { ) -> Result<Message> {
let config = config().await; let config = config().await;
@@ -272,10 +273,12 @@ impl Message {
// Parse mentions in message. // Parse mentions in message.
let mut mentions = HashSet::new(); let mut mentions = HashSet::new();
if let Some(content) = &data.content { if allow_mentions {
for capture in RE_MENTION.captures_iter(content) { if let Some(content) = &data.content {
if let Some(mention) = capture.get(1) { for capture in RE_MENTION.captures_iter(content) {
mentions.insert(mention.as_str().to_string()); if let Some(mention) = capture.get(1) {
mentions.insert(mention.as_str().to_string());
}
} }
} }
} }
@@ -292,7 +295,7 @@ impl Message {
for ReplyIntent { id, mention } in entries { for ReplyIntent { id, mention } in entries {
let message = db.fetch_message(&id).await?; let message = db.fetch_message(&id).await?;
if mention { if mention && allow_mentions {
mentions.insert(message.author.to_owned()); mentions.insert(message.author.to_owned());
} }

View File

@@ -444,6 +444,26 @@ impl<'a> DatabasePermissionQuery<'a> {
..self ..self
} }
} }
/// Access the underlying user
pub fn user_ref(&self) -> &Option<Cow<User>> {
&self.user
}
/// Access the underlying server
pub fn channel_ref(&self) -> &Option<Cow<Channel>> {
&self.channel
}
/// Access the underlying server
pub fn server_ref(&self) -> &Option<Cow<Server>> {
&self.server
}
/// Access the underlying member
pub fn member_ref(&self) -> &Option<Cow<Member>> {
&self.member
}
} }
/// Short-hand for creating a permission calculator /// Short-hand for creating a permission calculator

View File

@@ -1,3 +1,4 @@
use chrono::{Duration, Utc};
use revolt_database::util::permissions::DatabasePermissionQuery; use revolt_database::util::permissions::DatabasePermissionQuery;
use revolt_database::{ use revolt_database::{
util::idempotency::IdempotencyKey, util::reference::Reference, Database, User, util::idempotency::IdempotencyKey, util::reference::Reference, Database, User,
@@ -61,6 +62,23 @@ pub async fn message_send(
interactions.validate(db, &permissions).await?; interactions.validate(db, &permissions).await?;
} }
// Disallow mentions for new users (TRUST-0: <12 hours age) in public servers
let allow_mentions = if let Some(server) = query.server_ref() {
if server.discoverable {
if (Utc::now() - ulid::Ulid::from_string(&user.id).unwrap().datetime())
< Duration::hours(12)
{
false
} else {
true
}
} else {
true
}
} else {
true
};
// Create the message // Create the message
let author: v0::User = user.clone().into(db, Some(&user)).await; let author: v0::User = user.clone().into(db, Some(&user)).await;
Ok(Json( Ok(Json(
@@ -71,6 +89,7 @@ pub async fn message_send(
v0::MessageAuthor::User(&author), v0::MessageAuthor::User(&author),
idempotency, idempotency,
permissions.has_channel_permission(ChannelPermission::SendEmbeds), permissions.has_channel_permission(ChannelPermission::SendEmbeds),
allow_mentions,
) )
.await? .await?
.into(), .into(),

View File

@@ -60,6 +60,7 @@ pub async fn webhook_execute(
v0::MessageAuthor::Webhook(&webhook.into()), v0::MessageAuthor::Webhook(&webhook.into()),
idempotency, idempotency,
true, true,
true,
) )
.await? .await?
.into(), .into(),