1
0
Fork 0
mirror of https://gitlab.com/famedly/conduit.git synced 2025-07-02 16:38:36 +00:00

joining remote rooms works too now

This commit is contained in:
avdb13 2024-07-03 07:23:31 +02:00
parent f0ca5253aa
commit 2089ca8e3c
3 changed files with 71 additions and 57 deletions

View file

@ -1,3 +1,5 @@
use std::ops::Deref;
use super::{DEVICE_ID_LENGTH, SESSION_ID_LENGTH, TOKEN_LENGTH}; use super::{DEVICE_ID_LENGTH, SESSION_ID_LENGTH, TOKEN_LENGTH};
use crate::{ use crate::{
api::client_server::{self, membership::join_room_by_id_helper}, api::client_server::{self, membership::join_room_by_id_helper},
@ -15,7 +17,7 @@ use ruma::{
uiaa::{AuthFlow, AuthType, UiaaInfo}, uiaa::{AuthFlow, AuthType, UiaaInfo},
}, },
events::{room::message::RoomMessageEventContent, GlobalAccountDataEventType}, events::{room::message::RoomMessageEventContent, GlobalAccountDataEventType},
push, UserId, push, RoomId, UserId,
}; };
use tracing::{info, warn}; use tracing::{info, warn};
@ -291,29 +293,27 @@ pub async fn register_route(body: Ruma<register::v3::Request>) -> Result<registe
} }
} }
let default_rooms = services() let default_rooms = services().globals.default_rooms().await?;
.globals let servers: Vec<_> = default_rooms
.default_rooms() .iter()
.expect("default rooms should be validated on db startup"); .map(Deref::deref)
.filter_map(RoomId::server_name)
.map(Into::into)
.collect();
let _user_id = user_id.clone(); for room_id in default_rooms {
let servers = [services().globals.server_name().to_owned()]; if let Err(e) = join_room_by_id_helper(
Some(&user_id),
tokio::spawn(async move { room_id,
for room_id in default_rooms { Some("All men are equal before fish.".to_owned()),
let _ = join_room_by_id_helper( &servers,
Some(&_user_id), None,
room_id, )
Some("All men are equal before fish.".to_owned()), .await
&servers, {
None, warn!("Failed to join default room: {}", e);
)
.await
.inspect_err(|e| {
tracing::warn!("Failed to join default room: {e}");
});
} }
}); }
} }
Ok(register::v3::Response { Ok(register::v3::Response {

View file

@ -970,11 +970,11 @@ impl KeyValueDatabase {
db.presenceid_presence.clear()?; db.presenceid_presence.clear()?;
// Can only return an error during the first call // Can only return an error during the first call
services().globals.default_rooms().map_err(|e| { // services().globals.default_rooms().await.map_err(|e| {
tracing::error!("Invalid room ID or alias in join-by-default rooms: {}", e); // tracing::error!("Invalid room ID or alias in join-by-default rooms: {}", e);
Error::bad_config("Invalid room ID or alias in join-by-default rooms.") // Error::bad_config("Invalid room ID or alias in join-by-default rooms.")
})?; // })?;
services().admin.start_handler(); services().admin.start_handler();

View file

@ -10,7 +10,7 @@ use tokio::sync::OnceCell;
use crate::api::server_server::DestinationResponse; use crate::api::server_server::DestinationResponse;
use crate::{services, Config, Error, Result}; use crate::{services, Config, Error, Result};
use futures_util::FutureExt; use futures_util::{FutureExt, TryFutureExt};
use hickory_resolver::TokioAsyncResolver; use hickory_resolver::TokioAsyncResolver;
use hyper_util::client::legacy::connect::dns::{GaiResolver, Name as HyperName}; use hyper_util::client::legacy::connect::dns::{GaiResolver, Name as HyperName};
use reqwest::dns::{Addrs, Name, Resolve, Resolving}; use reqwest::dns::{Addrs, Name, Resolve, Resolving};
@ -509,41 +509,55 @@ impl Service {
self.config.well_known_client() self.config.well_known_client()
} }
pub fn default_rooms(&self) -> Result<&BTreeSet<OwnedRoomId>> { pub async fn default_rooms(&self) -> Result<&BTreeSet<OwnedRoomId>> {
if let Some(set) = self.default_rooms.get() { if let Some(default_rooms) = self.default_rooms.get() {
return Ok(set); return Ok(default_rooms);
} }
let server_name = self.config.server_name.as_str();
let mut default_rooms = BTreeSet::new(); let mut default_rooms = BTreeSet::new();
for s in self.config.default_rooms.iter() { for mut alias_or_id in self.config.default_rooms.iter().cloned() {
let next = s
.chars()
.next()
.ok_or_else(|| Error::bad_config("Invalid ID for join-by-default rooms."))?;
// anything that does not start '!' should be considered an alias // anything that does not start '!' should be considered an alias
let room_id = match next { // empty strings are ignored
'!' => OwnedRoomId::from_str(&format!( let room_id = if Some('!') == alias_or_id.chars().next() {
"{}:{server_name}", if alias_or_id.split_once(':').is_none() {
s.split(':').next().unwrap_or(&s) alias_or_id = format!("{}:{}", alias_or_id, self.config.server_name);
)) }
.map_err(|_| Error::bad_config("Invalid ID for join-by-default rooms."))?,
_ => {
let Some(room_id) = OwnedRoomAliasId::from_str(&format!(
"#{}:{server_name}",
s.split(':').next().unwrap_or(&s).trim_start_matches('#')
))
.map_err(|_| Error::bad_config("Invalid alias for join-by-default rooms."))
.and_then(|alias| services().rooms.alias.resolve_local_alias(&alias))?
else {
warn!("Could not resolve Room ID for join-by-default rooms locally.");
continue; OwnedRoomId::from_str(&alias_or_id).map_err(|e| {
}; warn!(
"Invalid room ID ({}) for join-by-default rooms: {}",
alias_or_id, e
);
room_id Error::bad_config("Invalid room ID for join-by-default rooms.")
})?
} else {
if alias_or_id.split_once(':').is_none() {
alias_or_id = format!("#{}:{}", alias_or_id, self.config.server_name);
}
let room_alias = OwnedRoomAliasId::from_str(&alias_or_id).map_err(|e| {
warn!(
"Invalid room alias ({}) for join-by-default rooms: {}",
alias_or_id, e
);
Error::bad_config("Invalid room alias for join-by-default rooms.")
})?;
if room_alias.server_name() == &self.config.server_name {
services()
.rooms
.alias
.resolve_local_alias(&room_alias)?
.ok_or_else(|| {
Error::bad_config("Unknown alias for join-by-default rooms.")
})?
} else {
get_alias_helper(room_alias.clone())
.await
.map(|res| res.room_id)?
} }
}; };
@ -552,9 +566,9 @@ impl Service {
self.default_rooms self.default_rooms
.set(default_rooms) .set(default_rooms)
.expect("default_rooms should be set once"); .expect("default_rooms should not be set already");
self.default_rooms() Ok(self.default_rooms.get().unwrap())
} }
pub fn shutdown(&self) { pub fn shutdown(&self) {