From a0ee826828d885ac8fe4935473ad62c4866c2cae Mon Sep 17 00:00:00 2001 From: Jimmy Cuadra Date: Fri, 14 Jun 2019 23:12:18 -0700 Subject: [PATCH] Add E2EE events to EventType and collections types. --- src/collections/all.rs | 226 ++++++++++++++++++++++++++++++++++++++++ src/collections/only.rs | 163 +++++++++++++++++++++++++++++ src/lib.rs | 60 +++++++++++ 3 files changed, 449 insertions(+) diff --git a/src/collections/all.rs b/src/collections/all.rs index ebd6c5a3..27dba78d 100644 --- a/src/collections/all.rs +++ b/src/collections/all.rs @@ -6,8 +6,14 @@ use crate::{ answer::AnswerEvent, candidates::CandidatesEvent, hangup::HangupEvent, invite::InviteEvent, }, direct::DirectEvent, + dummy::DummyEvent, + forwarded_room_key::ForwardedRoomKeyEvent, fully_read::FullyReadEvent, ignored_user_list::IgnoredUserListEvent, + key::verification::{ + accept::AcceptEvent, cancel::CancelEvent, key::KeyEvent, mac::MacEvent, + request::RequestEvent, start::StartEvent, + }, presence::PresenceEvent, receipt::ReceiptEvent, room::{ @@ -15,6 +21,8 @@ use crate::{ avatar::AvatarEvent, canonical_alias::CanonicalAliasEvent, create::CreateEvent, + encrypted::EncryptedEvent, + encryption::EncryptionEvent, guest_access::GuestAccessEvent, history_visibility::HistoryVisibilityEvent, join_rules::JoinRulesEvent, @@ -29,6 +37,8 @@ use crate::{ tombstone::TombstoneEvent, topic::TopicEvent, }, + room_key::RoomKeyEvent, + room_key_request::RoomKeyRequestEvent, sticker::StickerEvent, tag::TagEvent, typing::TypingEvent, @@ -57,12 +67,36 @@ pub enum Event { /// m.direct Direct(DirectEvent), + /// m.dummy + Dummy(DummyEvent), + + /// m.forwarded_room_key + ForwardedRoomKey(ForwardedRoomKeyEvent), + /// m.fully_read FullyRead(FullyReadEvent), /// m.ignored_user_list IgnoredUserList(IgnoredUserListEvent), + /// m.key.verification.accept + KeyVerificationAccept(AcceptEvent), + + /// m.key.verification.cancel + KeyVerificationCancel(CancelEvent), + + /// m.key.verification.key + KeyVerificationKey(KeyEvent), + + /// m.key.verification.mac + KeyVerificationMac(MacEvent), + + /// m.key.verification.request + KeyVerificationRequest(RequestEvent), + + /// m.key.verification.start + KeyVerificationStart(StartEvent), + /// m.presence Presence(PresenceEvent), @@ -81,6 +115,12 @@ pub enum Event { /// m.room.create RoomCreate(CreateEvent), + /// m.room.encrypted + RoomEncrypted(EncryptedEvent), + + /// m.room.encryption + RoomEncryption(EncryptionEvent), + /// m.room.guest_access RoomGuestAccess(GuestAccessEvent), @@ -123,6 +163,12 @@ pub enum Event { /// m.room.topic RoomTopic(TopicEvent), + /// m.room_key + RoomKey(RoomKeyEvent), + + /// m.room_key_request + RoomKeyRequest(RoomKeyRequestEvent), + /// m.sticker Sticker(StickerEvent), @@ -170,6 +216,12 @@ pub enum RoomEvent { /// m.room.create RoomCreate(CreateEvent), + /// m.room.encrypted + RoomEncrypted(EncryptedEvent), + + /// m.room.encryption + RoomEncryption(EncryptionEvent), + /// m.room.guest_access RoomGuestAccess(GuestAccessEvent), @@ -238,6 +290,9 @@ pub enum StateEvent { /// m.room.create RoomCreate(CreateEvent), + /// m.room.encryption + RoomEncryption(EncryptionEvent), + /// m.room.guest_access RoomGuestAccess(GuestAccessEvent), @@ -286,7 +341,15 @@ impl Serialize for Event { Event::CallHangup(ref event) => event.serialize(serializer), Event::CallInvite(ref event) => event.serialize(serializer), Event::Direct(ref event) => event.serialize(serializer), + Event::Dummy(ref event) => event.serialize(serializer), + Event::ForwardedRoomKey(ref event) => event.serialize(serializer), Event::FullyRead(ref event) => event.serialize(serializer), + Event::KeyVerificationAccept(ref event) => event.serialize(serializer), + Event::KeyVerificationCancel(ref event) => event.serialize(serializer), + Event::KeyVerificationKey(ref event) => event.serialize(serializer), + Event::KeyVerificationMac(ref event) => event.serialize(serializer), + Event::KeyVerificationRequest(ref event) => event.serialize(serializer), + Event::KeyVerificationStart(ref event) => event.serialize(serializer), Event::IgnoredUserList(ref event) => event.serialize(serializer), Event::Presence(ref event) => event.serialize(serializer), Event::Receipt(ref event) => event.serialize(serializer), @@ -294,6 +357,8 @@ impl Serialize for Event { Event::RoomAvatar(ref event) => event.serialize(serializer), Event::RoomCanonicalAlias(ref event) => event.serialize(serializer), Event::RoomCreate(ref event) => event.serialize(serializer), + Event::RoomEncrypted(ref event) => event.serialize(serializer), + Event::RoomEncryption(ref event) => event.serialize(serializer), Event::RoomGuestAccess(ref event) => event.serialize(serializer), Event::RoomHistoryVisibility(ref event) => event.serialize(serializer), Event::RoomJoinRules(ref event) => event.serialize(serializer), @@ -308,6 +373,8 @@ impl Serialize for Event { Event::RoomThirdPartyInvite(ref event) => event.serialize(serializer), Event::RoomTombstone(ref event) => event.serialize(serializer), Event::RoomTopic(ref event) => event.serialize(serializer), + Event::RoomKey(ref event) => event.serialize(serializer), + Event::RoomKeyRequest(ref event) => event.serialize(serializer), Event::Sticker(ref event) => event.serialize(serializer), Event::Tag(ref event) => event.serialize(serializer), Event::Typing(ref event) => event.serialize(serializer), @@ -376,6 +443,22 @@ impl<'de> Deserialize<'de> for Event { Ok(Event::Direct(event)) } + EventType::Dummy => { + let event = match from_value::(value) { + Ok(event) => event, + Err(error) => return Err(D::Error::custom(error.to_string())), + }; + + Ok(Event::Dummy(event)) + } + EventType::ForwardedRoomKey => { + let event = match from_value::(value) { + Ok(event) => event, + Err(error) => return Err(D::Error::custom(error.to_string())), + }; + + Ok(Event::ForwardedRoomKey(event)) + } EventType::FullyRead => { let event = match from_value::(value) { Ok(event) => event, @@ -384,6 +467,54 @@ impl<'de> Deserialize<'de> for Event { Ok(Event::FullyRead(event)) } + EventType::KeyVerificationAccept => { + let event = match from_value::(value) { + Ok(event) => event, + Err(error) => return Err(D::Error::custom(error.to_string())), + }; + + Ok(Event::KeyVerificationAccept(event)) + } + EventType::KeyVerificationCancel => { + let event = match from_value::(value) { + Ok(event) => event, + Err(error) => return Err(D::Error::custom(error.to_string())), + }; + + Ok(Event::KeyVerificationCancel(event)) + } + EventType::KeyVerificationKey => { + let event = match from_value::(value) { + Ok(event) => event, + Err(error) => return Err(D::Error::custom(error.to_string())), + }; + + Ok(Event::KeyVerificationKey(event)) + } + EventType::KeyVerificationMac => { + let event = match from_value::(value) { + Ok(event) => event, + Err(error) => return Err(D::Error::custom(error.to_string())), + }; + + Ok(Event::KeyVerificationMac(event)) + } + EventType::KeyVerificationRequest => { + let event = match from_value::(value) { + Ok(event) => event, + Err(error) => return Err(D::Error::custom(error.to_string())), + }; + + Ok(Event::KeyVerificationRequest(event)) + } + EventType::KeyVerificationStart => { + let event = match from_value::(value) { + Ok(event) => event, + Err(error) => return Err(D::Error::custom(error.to_string())), + }; + + Ok(Event::KeyVerificationStart(event)) + } EventType::IgnoredUserList => { let event = match from_value::(value) { Ok(event) => event, @@ -440,6 +571,22 @@ impl<'de> Deserialize<'de> for Event { Ok(Event::RoomCreate(event)) } + EventType::RoomEncrypted => { + let event = match from_value::(value) { + Ok(event) => event, + Err(error) => return Err(D::Error::custom(error.to_string())), + }; + + Ok(Event::RoomEncrypted(event)) + } + EventType::RoomEncryption => { + let event = match from_value::(value) { + Ok(event) => event, + Err(error) => return Err(D::Error::custom(error.to_string())), + }; + + Ok(Event::RoomEncryption(event)) + } EventType::RoomGuestAccess => { let event = match from_value::(value) { Ok(event) => event, @@ -552,6 +699,22 @@ impl<'de> Deserialize<'de> for Event { Ok(Event::RoomTopic(event)) } + EventType::RoomKey => { + let event = match from_value::(value) { + Ok(event) => event, + Err(error) => return Err(D::Error::custom(error.to_string())), + }; + + Ok(Event::RoomKey(event)) + } + EventType::RoomKeyRequest => { + let event = match from_value::(value) { + Ok(event) => event, + Err(error) => return Err(D::Error::custom(error.to_string())), + }; + + Ok(Event::RoomKeyRequest(event)) + } EventType::Sticker => { let event = match from_value::(value) { Ok(event) => event, @@ -624,6 +787,8 @@ impl Serialize for RoomEvent { RoomEvent::RoomAvatar(ref event) => event.serialize(serializer), RoomEvent::RoomCanonicalAlias(ref event) => event.serialize(serializer), RoomEvent::RoomCreate(ref event) => event.serialize(serializer), + RoomEvent::RoomEncrypted(ref event) => event.serialize(serializer), + RoomEvent::RoomEncryption(ref event) => event.serialize(serializer), RoomEvent::RoomGuestAccess(ref event) => event.serialize(serializer), RoomEvent::RoomHistoryVisibility(ref event) => event.serialize(serializer), RoomEvent::RoomJoinRules(ref event) => event.serialize(serializer), @@ -727,6 +892,22 @@ impl<'de> Deserialize<'de> for RoomEvent { Ok(RoomEvent::RoomCreate(event)) } + EventType::RoomEncrypted => { + let event = match from_value::(value) { + Ok(event) => event, + Err(error) => return Err(D::Error::custom(error.to_string())), + }; + + Ok(RoomEvent::RoomEncrypted(event)) + } + EventType::RoomEncryption => { + let event = match from_value::(value) { + Ok(event) => event, + Err(error) => return Err(D::Error::custom(error.to_string())), + }; + + Ok(RoomEvent::RoomEncryption(event)) + } EventType::RoomGuestAccess => { let event = match from_value::(value) { Ok(event) => event, @@ -865,10 +1046,20 @@ impl<'de> Deserialize<'de> for RoomEvent { } } EventType::Direct + | EventType::Dummy + | EventType::ForwardedRoomKey | EventType::FullyRead + | EventType::KeyVerificationAccept + | EventType::KeyVerificationCancel + | EventType::KeyVerificationKey + | EventType::KeyVerificationMac + | EventType::KeyVerificationRequest + | EventType::KeyVerificationStart | EventType::IgnoredUserList | EventType::Presence | EventType::Receipt + | EventType::RoomKey + | EventType::RoomKeyRequest | EventType::Tag | EventType::Typing => Err(D::Error::custom("not a room event".to_string())), EventType::__Nonexhaustive => { @@ -888,6 +1079,7 @@ impl Serialize for StateEvent { StateEvent::RoomAvatar(ref event) => event.serialize(serializer), StateEvent::RoomCanonicalAlias(ref event) => event.serialize(serializer), StateEvent::RoomCreate(ref event) => event.serialize(serializer), + StateEvent::RoomEncryption(ref event) => event.serialize(serializer), StateEvent::RoomGuestAccess(ref event) => event.serialize(serializer), StateEvent::RoomHistoryVisibility(ref event) => event.serialize(serializer), StateEvent::RoomJoinRules(ref event) => event.serialize(serializer), @@ -954,6 +1146,14 @@ impl<'de> Deserialize<'de> for StateEvent { Ok(StateEvent::RoomCreate(event)) } + EventType::RoomEncryption => { + let event = match from_value::(value) { + Ok(event) => event, + Err(error) => return Err(D::Error::custom(error.to_string())), + }; + + Ok(StateEvent::RoomEncryption(event)) + } EventType::RoomGuestAccess => { let event = match from_value::(value) { Ok(event) => event, @@ -1055,13 +1255,24 @@ impl<'de> Deserialize<'de> for StateEvent { | EventType::CallHangup | EventType::CallInvite | EventType::Direct + | EventType::Dummy + | EventType::ForwardedRoomKey | EventType::FullyRead + | EventType::KeyVerificationAccept + | EventType::KeyVerificationCancel + | EventType::KeyVerificationKey + | EventType::KeyVerificationMac + | EventType::KeyVerificationRequest + | EventType::KeyVerificationStart | EventType::IgnoredUserList | EventType::Presence | EventType::Receipt + | EventType::RoomEncrypted | EventType::RoomMessage | EventType::RoomMessageFeedback | EventType::RoomRedaction + | EventType::RoomKey + | EventType::RoomKeyRequest | EventType::Sticker | EventType::Tag | EventType::Typing => Err(D::Error::custom("not a state event".to_string())), @@ -1087,7 +1298,15 @@ impl_from_t_for_event!(CandidatesEvent, CallCandidates); impl_from_t_for_event!(HangupEvent, CallHangup); impl_from_t_for_event!(InviteEvent, CallInvite); impl_from_t_for_event!(DirectEvent, Direct); +impl_from_t_for_event!(DummyEvent, Dummy); +impl_from_t_for_event!(ForwardedRoomKeyEvent, ForwardedRoomKey); impl_from_t_for_event!(FullyReadEvent, FullyRead); +impl_from_t_for_event!(AcceptEvent, KeyVerificationAccept); +impl_from_t_for_event!(CancelEvent, KeyVerificationCancel); +impl_from_t_for_event!(KeyEvent, KeyVerificationKey); +impl_from_t_for_event!(MacEvent, KeyVerificationMac); +impl_from_t_for_event!(RequestEvent, KeyVerificationRequest); +impl_from_t_for_event!(StartEvent, KeyVerificationStart); impl_from_t_for_event!(IgnoredUserListEvent, IgnoredUserList); impl_from_t_for_event!(PresenceEvent, Presence); impl_from_t_for_event!(ReceiptEvent, Receipt); @@ -1095,6 +1314,8 @@ impl_from_t_for_event!(AliasesEvent, RoomAliases); impl_from_t_for_event!(AvatarEvent, RoomAvatar); impl_from_t_for_event!(CanonicalAliasEvent, RoomCanonicalAlias); impl_from_t_for_event!(CreateEvent, RoomCreate); +impl_from_t_for_event!(EncryptedEvent, RoomEncrypted); +impl_from_t_for_event!(EncryptionEvent, RoomEncryption); impl_from_t_for_event!(GuestAccessEvent, RoomGuestAccess); impl_from_t_for_event!(HistoryVisibilityEvent, RoomHistoryVisibility); impl_from_t_for_event!(JoinRulesEvent, RoomJoinRules); @@ -1109,6 +1330,8 @@ impl_from_t_for_event!(ServerAclEvent, RoomServerAcl); impl_from_t_for_event!(ThirdPartyInviteEvent, RoomThirdPartyInvite); impl_from_t_for_event!(TombstoneEvent, RoomTombstone); impl_from_t_for_event!(TopicEvent, RoomTopic); +impl_from_t_for_event!(RoomKeyEvent, RoomKey); +impl_from_t_for_event!(RoomKeyRequestEvent, RoomKeyRequest); impl_from_t_for_event!(StickerEvent, Sticker); impl_from_t_for_event!(TagEvent, Tag); impl_from_t_for_event!(TypingEvent, Typing); @@ -1134,6 +1357,8 @@ impl_from_t_for_room_event!(AliasesEvent, RoomAliases); impl_from_t_for_room_event!(AvatarEvent, RoomAvatar); impl_from_t_for_room_event!(CanonicalAliasEvent, RoomCanonicalAlias); impl_from_t_for_room_event!(CreateEvent, RoomCreate); +impl_from_t_for_room_event!(EncryptedEvent, RoomEncrypted); +impl_from_t_for_room_event!(EncryptionEvent, RoomEncryption); impl_from_t_for_room_event!(GuestAccessEvent, RoomGuestAccess); impl_from_t_for_room_event!(HistoryVisibilityEvent, RoomHistoryVisibility); impl_from_t_for_room_event!(JoinRulesEvent, RoomJoinRules); @@ -1166,6 +1391,7 @@ impl_from_t_for_state_event!(AliasesEvent, RoomAliases); impl_from_t_for_state_event!(AvatarEvent, RoomAvatar); impl_from_t_for_state_event!(CanonicalAliasEvent, RoomCanonicalAlias); impl_from_t_for_state_event!(CreateEvent, RoomCreate); +impl_from_t_for_state_event!(EncryptionEvent, RoomEncryption); impl_from_t_for_state_event!(GuestAccessEvent, RoomGuestAccess); impl_from_t_for_state_event!(HistoryVisibilityEvent, RoomHistoryVisibility); impl_from_t_for_state_event!(JoinRulesEvent, RoomJoinRules); diff --git a/src/collections/only.rs b/src/collections/only.rs index 47bfaf57..e36e8a52 100644 --- a/src/collections/only.rs +++ b/src/collections/only.rs @@ -10,14 +10,23 @@ use crate::{ answer::AnswerEvent, candidates::CandidatesEvent, hangup::HangupEvent, invite::InviteEvent, }, direct::DirectEvent, + dummy::DummyEvent, + forwarded_room_key::ForwardedRoomKeyEvent, fully_read::FullyReadEvent, ignored_user_list::IgnoredUserListEvent, + key::verification::{ + accept::AcceptEvent, cancel::CancelEvent, key::KeyEvent, mac::MacEvent, + request::RequestEvent, start::StartEvent, + }, presence::PresenceEvent, receipt::ReceiptEvent, room::{ + encrypted::EncryptedEvent, message::{feedback::FeedbackEvent, MessageEvent}, redaction::RedactionEvent, }, + room_key::RoomKeyEvent, + room_key_request::RoomKeyRequestEvent, sticker::StickerEvent, tag::TagEvent, typing::TypingEvent, @@ -30,15 +39,45 @@ pub enum Event { /// m.direct Direct(DirectEvent), + /// m.dummy + Dummy(DummyEvent), + + /// m.forwarded_room_key + ForwardedRoomKey(ForwardedRoomKeyEvent), + /// m.fully_read FullyRead(FullyReadEvent), + /// m.key.verification.accept + KeyVerificationAccept(AcceptEvent), + + /// m.key.verification.cancel + KeyVerificationCancel(CancelEvent), + + /// m.key.verification.key + KeyVerificationKey(KeyEvent), + + /// m.key.verification.mac + KeyVerificationMac(MacEvent), + + /// m.key.verification.request + KeyVerificationRequest(RequestEvent), + + /// m.key.verification.start + KeyVerificationStart(StartEvent), + /// m.ignored_user_list IgnoredUserList(IgnoredUserListEvent), /// m.presence Presence(PresenceEvent), + /// m.room_key + RoomKey(RoomKeyEvent), + + /// m.room_key_request + RoomKeyRequest(RoomKeyRequestEvent), + /// m.receipt Receipt(ReceiptEvent), @@ -68,6 +107,9 @@ pub enum RoomEvent { /// m.call.invite CallInvite(InviteEvent), + /// m.room.encrypted + RoomEncrypted(EncryptedEvent), + /// m.room.message RoomMessage(MessageEvent), @@ -91,10 +133,20 @@ impl Serialize for Event { { match *self { Event::Direct(ref event) => event.serialize(serializer), + Event::Dummy(ref event) => event.serialize(serializer), + Event::ForwardedRoomKey(ref event) => event.serialize(serializer), Event::FullyRead(ref event) => event.serialize(serializer), + Event::KeyVerificationAccept(ref event) => event.serialize(serializer), + Event::KeyVerificationCancel(ref event) => event.serialize(serializer), + Event::KeyVerificationKey(ref event) => event.serialize(serializer), + Event::KeyVerificationMac(ref event) => event.serialize(serializer), + Event::KeyVerificationRequest(ref event) => event.serialize(serializer), + Event::KeyVerificationStart(ref event) => event.serialize(serializer), Event::IgnoredUserList(ref event) => event.serialize(serializer), Event::Presence(ref event) => event.serialize(serializer), Event::Receipt(ref event) => event.serialize(serializer), + Event::RoomKey(ref event) => event.serialize(serializer), + Event::RoomKeyRequest(ref event) => event.serialize(serializer), Event::Tag(ref event) => event.serialize(serializer), Event::Typing(ref event) => event.serialize(serializer), Event::Custom(ref event) => event.serialize(serializer), @@ -128,6 +180,22 @@ impl<'de> Deserialize<'de> for Event { Ok(Event::Direct(event)) } + EventType::Dummy => { + let event = match from_value::(value) { + Ok(event) => event, + Err(error) => return Err(D::Error::custom(error.to_string())), + }; + + Ok(Event::Dummy(event)) + } + EventType::ForwardedRoomKey => { + let event = match from_value::(value) { + Ok(event) => event, + Err(error) => return Err(D::Error::custom(error.to_string())), + }; + + Ok(Event::ForwardedRoomKey(event)) + } EventType::FullyRead => { let event = match from_value::(value) { Ok(event) => event, @@ -136,6 +204,54 @@ impl<'de> Deserialize<'de> for Event { Ok(Event::FullyRead(event)) } + EventType::KeyVerificationAccept => { + let event = match from_value::(value) { + Ok(event) => event, + Err(error) => return Err(D::Error::custom(error.to_string())), + }; + + Ok(Event::KeyVerificationAccept(event)) + } + EventType::KeyVerificationCancel => { + let event = match from_value::(value) { + Ok(event) => event, + Err(error) => return Err(D::Error::custom(error.to_string())), + }; + + Ok(Event::KeyVerificationCancel(event)) + } + EventType::KeyVerificationKey => { + let event = match from_value::(value) { + Ok(event) => event, + Err(error) => return Err(D::Error::custom(error.to_string())), + }; + + Ok(Event::KeyVerificationKey(event)) + } + EventType::KeyVerificationMac => { + let event = match from_value::(value) { + Ok(event) => event, + Err(error) => return Err(D::Error::custom(error.to_string())), + }; + + Ok(Event::KeyVerificationMac(event)) + } + EventType::KeyVerificationRequest => { + let event = match from_value::(value) { + Ok(event) => event, + Err(error) => return Err(D::Error::custom(error.to_string())), + }; + + Ok(Event::KeyVerificationRequest(event)) + } + EventType::KeyVerificationStart => { + let event = match from_value::(value) { + Ok(event) => event, + Err(error) => return Err(D::Error::custom(error.to_string())), + }; + + Ok(Event::KeyVerificationStart(event)) + } EventType::IgnoredUserList => { let event = match from_value::(value) { Ok(event) => event, @@ -160,6 +276,22 @@ impl<'de> Deserialize<'de> for Event { Ok(Event::Receipt(event)) } + EventType::RoomKey => { + let event = match from_value::(value) { + Ok(event) => event, + Err(error) => return Err(D::Error::custom(error.to_string())), + }; + + Ok(Event::RoomKey(event)) + } + EventType::RoomKeyRequest => { + let event = match from_value::(value) { + Ok(event) => event, + Err(error) => return Err(D::Error::custom(error.to_string())), + }; + + Ok(Event::RoomKeyRequest(event)) + } EventType::Tag => { let event = match from_value::(value) { Ok(event) => event, @@ -192,6 +324,8 @@ impl<'de> Deserialize<'de> for Event { | EventType::RoomAvatar | EventType::RoomCanonicalAlias | EventType::RoomCreate + | EventType::RoomEncrypted + | EventType::RoomEncryption | EventType::RoomGuestAccess | EventType::RoomHistoryVisibility | EventType::RoomJoinRules @@ -226,6 +360,7 @@ impl Serialize for RoomEvent { RoomEvent::CallCandidates(ref event) => event.serialize(serializer), RoomEvent::CallHangup(ref event) => event.serialize(serializer), RoomEvent::CallInvite(ref event) => event.serialize(serializer), + RoomEvent::RoomEncrypted(ref event) => event.serialize(serializer), RoomEvent::RoomMessage(ref event) => event.serialize(serializer), RoomEvent::RoomMessageFeedback(ref event) => event.serialize(serializer), RoomEvent::RoomRedaction(ref event) => event.serialize(serializer), @@ -285,6 +420,14 @@ impl<'de> Deserialize<'de> for RoomEvent { Ok(RoomEvent::CallInvite(event)) } + EventType::RoomEncrypted => { + let event = match from_value::(value) { + Ok(event) => event, + Err(error) => return Err(D::Error::custom(error.to_string())), + }; + + Ok(RoomEvent::RoomEncrypted(event)) + } EventType::RoomMessage => { let event = match from_value::(value) { Ok(event) => event, @@ -326,7 +469,15 @@ impl<'de> Deserialize<'de> for RoomEvent { Ok(RoomEvent::CustomRoom(event)) } EventType::Direct + | EventType::Dummy + | EventType::ForwardedRoomKey | EventType::FullyRead + | EventType::KeyVerificationAccept + | EventType::KeyVerificationCancel + | EventType::KeyVerificationKey + | EventType::KeyVerificationMac + | EventType::KeyVerificationRequest + | EventType::KeyVerificationStart | EventType::IgnoredUserList | EventType::Presence | EventType::Receipt @@ -334,6 +485,7 @@ impl<'de> Deserialize<'de> for RoomEvent { | EventType::RoomAvatar | EventType::RoomCanonicalAlias | EventType::RoomCreate + | EventType::RoomEncryption | EventType::RoomGuestAccess | EventType::RoomHistoryVisibility | EventType::RoomJoinRules @@ -345,6 +497,8 @@ impl<'de> Deserialize<'de> for RoomEvent { | EventType::RoomThirdPartyInvite | EventType::RoomTombstone | EventType::RoomTopic + | EventType::RoomKey + | EventType::RoomKeyRequest | EventType::Tag | EventType::Typing => { Err(D::Error::custom("not exclusively a room event".to_string())) @@ -366,7 +520,15 @@ macro_rules! impl_from_t_for_event { } impl_from_t_for_event!(DirectEvent, Direct); +impl_from_t_for_event!(DummyEvent, Dummy); +impl_from_t_for_event!(ForwardedRoomKeyEvent, ForwardedRoomKey); impl_from_t_for_event!(FullyReadEvent, FullyRead); +impl_from_t_for_event!(AcceptEvent, KeyVerificationAccept); +impl_from_t_for_event!(CancelEvent, KeyVerificationCancel); +impl_from_t_for_event!(KeyEvent, KeyVerificationKey); +impl_from_t_for_event!(MacEvent, KeyVerificationMac); +impl_from_t_for_event!(RequestEvent, KeyVerificationRequest); +impl_from_t_for_event!(StartEvent, KeyVerificationStart); impl_from_t_for_event!(IgnoredUserListEvent, IgnoredUserList); impl_from_t_for_event!(PresenceEvent, Presence); impl_from_t_for_event!(ReceiptEvent, Receipt); @@ -388,6 +550,7 @@ impl_from_t_for_room_event!(AnswerEvent, CallAnswer); impl_from_t_for_room_event!(CandidatesEvent, CallCandidates); impl_from_t_for_room_event!(HangupEvent, CallHangup); impl_from_t_for_room_event!(InviteEvent, CallInvite); +impl_from_t_for_room_event!(EncryptedEvent, RoomEncrypted); impl_from_t_for_room_event!(MessageEvent, RoomMessage); impl_from_t_for_room_event!(FeedbackEvent, RoomMessageFeedback); impl_from_t_for_room_event!(RedactionEvent, RoomRedaction); diff --git a/src/lib.rs b/src/lib.rs index 218e7f0e..3ca49419 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -155,9 +155,33 @@ pub enum EventType { /// m.direct Direct, + /// m.dummy + Dummy, + + /// m.forwarded_room_key + ForwardedRoomKey, + /// m.fully_read FullyRead, + /// m.key.verification.accept + KeyVerificationAccept, + + /// m.key.verification.cancel + KeyVerificationCancel, + + /// m.key.verification.key + KeyVerificationKey, + + /// m.key.verification.mac + KeyVerificationMac, + + /// m.key.verification.request + KeyVerificationRequest, + + /// m.key.verification.start + KeyVerificationStart, + /// m.ignored_user_list IgnoredUserList, @@ -179,6 +203,12 @@ pub enum EventType { /// m.room.create RoomCreate, + /// m.room.encrypted + RoomEncrypted, + + /// m.room.encryption + RoomEncryption, + /// m.room.guest_access RoomGuestAccess, @@ -221,6 +251,12 @@ pub enum EventType { /// m.room.topic RoomTopic, + /// m.room_key + RoomKey, + + /// m.room_key_request + RoomKeyRequest, + /// m.sticker Sticker, @@ -308,7 +344,15 @@ impl Display for EventType { EventType::CallHangup => "m.call.hangup", EventType::CallInvite => "m.call.invite", EventType::Direct => "m.direct", + EventType::Dummy => "m.dummy", + EventType::ForwardedRoomKey => "m.forwarded_room_key", EventType::FullyRead => "m.fully_read", + EventType::KeyVerificationAccept => "m.key.verification.accept", + EventType::KeyVerificationCancel => "m.key.verification.cancel", + EventType::KeyVerificationKey => "m.key.verification.key", + EventType::KeyVerificationMac => "m.key.verification.mac", + EventType::KeyVerificationRequest => "m.key.verification.request", + EventType::KeyVerificationStart => "m.key.verification.start", EventType::IgnoredUserList => "m.ignored_user_list", EventType::Presence => "m.presence", EventType::Receipt => "m.receipt", @@ -316,6 +360,8 @@ impl Display for EventType { EventType::RoomAvatar => "m.room.avatar", EventType::RoomCanonicalAlias => "m.room.canonical_alias", EventType::RoomCreate => "m.room.create", + EventType::RoomEncrypted => "m.room.encrypted", + EventType::RoomEncryption => "m.room.encryption", EventType::RoomGuestAccess => "m.room.guest_access", EventType::RoomHistoryVisibility => "m.room.history_visibility", EventType::RoomJoinRules => "m.room.join_rules", @@ -330,6 +376,8 @@ impl Display for EventType { EventType::RoomThirdPartyInvite => "m.room.third_party_invite", EventType::RoomTombstone => "m.room.tombstone", EventType::RoomTopic => "m.room.topic", + EventType::RoomKey => "m.room_key", + EventType::RoomKeyRequest => "m.room_key_request", EventType::Sticker => "m.sticker", EventType::Tag => "m.tag", EventType::Typing => "m.typing", @@ -351,7 +399,15 @@ impl<'a> From<&'a str> for EventType { "m.call.hangup" => EventType::CallHangup, "m.call.invite" => EventType::CallInvite, "m.direct" => EventType::Direct, + "m.dummy" => EventType::Dummy, + "m.forwarded_room_key" => EventType::ForwardedRoomKey, "m.fully_read" => EventType::FullyRead, + "m.key.verification.accept" => EventType::KeyVerificationAccept, + "m.key.verification.cancel" => EventType::KeyVerificationCancel, + "m.key.verification.key" => EventType::KeyVerificationKey, + "m.key.verification.mac" => EventType::KeyVerificationMac, + "m.key.verification.request" => EventType::KeyVerificationRequest, + "m.key.verification.start" => EventType::KeyVerificationStart, "m.ignored_user_list" => EventType::IgnoredUserList, "m.presence" => EventType::Presence, "m.receipt" => EventType::Receipt, @@ -359,6 +415,8 @@ impl<'a> From<&'a str> for EventType { "m.room.avatar" => EventType::RoomAvatar, "m.room.canonical_alias" => EventType::RoomCanonicalAlias, "m.room.create" => EventType::RoomCreate, + "m.room.encrypted" => EventType::RoomEncrypted, + "m.room.encryption" => EventType::RoomEncryption, "m.room.guest_access" => EventType::RoomGuestAccess, "m.room.history_visibility" => EventType::RoomHistoryVisibility, "m.room.join_rules" => EventType::RoomJoinRules, @@ -373,6 +431,8 @@ impl<'a> From<&'a str> for EventType { "m.room.third_party_invite" => EventType::RoomThirdPartyInvite, "m.room.tombstone" => EventType::RoomTombstone, "m.room.topic" => EventType::RoomTopic, + "m.room_key" => EventType::RoomKey, + "m.room_key_request" => EventType::RoomKeyRequest, "m.sticker" => EventType::Sticker, "m.tag" => EventType::Tag, "m.typing" => EventType::Typing,