fix: prevent stripping the room's invite state

This commit is contained in:
avdb13 2025-01-28 23:00:08 +00:00
parent 1529d60a6a
commit f323faaf92
2 changed files with 33 additions and 6 deletions

View file

@ -239,6 +239,8 @@ This will be the first release of Grapevine since it was forked from Conduit
([!158](https://gitlab.computer.surgery/matrix/grapevine/-/merge_requests/158))
28. Fix read receipts not being sent over federation (or only arbitrarily late)
([!162](https://gitlab.computer.surgery/matrix/grapevine/-/merge_requests/162))
29. Prevent stripping the room's invite state.
([!159](https://gitlab.computer.surgery/matrix/grapevine/-/merge_requests/159))
### Added

View file

@ -1,7 +1,7 @@
use std::collections::HashSet;
use ruma::{
events::{AnyStrippedStateEvent, AnySyncStateEvent},
events::{AnyStateEvent, AnyStrippedStateEvent, AnySyncStateEvent},
serde::Raw,
OwnedRoomId, OwnedServerName, OwnedUserId, RoomId, ServerName, UserId,
};
@ -466,11 +466,36 @@ impl service::rooms::state_cache::Data for KeyValueDatabase {
)
})?;
let state = serde_json::from_slice(&state).map_err(|_| {
Error::bad_database(
"Invalid state in userroomid_invitestate.",
)
})?;
let state: Vec<Raw<AnyStateEvent>> =
serde_json::from_slice(&state).map_err(|_| {
Error::bad_database(
"Invalid state in userroomid_invitestate.",
)
})?;
// The semantics here are omitted by the spec, as the example
// does not strip the membership event: we cast the
// "m.room.member" event to avoid stripping it.
// See: https://spec.matrix.org/latest/server-server-api/#put_matrixfederationv2inviteroomideventid
let state: Vec<_> = state
.into_iter()
.map(|raw| {
match raw.deserialize().map_err(|_| {
Error::bad_database(
"Invalid state in userroomid_invitestate.",
)
})? {
AnyStateEvent::RoomMember(_) => Ok(raw.cast()),
_ => serde_json::from_str(raw.json().get())
.map_err(|_| {
Error::bad_database(
"Invalid state in \
userroomid_invitestate.",
)
}),
}
})
.collect::<Result<_>>()?;
Ok((room_id, state))
},