matrix_sdk_crypto/types/events/
secret_send.rs1use std::collections::BTreeMap;
18
19use ruma::{events::secret::request::SecretName, OwnedTransactionId};
20use serde::{Deserialize, Serialize};
21use serde_json::Value;
22use zeroize::Zeroize;
23
24use super::{EventType, ToDeviceEvent};
25
26pub type SecretSendEvent = ToDeviceEvent<SecretSendContent>;
28
29#[derive(Clone, Serialize, Deserialize)]
35pub struct SecretSendContent {
36 pub request_id: OwnedTransactionId,
38 pub secret: String,
40 #[serde(rename = "name", skip_serializing_if = "Option::is_none")]
44 pub secret_name: Option<SecretName>,
45 #[serde(flatten)]
47 other: BTreeMap<String, Value>,
48}
49
50impl SecretSendContent {
51 pub fn new(request_id: OwnedTransactionId, secret: String) -> Self {
53 Self { request_id, secret, secret_name: None, other: Default::default() }
54 }
55}
56
57impl Zeroize for SecretSendContent {
58 fn zeroize(&mut self) {
59 self.secret.zeroize();
60 }
61}
62
63impl Drop for SecretSendContent {
64 fn drop(&mut self) {
65 self.zeroize()
66 }
67}
68
69#[cfg(not(tarpaulin_include))]
70impl std::fmt::Debug for SecretSendContent {
71 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
72 f.debug_struct("SecretSendContent")
73 .field("request_id", &self.request_id)
74 .finish_non_exhaustive()
75 }
76}
77
78impl EventType for SecretSendContent {
79 const EVENT_TYPE: &'static str = "m.secret.send";
80}
81
82#[cfg(test)]
83pub(crate) mod tests {
84 use serde_json::{json, Value};
85
86 use super::SecretSendEvent;
87
88 pub(crate) fn json() -> Value {
89 json!({
90 "sender": "@alice:example.org",
91 "content": {
92 "request_id": "randomly_generated_id_9573",
93 "secret": "ThisIsASecretDon'tTellAnyone"
94 },
95 "type": "m.secret.send",
96 })
97 }
98
99 #[test]
100 fn deserialization() -> Result<(), serde_json::Error> {
101 let json = json();
102 let event: SecretSendEvent = serde_json::from_value(json.clone())?;
103
104 assert_eq!(&event.content.secret, "ThisIsASecretDon'tTellAnyone");
105
106 let serialized = serde_json::to_value(event)?;
107 assert_eq!(json, serialized);
108
109 Ok(())
110 }
111}