diff --git a/src/api/server/user.rs b/src/api/server/user.rs index 3c00bdad3..dfcafa708 100644 --- a/src/api/server/user.rs +++ b/src/api/server/user.rs @@ -1,14 +1,14 @@ use std::time::Duration; use axum::extract::State; -use conduwuit::{Error, Result}; +use conduwuit::{Err, Result}; use futures::{FutureExt, StreamExt, TryFutureExt}; -use ruma::api::{ - client::error::ErrorKind, - federation::{ +use ruma::{ + api::federation::{ device::get_devices::{self, v1::UserDevice}, keys::{claim_keys, get_keys}, }, + assign, }; use crate::{ @@ -24,54 +24,55 @@ pub(crate) async fn get_devices_route( body: Ruma, ) -> Result { if !services.globals.user_is_local(&body.user_id) { - return Err(Error::BadRequest( - ErrorKind::InvalidParam, - "Tried to access user from other server.", - )); + return Err!(Request(InvalidParam("Tried to access user from other server."))); } - let user_id = &body.user_id; - 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(|metadata| async move { - 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.globals.allow_device_name_federation() { - metadata.display_name.clone() - } else { - Some(device_id_string) - }; + let stream_id = services + .users + .get_devicelist_version(&body.user_id) + .await + .unwrap_or(0) + .try_into() + .expect("device list version should fit into a UInt"); - services - .users - .get_device_keys(user_id, &device_id_clone) - .map_ok(|keys| UserDevice { device_id, keys, device_display_name }) - .map(Result::ok) - .await - }) - .collect() - .await, - master_key: services - .users - .get_master_key(None, &body.user_id, &|u| u.server_name() == body.origin()) - .await - .ok(), - self_signing_key: services - .users - .get_self_signing_key(None, &body.user_id, &|u| u.server_name() == body.origin()) - .await - .ok(), - }) + let devices = services + .users + .all_devices_metadata(&body.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.globals.allow_device_name_federation() { + metadata.display_name.clone() + } else { + Some(device_id_string) + }; + + services + .users + .get_device_keys(&body.user_id, &device_id_clone) + .map_ok(|keys| assign!(UserDevice::new(device_id, keys), { device_display_name })) + .map(Result::ok) + .await + }) + .collect() + .await; + + let master_key = services + .users + .get_master_key(None, &body.user_id, &|u| u.server_name() == body.origin()) + .await + .ok(); + + let self_signing_key = services + .users + .get_self_signing_key(None, &body.user_id, &|u| u.server_name() == body.origin()) + .await + .ok(); + + Ok(assign!(get_devices::v1::Response::new(body.user_id.clone(), stream_id), { + devices, master_key, self_signing_key + })) } /// # `POST /_matrix/federation/v1/user/keys/query` @@ -86,10 +87,7 @@ pub(crate) async fn get_keys_route( .iter() .any(|(u, _)| !services.globals.user_is_local(u)) { - return Err(Error::BadRequest( - ErrorKind::InvalidParam, - "User does not belong to this server.", - )); + return Err!(Request(InvalidParam("User does not belong to this server."))); } let result = get_keys_helper( @@ -102,11 +100,10 @@ pub(crate) async fn get_keys_route( ) .await?; - Ok(get_keys::v1::Response { - device_keys: result.device_keys, + Ok(assign!(get_keys::v1::Response::new(result.device_keys), { master_keys: result.master_keys, self_signing_keys: result.self_signing_keys, - }) + })) } /// # `POST /_matrix/federation/v1/user/keys/claim` @@ -121,14 +118,11 @@ pub(crate) async fn claim_keys_route( .iter() .any(|(u, _)| !services.globals.user_is_local(u)) { - return Err(Error::BadRequest( - ErrorKind::InvalidParam, - "Tried to access user from other server.", - )); + return Err!(Request(InvalidParam("Tried to access user from other server."))); } let result = claim_keys_helper(&services, &body.one_time_keys, Duration::from_secs(0)).await?; - Ok(claim_keys::v1::Response { one_time_keys: result.one_time_keys }) + Ok(claim_keys::v1::Response::new(result.one_time_keys)) }