From a9267360cb37e664410c175aaa9ece85c3b0e269 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?K=C3=A9vin=20Commaille?= Date: Sun, 29 Sep 2024 10:37:29 +0200 Subject: [PATCH] client-api: Add support for account locking According to MSC3939. --- crates/ruma-client-api/CHANGELOG.md | 1 + crates/ruma-client-api/src/error.rs | 28 +++++++++++++++++++ .../ruma-client-api/src/error/kind_serde.rs | 4 ++- 3 files changed, 32 insertions(+), 1 deletion(-) diff --git a/crates/ruma-client-api/CHANGELOG.md b/crates/ruma-client-api/CHANGELOG.md index 580b1a3e..9dd39e5c 100644 --- a/crates/ruma-client-api/CHANGELOG.md +++ b/crates/ruma-client-api/CHANGELOG.md @@ -36,6 +36,7 @@ Improvements: - This is a breaking change, but only for users of `unstable-msc3575` - Add the `get_login_token` field to `Capabilities`, according to a clarification in the spec. +- Add support for account locking, according to MSC3939. Bug fixes: diff --git a/crates/ruma-client-api/src/error.rs b/crates/ruma-client-api/src/error.rs index 7d2ddeb6..ee064fe2 100644 --- a/crates/ruma-client-api/src/error.rs +++ b/crates/ruma-client-api/src/error.rs @@ -204,6 +204,9 @@ pub enum ErrorKind { #[cfg(feature = "unstable-msc3843")] Unactionable, + /// M_USER_LOCKED + UserLocked, + #[doc(hidden)] _Custom { errcode: PrivOwnedStr, extra: Extra }, } @@ -280,6 +283,7 @@ impl AsRef for ErrorKind { Self::WrongRoomKeysVersion { .. } => "M_WRONG_ROOM_KEYS_VERSION", #[cfg(feature = "unstable-msc3843")] Self::Unactionable => "M_UNACTIONABLE", + Self::UserLocked => "M_USER_LOCKED", Self::_Custom { errcode, .. } => &errcode.0, } } @@ -927,4 +931,28 @@ mod tests { }) ); } + + #[test] + fn serialize_user_locked() { + let error = Error::new( + http::StatusCode::UNAUTHORIZED, + ErrorBody::Standard { + kind: ErrorKind::UserLocked, + message: "This account has been locked".to_owned(), + }, + ); + + let response = error.try_into_http_response::>().unwrap(); + + assert_eq!(response.status(), http::StatusCode::UNAUTHORIZED); + let json_body: JsonValue = from_json_slice(response.body()).unwrap(); + assert_eq!( + json_body, + json!({ + "errcode": "M_USER_LOCKED", + "error": "This account has been locked", + "soft_logout": true, + }) + ); + } } diff --git a/crates/ruma-client-api/src/error/kind_serde.rs b/crates/ruma-client-api/src/error/kind_serde.rs index 5121b2f5..4ad4c48c 100644 --- a/crates/ruma-client-api/src/error/kind_serde.rs +++ b/crates/ruma-client-api/src/error/kind_serde.rs @@ -252,6 +252,7 @@ impl<'de> Visitor<'de> for ErrorKindVisitor { }, #[cfg(feature = "unstable-msc3843")] ErrCode::Unactionable => ErrorKind::Unactionable, + ErrCode::UserLocked => ErrorKind::UserLocked, ErrCode::_Custom(errcode) => ErrorKind::_Custom { errcode, extra }, }) } @@ -310,6 +311,7 @@ enum ErrCode { WrongRoomKeysVersion, #[cfg(feature = "unstable-msc3843")] Unactionable, + UserLocked, _Custom(PrivOwnedStr), } @@ -330,7 +332,7 @@ impl Serialize for ErrorKind { let mut st = serializer.serialize_map(None)?; st.serialize_entry("errcode", self.as_ref())?; match self { - Self::UnknownToken { soft_logout: true } => { + Self::UnknownToken { soft_logout: true } | Self::UserLocked => { st.serialize_entry("soft_logout", &true)?; } Self::LimitExceeded { retry_after: Some(RetryAfter::Delay(duration)) } => {