mirror of
https://forgejo.ellis.link/continuwuation/continuwuity.git
synced 2026-05-26 20:49:55 +00:00
fix(sync/v3): Fix invite filtering for federated invites
This commit is contained in:
@@ -139,7 +139,7 @@ pub(crate) async fn create_invite_route(
|
|||||||
Some(invite_state),
|
Some(invite_state),
|
||||||
body.via.clone(),
|
body.via.clone(),
|
||||||
)
|
)
|
||||||
.await;
|
.await?;
|
||||||
|
|
||||||
services
|
services
|
||||||
.rooms
|
.rooms
|
||||||
|
|||||||
@@ -118,27 +118,11 @@ pub async fn update_membership(
|
|||||||
self.mark_as_joined(user_id, room_id);
|
self.mark_as_joined(user_id, room_id);
|
||||||
},
|
},
|
||||||
| MembershipState::Invite => {
|
| MembershipState::Invite => {
|
||||||
// return an error for blocked invites. ignored invites aren't handled here
|
|
||||||
// since the recipient's membership should still be changed to `invite`.
|
|
||||||
// they're filtered out in the individual /sync handlers
|
|
||||||
let sender = pdu.sender();
|
|
||||||
if matches!(
|
|
||||||
self.services
|
|
||||||
.users
|
|
||||||
.invite_filter_level(sender, user_id)
|
|
||||||
.await,
|
|
||||||
FilterLevel::Block
|
|
||||||
) {
|
|
||||||
return Err!(Request(InviteBlocked(
|
|
||||||
"{user_id} has blocked invites from {sender}."
|
|
||||||
)));
|
|
||||||
}
|
|
||||||
|
|
||||||
// TODO: make sure that passing None for `last_state` is correct behavior.
|
// TODO: make sure that passing None for `last_state` is correct behavior.
|
||||||
// the call from `append_pdu` used to use `services.state.summary_stripped`
|
// the call from `append_pdu` used to use `services.state.summary_stripped`
|
||||||
// to fill that parameter.
|
// to fill that parameter.
|
||||||
self.mark_as_invited(user_id, room_id, sender, None, None)
|
self.mark_as_invited(user_id, room_id, pdu.sender(), None, None)
|
||||||
.await;
|
.await?;
|
||||||
},
|
},
|
||||||
| MembershipState::Leave | MembershipState::Ban => {
|
| MembershipState::Leave | MembershipState::Ban => {
|
||||||
self.mark_as_left(user_id, room_id, Some(pdu.clone())).await;
|
self.mark_as_left(user_id, room_id, Some(pdu.clone())).await;
|
||||||
@@ -352,7 +336,20 @@ pub async fn mark_as_invited(
|
|||||||
sender_user: &UserId,
|
sender_user: &UserId,
|
||||||
last_state: Option<Vec<Raw<AnyStrippedStateEvent>>>,
|
last_state: Option<Vec<Raw<AnyStrippedStateEvent>>>,
|
||||||
invite_via: Option<Vec<OwnedServerName>>,
|
invite_via: Option<Vec<OwnedServerName>>,
|
||||||
) {
|
) -> Result<()> {
|
||||||
|
// return an error for blocked invites. ignored invites aren't handled here
|
||||||
|
// since the recipient's membership should still be changed to `invite`.
|
||||||
|
// they're filtered out in the individual /sync handlers
|
||||||
|
if matches!(
|
||||||
|
self.services
|
||||||
|
.users
|
||||||
|
.invite_filter_level(sender_user, user_id)
|
||||||
|
.await,
|
||||||
|
FilterLevel::Block
|
||||||
|
) {
|
||||||
|
return Err!(Request(InviteBlocked("{user_id} has blocked invites from {sender_user}.")));
|
||||||
|
}
|
||||||
|
|
||||||
let roomuser_id = (room_id, user_id);
|
let roomuser_id = (room_id, user_id);
|
||||||
let roomuser_id = serialize_key(roomuser_id).expect("failed to serialize roomuser_id");
|
let roomuser_id = serialize_key(roomuser_id).expect("failed to serialize roomuser_id");
|
||||||
|
|
||||||
@@ -381,4 +378,6 @@ pub async fn mark_as_invited(
|
|||||||
if let Some(servers) = invite_via.filter(is_not_empty!()) {
|
if let Some(servers) = invite_via.filter(is_not_empty!()) {
|
||||||
self.add_servers_invite_via(room_id, servers).await;
|
self.add_servers_invite_via(room_id, servers).await;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user