Skip to main content

tuwunel_api/client/admin/users/
whois.rs

1use axum::extract::State;
2use futures::StreamExt;
3use ruma::{UserId, api::client::admin::get_user_info::v3 as get_user_info};
4use tuwunel_core::{Err, Result};
5
6use crate::{Ruma, RumaResponse, client::admin::require_admin};
7
8pub(crate) async fn admin_whois_route(
9	State(services): State<crate::State>,
10	body: Ruma<get_user_info::Request>,
11) -> Result<RumaResponse<get_user_info::Response>> {
12	let target: &UserId = &body.user_id;
13	if body.sender_user() != target {
14		require_admin(&services, body.sender_user()).await?;
15	}
16
17	if !services.globals.user_is_local(target) {
18		return Err!(Request(InvalidParam("Can only look up local users")));
19	}
20
21	let connections = services
22		.users
23		.all_devices_metadata(target)
24		.map(|device| get_user_info::ConnectionInfo {
25			ip: device.last_seen_ip.map(|ip| ip.to_string()),
26			last_seen: device.last_seen_ts,
27			user_agent: None,
28		})
29		.collect()
30		.await;
31
32	let sessions = vec![get_user_info::SessionInfo { connections }];
33	let device = get_user_info::DeviceInfo { sessions };
34	let devices = [(String::new(), device)].into();
35
36	Ok(RumaResponse(get_user_info::Response {
37		user_id: Some(body.user_id.clone()),
38		devices,
39	}))
40}