ruma-events: Add the key verification room message variant
This commit is contained in:
parent
4afafa8b37
commit
e0adcaa502
@ -2,10 +2,15 @@
|
||||
|
||||
use js_int::UInt;
|
||||
use ruma_events_macros::MessageEventContent;
|
||||
#[cfg(feature = "unstable-pre-spec")]
|
||||
use ruma_identifiers::{DeviceIdBox, UserId};
|
||||
use ruma_serde::StringEnum;
|
||||
use serde::{Deserialize, Serialize};
|
||||
use serde_json::Value as JsonValue;
|
||||
|
||||
#[cfg(feature = "unstable-pre-spec")]
|
||||
use crate::key::verification::VerificationMethod;
|
||||
|
||||
#[cfg(feature = "unstable-pre-spec")]
|
||||
use super::relationships::{Annotation, Reference, RelationJsonRepr, Replacement};
|
||||
use super::{relationships::RelatesToJsonRepr, EncryptedFile, ImageInfo, ThumbnailInfo};
|
||||
@ -63,6 +68,11 @@ pub enum MessageEventContent {
|
||||
/// A video message.
|
||||
#[serde(rename = "m.video")]
|
||||
Video(VideoMessageEventContent),
|
||||
|
||||
/// A request to initiate a key verification.
|
||||
#[cfg(feature = "unstable-pre-spec")]
|
||||
#[serde(rename = "m.key.verification.request")]
|
||||
VerificationRequest(KeyVerificationRequestEventContent),
|
||||
}
|
||||
|
||||
/// Enum modeling the different ways relationships can be expressed in a
|
||||
@ -536,18 +546,46 @@ pub struct VideoInfo {
|
||||
pub thumbnail_file: Option<Box<EncryptedFile>>,
|
||||
}
|
||||
|
||||
/// The payload for a key verification request message.
|
||||
#[derive(Clone, Debug, Deserialize, Serialize)]
|
||||
#[cfg(feature = "unstable-pre-spec")]
|
||||
pub struct KeyVerificationRequestEventContent {
|
||||
/// A fallback message to alert users that their client does not support the key verification
|
||||
/// framework.
|
||||
pub body: String,
|
||||
|
||||
/// The verification methods supported by the sender.
|
||||
pub methods: Vec<VerificationMethod>,
|
||||
|
||||
/// The device ID which is initiating the request.
|
||||
pub from_device: DeviceIdBox,
|
||||
|
||||
/// The user ID which should receive the request.
|
||||
///
|
||||
/// Users should only respond to verification requests if they are named in this field. Users
|
||||
/// who are not named in this field and who did not send this event should ignore all other
|
||||
/// events that have a m.reference relationship with this event.
|
||||
pub to: UserId,
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use std::time::{Duration, UNIX_EPOCH};
|
||||
|
||||
use matches::assert_matches;
|
||||
#[cfg(feature = "unstable-pre-spec")]
|
||||
use ruma_identifiers::DeviceIdBox;
|
||||
use ruma_identifiers::{event_id, room_id, user_id};
|
||||
use ruma_serde::Raw;
|
||||
use serde_json::{from_value as from_json_value, json, to_value as to_json_value};
|
||||
|
||||
#[cfg(feature = "unstable-pre-spec")]
|
||||
use super::KeyVerificationRequestEventContent;
|
||||
use super::{
|
||||
AudioMessageEventContent, FormattedBody, MessageEventContent, MessageFormat, Relation,
|
||||
};
|
||||
#[cfg(feature = "unstable-pre-spec")]
|
||||
use crate::key::verification::VerificationMethod;
|
||||
use crate::{
|
||||
room::{message::TextMessageEventContent, relationships::InReplyTo},
|
||||
MessageEvent, Unsigned,
|
||||
@ -734,6 +772,70 @@ mod tests {
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
#[cfg(feature = "unstable-pre-spec")]
|
||||
fn verification_request_deserialization() {
|
||||
let user_id = user_id!("@example2:localhost");
|
||||
let device_id: DeviceIdBox = "XOWLHHFSWM".into();
|
||||
|
||||
let json_data = json!({
|
||||
"body": "@example:localhost is requesting to verify your key, ...",
|
||||
"msgtype": "m.key.verification.request",
|
||||
"to": user_id,
|
||||
"from_device": device_id,
|
||||
"methods": [
|
||||
"m.sas.v1",
|
||||
"m.qr_code.show.v1",
|
||||
"m.reciprocate.v1"
|
||||
]
|
||||
});
|
||||
|
||||
assert_matches!(
|
||||
from_json_value::<MessageEventContent>(json_data).unwrap(),
|
||||
MessageEventContent::VerificationRequest(KeyVerificationRequestEventContent {
|
||||
body,
|
||||
to,
|
||||
from_device,
|
||||
methods
|
||||
}) if body == "@example:localhost is requesting to verify your key, ..."
|
||||
&& to == user_id
|
||||
&& from_device == device_id
|
||||
&& methods.contains(&VerificationMethod::MSasV1)
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
#[cfg(feature = "unstable-pre-spec")]
|
||||
fn verification_request_serialization() {
|
||||
let user_id = user_id!("@example2:localhost");
|
||||
let device_id: DeviceIdBox = "XOWLHHFSWM".into();
|
||||
let body = "@example:localhost is requesting to verify your key, ...".to_string();
|
||||
|
||||
let methods = vec![
|
||||
VerificationMethod::MSasV1,
|
||||
VerificationMethod::_Custom("m.qr_code.show.v1".to_string()),
|
||||
VerificationMethod::_Custom("m.reciprocate.v1".to_string()),
|
||||
];
|
||||
|
||||
let json_data = json!({
|
||||
"body": body,
|
||||
"msgtype": "m.key.verification.request",
|
||||
"to": user_id,
|
||||
"from_device": device_id,
|
||||
"methods": methods
|
||||
});
|
||||
|
||||
let content =
|
||||
MessageEventContent::VerificationRequest(KeyVerificationRequestEventContent {
|
||||
to: user_id,
|
||||
from_device: device_id,
|
||||
body,
|
||||
methods,
|
||||
});
|
||||
|
||||
assert_eq!(to_json_value(&content).unwrap(), json_data,);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn content_deserialization() {
|
||||
let json_data = json!({
|
||||
|
Loading…
x
Reference in New Issue
Block a user