Skip to content

Commit dc881a0

Browse files
committed
events: Implment MSC4380 Invite Blocking.
matrix-org/matrix-spec-proposals#4380 Signed-off-by: Jason Volk <jason@zemos.net>
1 parent 91424b1 commit dc881a0

7 files changed

Lines changed: 93 additions & 0 deletions

File tree

crates/ruma-client-api/Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@ unstable-msc4191 = []
5454
# Thread subscription support.
5555
unstable-msc4306 = []
5656
unstable-msc4308 = []
57+
unstable-msc4380 = []
5758

5859
[dependencies]
5960
as_variant = { workspace = true }

crates/ruma-client-api/src/error.rs

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -166,6 +166,13 @@ pub enum ErrorKind {
166166
/// The desired user name is not valid.
167167
InvalidUsername,
168168

169+
/// `M_INVITE_BLOCKED`
170+
///
171+
/// The invite was interdicted by moderation tools or configured access controls without having
172+
/// been witnessed by the user.
173+
#[cfg(feature = "unstable-msc4380")]
174+
InviteBlocked,
175+
169176
/// `M_LIMIT_EXCEEDED`
170177
///
171178
/// The request has been refused due to [rate limiting]: too many requests have been sent in a
@@ -446,6 +453,8 @@ impl ErrorKind {
446453
ErrorKind::InvalidParam => ErrorCode::InvalidParam,
447454
ErrorKind::InvalidRoomState => ErrorCode::InvalidRoomState,
448455
ErrorKind::InvalidUsername => ErrorCode::InvalidUsername,
456+
#[cfg(feature = "unstable-msc4380")]
457+
ErrorKind::InviteBlocked => ErrorCode::InviteBlocked,
449458
ErrorKind::LimitExceeded { .. } => ErrorCode::LimitExceeded,
450459
ErrorKind::MissingParam => ErrorCode::MissingParam,
451460
ErrorKind::MissingToken => ErrorCode::MissingToken,
@@ -616,6 +625,16 @@ pub enum ErrorCode {
616625
/// The desired user name is not valid.
617626
InvalidUsername,
618627

628+
/// `M_INVITE_BLOCKED`
629+
///
630+
/// The invite was interdicted by moderation tools or configured access controls without having
631+
/// been witnessed by the user.
632+
///
633+
/// Unstable prefix intentionally shared with MSC4155 for compatibility.
634+
#[cfg(feature = "unstable-msc4380")]
635+
#[ruma_enum(rename = "ORG.MATRIX.MSC4155.INVITE_BLOCKED")]
636+
InviteBlocked,
637+
619638
/// `M_LIMIT_EXCEEDED`
620639
///
621640
/// The request has been refused due to [rate limiting]: too many requests have been sent in a

crates/ruma-client-api/src/error/kind_serde.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -198,6 +198,8 @@ impl<'de> Visitor<'de> for ErrorKindVisitor {
198198
ErrorCode::InvalidParam => ErrorKind::InvalidParam,
199199
ErrorCode::InvalidRoomState => ErrorKind::InvalidRoomState,
200200
ErrorCode::InvalidUsername => ErrorKind::InvalidUsername,
201+
#[cfg(feature = "unstable-msc4380")]
202+
ErrorCode::InviteBlocked => ErrorKind::InviteBlocked,
201203
ErrorCode::LimitExceeded => ErrorKind::LimitExceeded {
202204
retry_after: retry_after_ms
203205
.map(from_json_value::<UInt>)

crates/ruma-events/Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@ unstable-msc4319 = []
5454
unstable-msc4334 = ["dep:language-tags"]
5555
unstable-msc4359 = []
5656
unstable-msc4362 = []
57+
unstable-msc4380 = []
5758

5859
# Allow some mandatory fields to be missing, defaulting them to an empty string
5960
# in deserialization.

crates/ruma-events/src/enums.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,9 @@ event_enum! {
3535
#[ruma_enum(ident = DoNotDisturb, alias = "m.do_not_disturb")]
3636
"dm.filament.do_not_disturb" => super::do_not_disturb,
3737
"m.identity_server" => super::identity_server,
38+
#[cfg(feature = "unstable-msc4380")]
39+
#[ruma_enum(ident = InvitePermissionConfig, alias = "m.invite_permission_config")]
40+
"org.matrix.msc4380.invite_permission_config" => super::invite_permission_config,
3841
"m.ignored_user_list" => super::ignored_user_list,
3942
"m.push_rules" => super::push_rules,
4043
"m.secret_storage.default_key" => super::secret_storage::default_key,
Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
//! Types for the [`m.invite_permission_config`] account data event.
2+
//!
3+
//! [`m.invite_permission_config`]: https://github.com/matrix-org/matrix-spec-proposals/pull/4380
4+
5+
use ruma_macros::EventContent;
6+
use serde::{Deserialize, Serialize};
7+
8+
/// The content of an `m.invite_permission_config` event.
9+
///
10+
/// A single property: `block_all`.
11+
#[derive(Clone, Debug, Default, Deserialize, Serialize, EventContent)]
12+
#[cfg_attr(not(ruma_unstable_exhaustive_types), non_exhaustive)]
13+
#[ruma_event(
14+
kind = GlobalAccountData,
15+
type = "m.invite_permission_config",
16+
alias = "org.matrix.msc4380.invite_permission_config",
17+
)]
18+
pub struct InvitePermissionConfigEventContent {
19+
/// When set to true, indicates that the user does not wish to receive *any* room invites, and
20+
/// they should be blocked.
21+
pub block_all: bool,
22+
}
23+
24+
impl InvitePermissionConfigEventContent {
25+
/// Creates a new `InvitePermissionConfigEventContent` from the desired boolean state.
26+
pub fn new(block_all: bool) -> Self {
27+
Self { block_all }
28+
}
29+
}
30+
31+
#[cfg(test)]
32+
mod tests {
33+
use assert_matches2::assert_matches;
34+
use serde_json::{from_value as from_json_value, json, to_value as to_json_value};
35+
36+
use super::InvitePermissionConfigEventContent;
37+
use crate::AnyGlobalAccountDataEvent;
38+
39+
#[test]
40+
fn serialization() {
41+
let invite_permission_config = InvitePermissionConfigEventContent::new(true);
42+
43+
let json = json!({
44+
"block_all": true
45+
});
46+
47+
assert_eq!(to_json_value(invite_permission_config).unwrap(), json);
48+
}
49+
50+
#[test]
51+
fn deserialization() {
52+
let json = json!({
53+
"content": {
54+
"block_all": true
55+
},
56+
"type": "m.invite_permission_config"
57+
});
58+
59+
assert_matches!(
60+
from_json_value::<AnyGlobalAccountDataEvent>(json),
61+
Ok(AnyGlobalAccountDataEvent::InvitePermissionConfig(ev))
62+
);
63+
assert!(ev.content.block_all);
64+
}
65+
}

crates/ruma-events/src/lib.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -162,6 +162,8 @@ pub mod ignored_user_list;
162162
pub mod image;
163163
#[cfg(feature = "unstable-msc2545")]
164164
pub mod image_pack;
165+
#[cfg(feature = "unstable-msc4380")]
166+
pub mod invite_permission_config;
165167
pub mod key;
166168
#[cfg(feature = "unstable-msc3488")]
167169
pub mod location;

0 commit comments

Comments
 (0)