Prevent admin room from recursively spamming itself and user -> user

This commit is contained in:
Devin Ragotzy 2021-01-29 14:19:56 -05:00
parent 73124629b7
commit e4dc7ea8ac
4 changed files with 80 additions and 40 deletions

View File

@ -94,7 +94,10 @@ pub async fn get_pushrule_route(
if let Some(rule) = rule { if let Some(rule) = rule {
Ok(get_pushrule::Response { rule }.into()) Ok(get_pushrule::Response { rule }.into())
} else { } else {
Err(Error::BadRequest(ErrorKind::NotFound, "Push rule not found.").into()) Err(Error::BadRequest(
ErrorKind::NotFound,
"Push rule not found.",
))
} }
} }

View File

@ -182,7 +182,8 @@ pub async fn send_push_notice(
_ => None, _ => None,
}) })
.collect::<Vec<_>>(); .collect::<Vec<_>>();
send_notice(unread, pushers, tweaks, pdu, db).await?; send_notice(unread, pushers, tweaks, pdu, db, rule.rule_id.as_str()).await?;
break;
} }
} }
".m.rule.invite_for_me" => { ".m.rule.invite_for_me" => {
@ -201,7 +202,9 @@ pub async fn send_push_notice(
_ => None, _ => None,
}) })
.collect::<Vec<_>>(); .collect::<Vec<_>>();
send_notice(unread, pushers, tweaks, pdu, db).await?; send_notice(unread, pushers, tweaks, pdu, db, rule.rule_id.as_str())
.await?;
break;
} }
} }
} }
@ -231,7 +234,9 @@ pub async fn send_push_notice(
_ => None, _ => None,
}) })
.collect::<Vec<_>>(); .collect::<Vec<_>>();
send_notice(unread, pushers, tweaks, pdu, db).await?; send_notice(unread, pushers, tweaks, pdu, db, rule.rule_id.as_str())
.await?;
break;
} }
} }
} }
@ -255,7 +260,9 @@ pub async fn send_push_notice(
_ => None, _ => None,
}) })
.collect::<Vec<_>>(); .collect::<Vec<_>>();
send_notice(unread, pushers, tweaks, pdu, db).await?; send_notice(unread, pushers, tweaks, pdu, db, rule.rule_id.as_str())
.await?;
break;
} }
} }
} }
@ -270,7 +277,8 @@ pub async fn send_push_notice(
_ => None, _ => None,
}) })
.collect::<Vec<_>>(); .collect::<Vec<_>>();
send_notice(unread, pushers, tweaks, pdu, db).await?; send_notice(unread, pushers, tweaks, pdu, db, rule.rule_id.as_str()).await?;
break;
} }
} }
".m.rule.roomnotif" => { ".m.rule.roomnotif" => {
@ -307,7 +315,9 @@ pub async fn send_push_notice(
_ => None, _ => None,
}) })
.collect::<Vec<_>>(); .collect::<Vec<_>>();
send_notice(unread, pushers, tweaks, pdu, db).await?; send_notice(unread, pushers, tweaks, pdu, db, rule.rule_id.as_str())
.await?;
break;
} }
} }
} }
@ -331,7 +341,9 @@ pub async fn send_push_notice(
_ => None, _ => None,
}) })
.collect::<Vec<_>>(); .collect::<Vec<_>>();
send_notice(unread, pushers, tweaks, pdu, db).await?; send_notice(unread, pushers, tweaks, pdu, db, rule.rule_id.as_str())
.await?;
break;
} }
} }
} }
@ -346,7 +358,8 @@ pub async fn send_push_notice(
_ => None, _ => None,
}) })
.collect::<Vec<_>>(); .collect::<Vec<_>>();
send_notice(unread, pushers, tweaks, pdu, db).await?; send_notice(unread, pushers, tweaks, pdu, db, rule.rule_id.as_str()).await?;
break;
} }
} }
".m.rule.encrypted_room_one_to_one" => { ".m.rule.encrypted_room_one_to_one" => {
@ -361,7 +374,8 @@ pub async fn send_push_notice(
_ => None, _ => None,
}) })
.collect::<Vec<_>>(); .collect::<Vec<_>>();
send_notice(unread, pushers, tweaks, pdu, db).await?; send_notice(unread, pushers, tweaks, pdu, db, rule.rule_id.as_str()).await?;
break;
} }
} }
".m.rule.room_one_to_one" => { ".m.rule.room_one_to_one" => {
@ -376,7 +390,8 @@ pub async fn send_push_notice(
_ => None, _ => None,
}) })
.collect::<Vec<_>>(); .collect::<Vec<_>>();
send_notice(unread, pushers, tweaks, pdu, db).await?; send_notice(unread, pushers, tweaks, pdu, db, rule.rule_id.as_str()).await?;
break;
} }
} }
".m.rule.message" => { ".m.rule.message" => {
@ -389,7 +404,8 @@ pub async fn send_push_notice(
_ => None, _ => None,
}) })
.collect::<Vec<_>>(); .collect::<Vec<_>>();
send_notice(unread, pushers, tweaks, pdu, db).await?; send_notice(unread, pushers, tweaks, pdu, db, rule.rule_id.as_str()).await?;
break;
} }
} }
".m.rule.encrypted" => { ".m.rule.encrypted" => {
@ -402,12 +418,14 @@ pub async fn send_push_notice(
_ => None, _ => None,
}) })
.collect::<Vec<_>>(); .collect::<Vec<_>>();
send_notice(unread, pushers, tweaks, pdu, db).await?; send_notice(unread, pushers, tweaks, pdu, db, rule.rule_id.as_str()).await?;
break;
} }
} }
_ => {} _ => {}
} }
} }
Ok(()) Ok(())
} }
@ -417,6 +435,7 @@ async fn send_notice(
tweaks: Vec<Tweak>, tweaks: Vec<Tweak>,
event: &PduEvent, event: &PduEvent,
db: &Database, db: &Database,
name: &str,
) -> Result<()> { ) -> Result<()> {
let (http, _emails): (Vec<&Pusher>, _) = pushers let (http, _emails): (Vec<&Pusher>, _) = pushers
.iter() .iter()
@ -436,10 +455,15 @@ async fn send_notice(
}; };
let mut device = Device::new(pusher.app_id.clone(), pusher.pushkey.clone()); let mut device = Device::new(pusher.app_id.clone(), pusher.pushkey.clone());
device.data = Some(pusher.data.clone()); let mut data_minus_url = pusher.data.clone();
// The url must be stripped off according to spec
data_minus_url.url = None;
device.data = Some(data_minus_url);
// this is not done if "event_id_only" is the format // Tweaks are only added if the format is NOT event_id_only
if !event_id_only {
device.tweaks = tweaks.clone(); device.tweaks = tweaks.clone();
}
let d = &[device]; let d = &[device];
let mut notifi = Notification::new(d); let mut notifi = Notification::new(d);
@ -459,6 +483,7 @@ async fn send_notice(
} }
if event_id_only { if event_id_only {
error!("SEND PUSH NOTICE `{}`", name);
// send_request( // send_request(
// &db.globals, // &db.globals,
// &url, // &url,
@ -474,8 +499,8 @@ async fn send_notice(
notifi.user_is_target = event.state_key.as_deref() == Some(event.sender.as_str()); notifi.user_is_target = event.state_key.as_deref() == Some(event.sender.as_str());
} }
let name = db.users.displayname(&event.sender)?; let user_name = db.users.displayname(&event.sender)?;
notifi.sender_display_name = name.as_deref(); notifi.sender_display_name = user_name.as_deref();
let room_name = db let room_name = db
.rooms .rooms
.room_state_get(&event.room_id, &EventType::RoomName, "")? .room_state_get(&event.room_id, &EventType::RoomName, "")?
@ -486,12 +511,13 @@ async fn send_notice(
.flatten(); .flatten();
notifi.room_name = room_name.as_deref(); notifi.room_name = room_name.as_deref();
send_request( error!("SEND PUSH NOTICE Full `{}`", name);
&db.globals, // send_request(
&url, // &db.globals,
send_event_notification::v1::Request::new(notifi), // &url,
) // send_event_notification::v1::Request::new(notifi),
.await?; // )
// .await?;
} }
} }

View File

@ -27,10 +27,9 @@ use std::{
convert::{TryFrom, TryInto}, convert::{TryFrom, TryInto},
mem, mem,
sync::Arc, sync::Arc,
time::Duration,
}; };
use super::{admin::AdminCommand, sending::Sending}; use super::admin::AdminCommand;
/// The unique identifier of each state group. /// The unique identifier of each state group.
/// ///

View File

@ -364,17 +364,33 @@ impl Sending {
.filter_map(|r| r.ok()) .filter_map(|r| r.ok())
.collect::<Vec<_>>(); .collect::<Vec<_>>();
dbg!(&pdus);
for pdu in &pdus { for pdu in &pdus {
// Redacted events are not notification targets (we don't send push for them) // Redacted events are not notification targets (we don't send push for them)
if pdu.unsigned.get("redacted_because").is_some() { if pdu.unsigned.get("redacted_because").is_some() {
continue; continue;
} }
for user in db.rooms.room_members(&pdu.room_id) {
dbg!(&user);
// Skip events that came from the admin room
if db
.rooms
.room_aliases(&pdu.room_id)
.any(|alias| match alias {
Ok(a) => a.as_str().starts_with("#admins:"),
_ => false,
})
|| pdu.sender.as_str().starts_with("@conduit:")
{
continue;
}
for user in db.rooms.room_members(&pdu.room_id) {
let user = user.map_err(|e| (OutgoingKind::Push(id.clone()), e))?; let user = user.map_err(|e| (OutgoingKind::Push(id.clone()), e))?;
// Don't notify the user of their own events
if user == pdu.sender {
continue;
}
let pushers = db let pushers = db
.pusher .pusher
.get_pusher(&user) .get_pusher(&user)
@ -410,10 +426,6 @@ impl Sending {
uint!(0) uint!(0)
}; };
dbg!(&pushers);
// dbg!(&rules_for_user);
crate::database::pusher::send_push_notice( crate::database::pusher::send_push_notice(
&user, &user,
unread, unread,