1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107
//! `GET /_matrix/federation/*/user/devices/{userId}`
//!
//! Get information about a user's devices.
pub mod v1 {
//! `/v1/` ([spec])
//!
//! [spec]: https://spec.matrix.org/latest/server-server-api/#get_matrixfederationv1userdevicesuserid
use js_int::UInt;
use ruma_common::{
api::{request, response, Metadata},
encryption::{CrossSigningKey, DeviceKeys},
metadata,
serde::Raw,
OwnedDeviceId, OwnedUserId,
};
use serde::{Deserialize, Serialize};
const METADATA: Metadata = metadata! {
method: GET,
rate_limited: false,
authentication: ServerSignatures,
history: {
1.0 => "/_matrix/federation/v1/user/devices/:user_id",
}
};
/// Request type for the `get_devices` endpoint.
#[request]
pub struct Request {
/// The user ID to retrieve devices for.
///
/// Must be a user local to the receiving homeserver.
#[ruma_api(path)]
pub user_id: OwnedUserId,
}
/// Response type for the `get_devices` endpoint.
#[response]
pub struct Response {
/// The user ID devices were requested for.
pub user_id: OwnedUserId,
/// A unique ID for a given user_id which describes the version of the returned device
/// list.
///
/// This is matched with the `stream_id` field in `m.device_list_update` EDUs in order to
/// incrementally update the returned device_list.
pub stream_id: UInt,
/// The user's devices.
pub devices: Vec<UserDevice>,
/// The user's master key.
#[serde(skip_serializing_if = "Option::is_none")]
pub master_key: Option<Raw<CrossSigningKey>>,
/// The users's self-signing key.
#[serde(skip_serializing_if = "Option::is_none")]
pub self_signing_key: Option<Raw<CrossSigningKey>>,
}
impl Request {
/// Creates a new `Request` with the given user id.
pub fn new(user_id: OwnedUserId) -> Self {
Self { user_id }
}
}
impl Response {
/// Creates a new `Response` with the given user id and stream id.
///
/// The device list will be empty.
pub fn new(user_id: OwnedUserId, stream_id: UInt) -> Self {
Self {
user_id,
stream_id,
devices: Vec::new(),
master_key: None,
self_signing_key: None,
}
}
}
/// Information about a user's device.
#[derive(Clone, Debug, Serialize, Deserialize)]
#[cfg_attr(not(feature = "unstable-exhaustive-types"), non_exhaustive)]
pub struct UserDevice {
/// The device ID.
pub device_id: OwnedDeviceId,
/// Identity keys for the device.
pub keys: Raw<DeviceKeys>,
/// Optional display name for the device
#[serde(skip_serializing_if = "Option::is_none")]
pub device_display_name: Option<String>,
}
impl UserDevice {
/// Creates a new `UserDevice` with the given device id and keys.
pub fn new(device_id: OwnedDeviceId, keys: Raw<DeviceKeys>) -> Self {
Self { device_id, keys, device_display_name: None }
}
}
}