Merge branch 'as-fix' into 'master'
fix: apply the same appservice sending rules to events coming from federation See merge request famedly/conduit!31next
commit
a04860b513
|
@ -2,6 +2,7 @@ use crate::{client_server, utils, ConduitResult, Database, Error, PduEvent, Resu
|
||||||
use get_profile_information::v1::ProfileField;
|
use get_profile_information::v1::ProfileField;
|
||||||
use http::header::{HeaderValue, AUTHORIZATION, HOST};
|
use http::header::{HeaderValue, AUTHORIZATION, HOST};
|
||||||
use log::{info, warn};
|
use log::{info, warn};
|
||||||
|
use regex::Regex;
|
||||||
use rocket::{get, post, put, response::content::Json, State};
|
use rocket::{get, post, put, response::content::Json, State};
|
||||||
use ruma::{
|
use ruma::{
|
||||||
api::{
|
api::{
|
||||||
|
@ -18,6 +19,7 @@ use ruma::{
|
||||||
OutgoingRequest,
|
OutgoingRequest,
|
||||||
},
|
},
|
||||||
directory::{IncomingFilter, IncomingRoomNetwork},
|
directory::{IncomingFilter, IncomingRoomNetwork},
|
||||||
|
events::EventType,
|
||||||
EventId, RoomId, ServerName, ServerSigningKeyId, UserId,
|
EventId, RoomId, ServerName, ServerSigningKeyId, UserId,
|
||||||
};
|
};
|
||||||
use std::{
|
use std::{
|
||||||
|
@ -584,9 +586,70 @@ pub async fn send_transaction_message_route<'a>(
|
||||||
db.rooms.set_room_state(&room_id, &next_room_state)?;
|
db.rooms.set_room_state(&room_id, &next_room_state)?;
|
||||||
|
|
||||||
for appservice in db.appservice.iter_all().filter_map(|r| r.ok()) {
|
for appservice in db.appservice.iter_all().filter_map(|r| r.ok()) {
|
||||||
|
if let Some(namespaces) = appservice.1.get("namespaces") {
|
||||||
|
let users = namespaces
|
||||||
|
.get("users")
|
||||||
|
.and_then(|users| users.as_sequence())
|
||||||
|
.map_or_else(
|
||||||
|
|| Vec::new(),
|
||||||
|
|users| {
|
||||||
|
users
|
||||||
|
.iter()
|
||||||
|
.map(|users| {
|
||||||
|
users
|
||||||
|
.get("regex")
|
||||||
|
.and_then(|regex| regex.as_str())
|
||||||
|
.and_then(|regex| Regex::new(regex).ok())
|
||||||
|
})
|
||||||
|
.filter_map(|o| o)
|
||||||
|
.collect::<Vec<_>>()
|
||||||
|
},
|
||||||
|
);
|
||||||
|
let aliases = namespaces
|
||||||
|
.get("aliases")
|
||||||
|
.and_then(|users| users.get("regex"))
|
||||||
|
.and_then(|regex| regex.as_str())
|
||||||
|
.and_then(|regex| Regex::new(regex).ok());
|
||||||
|
let rooms = namespaces
|
||||||
|
.get("rooms")
|
||||||
|
.and_then(|rooms| rooms.as_sequence());
|
||||||
|
|
||||||
|
let room_aliases = db.rooms.room_aliases(&room_id);
|
||||||
|
|
||||||
|
let bridge_user_id = appservice
|
||||||
|
.1
|
||||||
|
.get("sender_localpart")
|
||||||
|
.and_then(|string| string.as_str())
|
||||||
|
.and_then(|string| {
|
||||||
|
UserId::parse_with_server_name(string, db.globals.server_name()).ok()
|
||||||
|
});
|
||||||
|
|
||||||
|
if bridge_user_id.map_or(false, |bridge_user_id| {
|
||||||
|
db.rooms
|
||||||
|
.is_joined(&bridge_user_id, room_id)
|
||||||
|
.unwrap_or(false)
|
||||||
|
}) || users.iter().any(|users| {
|
||||||
|
users.is_match(pdu.sender.as_str())
|
||||||
|
|| pdu.kind == EventType::RoomMember
|
||||||
|
&& pdu
|
||||||
|
.state_key
|
||||||
|
.as_ref()
|
||||||
|
.map_or(false, |state_key| users.is_match(&state_key))
|
||||||
|
}) || aliases.map_or(false, |aliases| {
|
||||||
|
room_aliases
|
||||||
|
.filter_map(|r| r.ok())
|
||||||
|
.any(|room_alias| aliases.is_match(room_alias.as_str()))
|
||||||
|
}) || rooms.map_or(false, |rooms| rooms.contains(&room_id.as_str().into()))
|
||||||
|
|| db
|
||||||
|
.rooms
|
||||||
|
.room_members(&room_id)
|
||||||
|
.filter_map(|r| r.ok())
|
||||||
|
.any(|member| users.iter().any(|regex| regex.is_match(member.as_str())))
|
||||||
|
{
|
||||||
db.sending.send_pdu_appservice(&appservice.0, &pdu_id)?;
|
db.sending.send_pdu_appservice(&appservice.0, &pdu_id)?;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
resolved_map.insert(event_id, Ok::<(), String>(()));
|
resolved_map.insert(event_id, Ok::<(), String>(()));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue