federation-api: Fix various issues

This commit is contained in:
Jonas Platte 2020-08-24 21:39:50 +02:00
parent 6aee819d5d
commit 21eb1e8e41
No known key found for this signature in database
GPG Key ID: CC154DE0E30B7C67
5 changed files with 76 additions and 30 deletions

View File

@ -26,13 +26,36 @@ ruma_api! {
} }
} }
#[derive(Clone, Debug, Serialize, Deserialize)] impl Request {
/// Creates an empty `Request`.
pub fn new() -> Self {
Self
}
}
impl Response {
/// Creates an empty `Response`.
pub fn new() -> Self {
Default::default()
}
}
/// Arbitrary values that identify this implementation. /// Arbitrary values that identify this implementation.
#[derive(Clone, Debug, Default, Serialize, Deserialize)]
#[non_exhaustive]
pub struct Server { pub struct Server {
/// Arbitrary name that identifies this implementation. /// Arbitrary name that identifies this implementation.
#[serde(skip_serializing_if = "Option::is_none")] #[serde(skip_serializing_if = "Option::is_none")]
pub name: Option<String>, pub name: Option<String>,
/// Version of this implementation. The version format depends on the implementation. /// Version of this implementation. The version format depends on the implementation.
#[serde(skip_serializing_if = "Option::is_none")] #[serde(skip_serializing_if = "Option::is_none")]
pub version: Option<String>, pub version: Option<String>,
} }
impl Server {
/// Creates an empty `Server`.
pub fn new() -> Self {
Default::default()
}
}

View File

@ -20,13 +20,13 @@ ruma_api! {
#[non_exhaustive] #[non_exhaustive]
request: { request: {
/// The keys to be claimed. /// The keys to be claimed.
one_time_keys: OneTimeKeyClaims, pub one_time_keys: OneTimeKeyClaims,
} }
#[non_exhaustive] #[non_exhaustive]
response: { response: {
/// One-time keys for the queried devices /// One-time keys for the queried devices
one_time_keys: OneTimeKeys, pub one_time_keys: OneTimeKeys,
} }
} }
@ -51,11 +51,19 @@ pub type OneTimeKeyClaims = BTreeMap<UserId, BTreeMap<DeviceIdBox, DeviceKeyAlgo
pub type OneTimeKeys = BTreeMap<UserId, BTreeMap<DeviceIdBox, BTreeMap<DeviceKeyId, KeyObject>>>; pub type OneTimeKeys = BTreeMap<UserId, BTreeMap<DeviceIdBox, BTreeMap<DeviceKeyId, KeyObject>>>;
/// A key and its signature /// A key and its signature
#[non_exhaustive]
#[derive(Debug, Clone, Serialize, Deserialize)] #[derive(Debug, Clone, Serialize, Deserialize)]
#[non_exhaustive]
pub struct KeyObject { pub struct KeyObject {
/// The key, encoded using unpadded base64. /// The key, encoded using unpadded base64.
key: String, pub key: String,
/// Signature of the key object. /// Signature of the key object.
signatures: BTreeMap<UserId, BTreeMap<DeviceKeyId, String>>, pub signatures: BTreeMap<UserId, BTreeMap<DeviceKeyId, String>>,
}
impl KeyObject {
/// Creates a new `KeyObject` with the given key and signatures.
pub fn new(key: String, signatures: BTreeMap<UserId, BTreeMap<DeviceKeyId, String>>) -> Self {
Self { key, signatures }
}
} }

View File

@ -20,13 +20,13 @@ ruma_api! {
request: { request: {
/// The keys to be downloaded. Gives all keys for a given user if the list of device ids is /// The keys to be downloaded. Gives all keys for a given user if the list of device ids is
/// empty. /// empty.
device_keys: BTreeMap<UserId, Vec<DeviceIdBox>>, pub device_keys: BTreeMap<UserId, Vec<DeviceIdBox>>,
} }
#[non_exhaustive] #[non_exhaustive]
response: { response: {
/// Keys from the queried devices. /// Keys from the queried devices.
device_keys: BTreeMap<UserId, BTreeMap<DeviceIdBox, DeviceKeys>>, pub device_keys: BTreeMap<UserId, BTreeMap<DeviceIdBox, DeviceKeys>>,
} }
} }

View File

@ -22,17 +22,17 @@ ruma_api! {
request: { request: {
/// The room ID that the user is being invited to. /// The room ID that the user is being invited to.
#[ruma_api(path)] #[ruma_api(path)]
pub room_id: RoomId, pub room_id: &'a RoomId,
/// The event ID for the invite event, generated by the inviting server. /// The event ID for the invite event, generated by the inviting server.
#[ruma_api(path)] #[ruma_api(path)]
pub event_id: EventId, pub event_id: &'a EventId,
/// The matrix ID of the user who sent the original `m.room.third_party_invite`. /// The matrix ID of the user who sent the original `m.room.third_party_invite`.
pub sender: UserId, pub sender: &'a UserId,
/// The name of the inviting homeserver. /// The name of the inviting homeserver.
pub origin: Box<ServerName>, pub origin: &'a ServerName,
/// A timestamp added by the inviting homeserver. /// A timestamp added by the inviting homeserver.
pub origin_server_ts: UInt, pub origin_server_ts: UInt,
@ -42,12 +42,13 @@ ruma_api! {
pub kind: EventType, pub kind: EventType,
/// The user ID of the invited member. /// The user ID of the invited member.
pub state_key: UserId, pub state_key: &'a UserId,
/// The content of the event. /// The content of the event.
pub content: MemberEventContent, pub content: MemberEventContent,
/// Information included alongside the event that is not signed. /// Information included alongside the event that is not signed.
#[serde(default, skip_serializing_if = "UnsignedEventContent::is_empty")]
pub unsigned: UnsignedEventContent, pub unsigned: UnsignedEventContent,
} }
@ -56,38 +57,52 @@ ruma_api! {
/// The response invite event /// The response invite event
#[ruma_api(body)] #[ruma_api(body)]
#[serde(with = "crate::serde::invite_response")] #[serde(with = "crate::serde::invite_response")]
event: InviteEvent, pub event: InviteEvent,
} }
} }
/// Information included alongside an event that is not signed. /// Information included alongside an event that is not signed.
#[derive(Clone, Debug, Serialize, Deserialize)] #[derive(Clone, Debug, Default, Serialize, Deserialize)]
#[non_exhaustive]
pub struct UnsignedEventContent { pub struct UnsignedEventContent {
/// An optional list of simplified events to help the receiver of the invite identify the room. /// An optional list of simplified events to help the receiver of the invite identify the room.
/// The recommended events to include are the join rules, canonical alias, avatar, and name of /// The recommended events to include are the join rules, canonical alias, avatar, and name of
/// the room. /// the room.
#[serde(skip_serializing_if = "<[_]>::is_empty")]
pub invite_room_state: Vec<StrippedState>, pub invite_room_state: Vec<StrippedState>,
} }
impl UnsignedEventContent {
/// Creates an empty `UnsignedEventContent`.
pub fn new() -> Self {
Default::default()
}
/// Checks whether all of the fields are empty.
pub fn is_empty(&self) -> bool {
self.invite_room_state.is_empty()
}
}
/// Initial set of fields of `Request`. /// Initial set of fields of `Request`.
pub struct RequestInit { pub struct RequestInit<'a> {
/// The room ID that the user is being invited to. /// The room ID that the user is being invited to.
pub room_id: RoomId, pub room_id: &'a RoomId,
/// The event ID for the invite event, generated by the inviting server. /// The event ID for the invite event, generated by the inviting server.
pub event_id: EventId, pub event_id: &'a EventId,
/// The matrix ID of the user who sent the original `m.room.third_party_invite`. /// The matrix ID of the user who sent the original `m.room.third_party_invite`.
pub sender: UserId, pub sender: &'a UserId,
/// The name of the inviting homeserver. /// The name of the inviting homeserver.
pub origin: Box<ServerName>, pub origin: &'a ServerName,
/// A timestamp added by the inviting homeserver. /// A timestamp added by the inviting homeserver.
pub origin_server_ts: UInt, pub origin_server_ts: UInt,
/// The user ID of the invited member. /// The user ID of the invited member.
pub state_key: UserId, pub state_key: &'a UserId,
/// The content of the event. /// The content of the event.
pub content: MemberEventContent, pub content: MemberEventContent,
@ -96,9 +111,9 @@ pub struct RequestInit {
pub unsigned: UnsignedEventContent, pub unsigned: UnsignedEventContent,
} }
impl From<RequestInit> for Request { impl<'a> From<RequestInit<'a>> for Request<'a> {
/// Creates a new `Request` with the given parameters. /// Creates a new `Request` with the given parameters.
fn from(init: RequestInit) -> Self { fn from(init: RequestInit<'a>) -> Self {
Self { Self {
room_id: init.room_id, room_id: init.room_id,
event_id: init.event_id, event_id: init.event_id,

View File

@ -19,31 +19,31 @@ ruma_api! {
request: { request: {
/// The room ID that the user is being invited to. /// The room ID that the user is being invited to.
#[ruma_api(path)] #[ruma_api(path)]
room_id: RoomId, pub room_id: RoomId,
/// The event ID for the invite event, generated by the inviting server. /// The event ID for the invite event, generated by the inviting server.
#[ruma_api(path)] #[ruma_api(path)]
event_id: EventId, pub event_id: EventId,
/// The version of the room where the user is being invited to. /// The version of the room where the user is being invited to.
room_version: RoomVersionId, pub room_version: RoomVersionId,
/// An invite event. /// An invite event.
event: InviteEvent, pub event: InviteEvent,
/// An optional list of simplified events to help the receiver of the invite identify the room. /// An optional list of simplified events to help the receiver of the invite identify the room.
invite_room_state: StrippedState, pub invite_room_state: StrippedState,
} }
#[non_exhaustive] #[non_exhaustive]
response: { response: {
/// An invite event. /// An invite event.
event: InviteEvent, pub event: InviteEvent,
} }
} }
impl Request { impl Request {
/// Creates a new `Request` with the given parameters /// Creates a new `Request` with the given parameters.
pub fn new( pub fn new(
room_id: RoomId, room_id: RoomId,
event_id: EventId, event_id: EventId,