Optimize federation user devices response.

Modernize some error branches.

Signed-off-by: Jason Volk <jason@zemos.net>
This commit is contained in:
Jason Volk
2025-11-01 20:05:01 +00:00
parent 15627bc8d0
commit aa3f14cd57

View File

@@ -1,13 +1,17 @@
use axum::extract::State; use axum::extract::State;
use futures::{FutureExt, StreamExt, TryFutureExt}; use futures::{FutureExt, StreamExt, TryFutureExt, future::join4};
use ruma::api::{ use ruma::{
client::error::ErrorKind, UserId,
federation::{ api::{
device::get_devices::{self, v1::UserDevice}, client::device::Device,
keys::{claim_keys, get_keys}, federation::{
device::get_devices::{self, v1::UserDevice},
keys::{claim_keys, get_keys},
},
}, },
uint,
}; };
use tuwunel_core::{Error, Result}; use tuwunel_core::{Err, Result, utils::future::TryExtExt};
use crate::{ use crate::{
Ruma, Ruma,
@@ -21,54 +25,65 @@ pub(crate) async fn get_devices_route(
State(services): State<crate::State>, State(services): State<crate::State>,
body: Ruma<get_devices::v1::Request>, body: Ruma<get_devices::v1::Request>,
) -> Result<get_devices::v1::Response> { ) -> Result<get_devices::v1::Response> {
if !services.globals.user_is_local(&body.user_id) { let user_id = &body.user_id;
return Err(Error::BadRequest( if !services.globals.user_is_local(user_id) {
ErrorKind::InvalidParam, return Err!(Request(InvalidParam("Tried to access user from other server.")));
"Tried to access user from other server.",
));
} }
let user_id = &body.user_id; let allowed_signatures = |u: &UserId| u.server_name() == body.origin();
Ok(get_devices::v1::Response {
user_id: user_id.clone(),
stream_id: services
.users
.get_devicelist_version(user_id)
.await
.unwrap_or(0)
.try_into()?,
devices: services
.users
.all_devices_metadata(user_id)
.filter_map(async |metadata| {
let device_id = metadata.device_id.clone();
let device_id_clone = device_id.clone();
let device_id_string = device_id.as_str().to_owned();
let device_display_name = if services.config.allow_device_name_federation {
metadata.display_name.clone()
} else {
Some(device_id_string)
};
services let master_key = services
.users .users
.get_device_keys(user_id, &device_id_clone) .get_master_key(None, user_id, &allowed_signatures)
.map_ok(|keys| UserDevice { device_id, keys, device_display_name }) .ok();
.map(Result::ok)
.await let self_signing_key = services
}) .users
.collect() .get_self_signing_key(None, user_id, &allowed_signatures)
.await, .ok();
master_key: services
.users let stream_id = services
.get_master_key(None, &body.user_id, &|u| u.server_name() == body.origin()) .users
.await .get_devicelist_version(user_id)
.ok(), .map_ok(TryInto::try_into)
self_signing_key: services .map_ok(Result::ok)
.users .ok();
.get_self_signing_key(None, &body.user_id, &|u| u.server_name() == body.origin())
.await let devices = services
.ok(), .users
.all_devices_metadata(user_id)
.filter_map(async |Device { device_id, display_name, .. }: Device| {
let device_display_name = services
.config
.allow_device_name_federation
.then_some(display_name)
.flatten()
.or_else(|| Some(device_id.as_str().to_owned()));
services
.users
.get_device_keys(user_id, &device_id)
.map_ok(|keys| UserDevice {
device_id: device_id.clone(),
device_display_name,
keys,
})
.map(Result::ok)
.await
})
.collect::<Vec<_>>();
let (stream_id, master_key, self_signing_key, devices) =
join4(stream_id, master_key, self_signing_key, devices)
.boxed()
.await;
Ok(get_devices::v1::Response {
user_id: body.body.user_id,
stream_id: stream_id.flatten().unwrap_or_else(|| uint!(0)),
devices,
self_signing_key,
master_key,
}) })
} }
@@ -84,10 +99,7 @@ pub(crate) async fn get_keys_route(
.iter() .iter()
.any(|(u, _)| !services.globals.user_is_local(u)) .any(|(u, _)| !services.globals.user_is_local(u))
{ {
return Err(Error::BadRequest( return Err!(Request(InvalidParam("User does not belong to this server.")));
ErrorKind::InvalidParam,
"User does not belong to this server.",
));
} }
let result = get_keys_helper( let result = get_keys_helper(
@@ -118,10 +130,7 @@ pub(crate) async fn claim_keys_route(
.iter() .iter()
.any(|(u, _)| !services.globals.user_is_local(u)) .any(|(u, _)| !services.globals.user_is_local(u))
{ {
return Err(Error::BadRequest( return Err!(Request(InvalidParam("Tried to access user from other server.")));
ErrorKind::InvalidParam,
"Tried to access user from other server.",
));
} }
let result = claim_keys_helper(&services, &body.one_time_keys).await?; let result = claim_keys_helper(&services, &body.one_time_keys).await?;