|
13 | 13 | # limitations under the License. |
14 | 14 | import logging |
15 | 15 | from typing import Optional |
| 16 | +from unittest.mock import patch |
16 | 17 |
|
17 | 18 | from synapse.api.room_versions import RoomVersions |
18 | | -from synapse.events import EventBase |
19 | | -from synapse.types import JsonDict |
20 | | -from synapse.visibility import filter_events_for_server |
| 19 | +from synapse.events import EventBase, make_event_from_dict |
| 20 | +from synapse.types import JsonDict, create_requester |
| 21 | +from synapse.visibility import filter_events_for_client, filter_events_for_server |
21 | 22 |
|
22 | 23 | from tests import unittest |
23 | 24 | from tests.utils import create_room |
@@ -185,3 +186,72 @@ def _inject_message( |
185 | 186 |
|
186 | 187 | self.get_success(self.storage.persistence.persist_event(event, context)) |
187 | 188 | return event |
| 189 | + |
| 190 | + |
| 191 | +class FilterEventsForClientTestCase(unittest.FederatingHomeserverTestCase): |
| 192 | + def test_out_of_band_invite_rejection(self): |
| 193 | + # this is where we have received an invite event over federation, and then |
| 194 | + # rejected it. |
| 195 | + invite_pdu = { |
| 196 | + "room_id": "!room:id", |
| 197 | + "depth": 1, |
| 198 | + "auth_events": [], |
| 199 | + "prev_events": [], |
| 200 | + "origin_server_ts": 1, |
| 201 | + "sender": "@someone:" + self.OTHER_SERVER_NAME, |
| 202 | + "type": "m.room.member", |
| 203 | + "state_key": "@user:test", |
| 204 | + "content": {"membership": "invite"}, |
| 205 | + } |
| 206 | + self.add_hashes_and_signatures(invite_pdu) |
| 207 | + invite_event_id = make_event_from_dict(invite_pdu, RoomVersions.V9).event_id |
| 208 | + |
| 209 | + self.get_success( |
| 210 | + self.hs.get_federation_server().on_invite_request( |
| 211 | + self.OTHER_SERVER_NAME, |
| 212 | + invite_pdu, |
| 213 | + "9", |
| 214 | + ) |
| 215 | + ) |
| 216 | + |
| 217 | + # stub out do_remotely_reject_invite so that we fall back to a locally- |
| 218 | + # generated rejection |
| 219 | + with patch.object( |
| 220 | + self.hs.get_federation_handler(), |
| 221 | + "do_remotely_reject_invite", |
| 222 | + side_effect=Exception(), |
| 223 | + ): |
| 224 | + reject_event_id, _ = self.get_success( |
| 225 | + self.hs.get_room_member_handler().remote_reject_invite( |
| 226 | + invite_event_id, |
| 227 | + txn_id=None, |
| 228 | + requester=create_requester("@user:test"), |
| 229 | + content={}, |
| 230 | + ) |
| 231 | + ) |
| 232 | + |
| 233 | + invite_event, reject_event = self.get_success( |
| 234 | + self.hs.get_datastores().main.get_events_as_list( |
| 235 | + [invite_event_id, reject_event_id] |
| 236 | + ) |
| 237 | + ) |
| 238 | + |
| 239 | + # the invited user should be able to see both the invite and the rejection |
| 240 | + self.assertEqual( |
| 241 | + self.get_success( |
| 242 | + filter_events_for_client( |
| 243 | + self.hs.get_storage(), "@user:test", [invite_event, reject_event] |
| 244 | + ) |
| 245 | + ), |
| 246 | + [invite_event, reject_event], |
| 247 | + ) |
| 248 | + |
| 249 | + # other users should see neither |
| 250 | + self.assertEqual( |
| 251 | + self.get_success( |
| 252 | + filter_events_for_client( |
| 253 | + self.hs.get_storage(), "@other:test", [invite_event, reject_event] |
| 254 | + ) |
| 255 | + ), |
| 256 | + [], |
| 257 | + ) |
0 commit comments