tuwunel_api/client/admin/users/
whois.rs1use 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}