update ruma appservice Registration type MR

from https://gitlab.com/famedly/conduit/-/merge_requests/583

and fixed panic from blocking async call in timeline/mod.rs

Co-authored-by: strawberry <strawberry@puppygock.gay>
Signed-off-by: strawberry <strawberry@puppygock.gay>
This commit is contained in:
Matthias Ahouansou 2024-03-08 10:50:52 -05:00 committed by June
parent 019a82850d
commit 5ab76a1332
10 changed files with 156 additions and 62 deletions

View file

@ -1,13 +1,12 @@
use std::{collections::HashSet, sync::Arc};
use ruma::{
api::appservice::Registration,
events::{AnyStrippedStateEvent, AnySyncStateEvent},
serde::Raw,
OwnedRoomId, OwnedServerName, OwnedUserId, RoomId, ServerName, UserId,
};
use crate::Result;
use crate::{service::appservice::RegistrationInfo, Result};
type StrippedStateEventIter<'a> = Box<dyn Iterator<Item = Result<(OwnedRoomId, Vec<Raw<AnyStrippedStateEvent>>)>> + 'a>;
@ -25,7 +24,7 @@ pub trait Data: Send + Sync {
fn get_our_real_users(&self, room_id: &RoomId) -> Result<Arc<HashSet<OwnedUserId>>>;
fn appservice_in_room(&self, room_id: &RoomId, appservice: &(String, Registration)) -> Result<bool>;
fn appservice_in_room(&self, room_id: &RoomId, appservice: &RegistrationInfo) -> Result<bool>;
/// Makes a user forget a room.
fn forget(&self, room_id: &RoomId, user_id: &UserId) -> Result<()>;

View file

@ -2,7 +2,7 @@ use std::{collections::HashSet, sync::Arc};
pub use data::Data;
use ruma::{
api::{appservice::Registration, federation},
api::federation,
events::{
direct::DirectEvent,
ignored_user_list::IgnoredUserListEvent,
@ -17,7 +17,7 @@ use ruma::{
};
use tracing::warn;
use crate::{services, Error, Result};
use crate::{service::appservice::RegistrationInfo, services, Error, Result};
mod data;
@ -201,7 +201,7 @@ impl Service {
}
#[tracing::instrument(skip(self, room_id, appservice))]
pub fn appservice_in_room(&self, room_id: &RoomId, appservice: &(String, Registration)) -> Result<bool> {
pub fn appservice_in_room(&self, room_id: &RoomId, appservice: &RegistrationInfo) -> Result<bool> {
self.db.appservice_in_room(room_id, appservice)
}

View file

@ -7,7 +7,6 @@ use std::{
};
pub use data::Data;
use regex::Regex;
use ruma::{
api::{client::error::ErrorKind, federation},
canonical_json::to_canonical_value,
@ -36,7 +35,10 @@ use tracing::{error, info, warn};
use super::state_compressor::CompressedStateEvent;
use crate::{
api::server_server,
service::pdu::{EventHash, PduBuilder},
service::{
appservice::NamespaceRegex,
pdu::{EventHash, PduBuilder},
},
services, utils, Error, PduEvent, Result,
};
@ -506,9 +508,9 @@ impl Service {
}
}
for appservice in services().appservice.all()? {
if services().rooms.state_cache.appservice_in_room(&pdu.room_id, &appservice)? {
services().sending.send_pdu_appservice(appservice.0, pdu_id.clone())?;
for appservice in services().appservice.registration_info.read().await.values() {
if services().rooms.state_cache.appservice_in_room(&pdu.room_id, appservice)? {
services().sending.send_pdu_appservice(appservice.registration.id.clone(), pdu_id.clone())?;
continue;
}
@ -518,30 +520,20 @@ impl Service {
if let Some(state_key_uid) =
&pdu.state_key.as_ref().and_then(|state_key| UserId::parse(state_key.as_str()).ok())
{
let appservice_uid = appservice.1.sender_localpart.as_str();
let appservice_uid = appservice.registration.sender_localpart.as_str();
if state_key_uid == appservice_uid {
services().sending.send_pdu_appservice(appservice.0, pdu_id.clone())?;
services().sending.send_pdu_appservice(appservice.registration.id.clone(), pdu_id.clone())?;
continue;
}
}
}
let namespaces = appservice.1.namespaces;
// TODO: create some helper function to change from Strings to Regexes
let users =
namespaces.users.iter().filter_map(|user| Regex::new(user.regex.as_str()).ok()).collect::<Vec<_>>();
let aliases =
namespaces.aliases.iter().filter_map(|alias| Regex::new(alias.regex.as_str()).ok()).collect::<Vec<_>>();
let rooms =
namespaces.rooms.iter().filter_map(|room| Regex::new(room.regex.as_str()).ok()).collect::<Vec<_>>();
let matching_users = |users: &Regex| {
users.is_match(pdu.sender.as_str())
let matching_users = |users: &NamespaceRegex| {
appservice.users.is_match(pdu.sender.as_str())
|| pdu.kind == TimelineEventType::RoomMember
&& pdu.state_key.as_ref().map_or(false, |state_key| users.is_match(state_key))
};
let matching_aliases = |aliases: &Regex| {
let matching_aliases = |aliases: &NamespaceRegex| {
services()
.rooms
.alias
@ -550,11 +542,11 @@ impl Service {
.any(|room_alias| aliases.is_match(room_alias.as_str()))
};
if aliases.iter().any(matching_aliases)
|| rooms.iter().any(|namespace| namespace.is_match(pdu.room_id.as_str()))
|| users.iter().any(matching_users)
if matching_aliases(&appservice.aliases)
|| appservice.rooms.is_match(pdu.room_id.as_str())
|| matching_users(&appservice.users)
{
services().sending.send_pdu_appservice(appservice.0, pdu_id.clone())?;
services().sending.send_pdu_appservice(appservice.registration.id.clone(), pdu_id.clone())?;
}
}