Skip to content

Commit 2c36a67

Browse files
authored
Include user membership on events (#17282)
MSC4115 has now completed FCP, so we can enable it by default and switch to the stable identifier.
1 parent c12ee0d commit 2c36a67

File tree

18 files changed

+8
-45
lines changed

18 files changed

+8
-45
lines changed

changelog.d/17282.feature

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Include user membership in events served to clients, per MSC4115.

docker/complement/conf/workers-shared-extra.yaml.j2

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -105,8 +105,6 @@ experimental_features:
105105
# Expose a room summary for public rooms
106106
msc3266_enabled: true
107107

108-
msc4115_membership_on_events: true
109-
110108
server_notices:
111109
system_mxid_localpart: _server
112110
system_mxid_display_name: "Server Alert"

scripts-dev/complement.sh

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -223,7 +223,6 @@ test_packages=(
223223
./tests/msc3930
224224
./tests/msc3902
225225
./tests/msc3967
226-
./tests/msc4115
227226
)
228227

229228
# Enable dirty runs, so tests will reuse the same container where possible.

synapse/api/constants.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -238,7 +238,7 @@ class EventUnsignedContentFields:
238238
"""Fields found inside the 'unsigned' data on events"""
239239

240240
# Requesting user's membership, per MSC4115
241-
MSC4115_MEMBERSHIP: Final = "io.element.msc4115.membership"
241+
MEMBERSHIP: Final = "membership"
242242

243243

244244
class RoomTypes:

synapse/config/experimental.py

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -436,10 +436,6 @@ def read_config(self, config: JsonDict, **kwargs: Any) -> None:
436436
("experimental", "msc4108_delegation_endpoint"),
437437
)
438438

439-
self.msc4115_membership_on_events = experimental.get(
440-
"msc4115_membership_on_events", False
441-
)
442-
443439
self.msc3916_authenticated_media_enabled = experimental.get(
444440
"msc3916_authenticated_media_enabled", False
445441
)

synapse/handlers/admin.py

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,6 @@ def __init__(self, hs: "HomeServer"):
4242
self._device_handler = hs.get_device_handler()
4343
self._storage_controllers = hs.get_storage_controllers()
4444
self._state_storage_controller = self._storage_controllers.state
45-
self._hs_config = hs.config
4645
self._msc3866_enabled = hs.config.experimental.msc3866.enabled
4746

4847
async def get_whois(self, user: UserID) -> JsonMapping:
@@ -215,7 +214,6 @@ async def export_user_data(self, user_id: str, writer: "ExfiltrationWriter") ->
215214
self._storage_controllers,
216215
user_id,
217216
events,
218-
msc4115_membership_on_events=self._hs_config.experimental.msc4115_membership_on_events,
219217
)
220218

221219
writer.write_events(room_id, events)

synapse/handlers/events.py

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -148,7 +148,6 @@ class EventHandler:
148148
def __init__(self, hs: "HomeServer"):
149149
self.store = hs.get_datastores().main
150150
self._storage_controllers = hs.get_storage_controllers()
151-
self._config = hs.config
152151

153152
async def get_event(
154153
self,
@@ -194,7 +193,6 @@ async def get_event(
194193
user.to_string(),
195194
[event],
196195
is_peeking=is_peeking,
197-
msc4115_membership_on_events=self._config.experimental.msc4115_membership_on_events,
198196
)
199197

200198
if not filtered:

synapse/handlers/initial_sync.py

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -224,7 +224,6 @@ async def handle_room(event: RoomsForUser) -> None:
224224
self._storage_controllers,
225225
user_id,
226226
messages,
227-
msc4115_membership_on_events=self.hs.config.experimental.msc4115_membership_on_events,
228227
)
229228

230229
start_token = now_token.copy_and_replace(StreamKeyType.ROOM, token)
@@ -383,7 +382,6 @@ async def _room_initial_sync_parted(
383382
requester.user.to_string(),
384383
messages,
385384
is_peeking=is_peeking,
386-
msc4115_membership_on_events=self.hs.config.experimental.msc4115_membership_on_events,
387385
)
388386

389387
start_token = StreamToken.START.copy_and_replace(StreamKeyType.ROOM, token)
@@ -498,7 +496,6 @@ async def get_receipts() -> List[JsonMapping]:
498496
requester.user.to_string(),
499497
messages,
500498
is_peeking=is_peeking,
501-
msc4115_membership_on_events=self.hs.config.experimental.msc4115_membership_on_events,
502499
)
503500

504501
start_token = now_token.copy_and_replace(StreamKeyType.ROOM, token)

synapse/handlers/pagination.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -623,7 +623,6 @@ async def get_messages(
623623
user_id,
624624
events,
625625
is_peeking=(member_event_id is None),
626-
msc4115_membership_on_events=self.hs.config.experimental.msc4115_membership_on_events,
627626
)
628627

629628
# if after the filter applied there are no more events

synapse/handlers/relations.py

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,6 @@ def __init__(self, hs: "HomeServer"):
9595
self._event_handler = hs.get_event_handler()
9696
self._event_serializer = hs.get_event_client_serializer()
9797
self._event_creation_handler = hs.get_event_creation_handler()
98-
self._config = hs.config
9998

10099
async def get_relations(
101100
self,
@@ -164,7 +163,6 @@ async def get_relations(
164163
user_id,
165164
events,
166165
is_peeking=(member_event_id is None),
167-
msc4115_membership_on_events=self._config.experimental.msc4115_membership_on_events,
168166
)
169167

170168
# The relations returned for the requested event do include their
@@ -610,7 +608,6 @@ async def get_threads(
610608
user_id,
611609
events,
612610
is_peeking=(member_event_id is None),
613-
msc4115_membership_on_events=self._config.experimental.msc4115_membership_on_events,
614611
)
615612

616613
aggregations = await self.get_bundled_aggregations(

synapse/handlers/room.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1476,7 +1476,6 @@ async def filter_evts(events: List[EventBase]) -> List[EventBase]:
14761476
user.to_string(),
14771477
events,
14781478
is_peeking=is_peeking,
1479-
msc4115_membership_on_events=self.hs.config.experimental.msc4115_membership_on_events,
14801479
)
14811480

14821481
event = await self.store.get_event(

synapse/handlers/search.py

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -483,7 +483,6 @@ async def _search_by_rank(
483483
self._storage_controllers,
484484
user.to_string(),
485485
filtered_events,
486-
msc4115_membership_on_events=self.hs.config.experimental.msc4115_membership_on_events,
487486
)
488487

489488
events.sort(key=lambda e: -rank_map[e.event_id])
@@ -585,7 +584,6 @@ async def _search_by_recent(
585584
self._storage_controllers,
586585
user.to_string(),
587586
filtered_events,
588-
msc4115_membership_on_events=self.hs.config.experimental.msc4115_membership_on_events,
589587
)
590588

591589
room_events.extend(events)
@@ -673,14 +671,12 @@ async def _calculate_event_contexts(
673671
self._storage_controllers,
674672
user.to_string(),
675673
res.events_before,
676-
msc4115_membership_on_events=self.hs.config.experimental.msc4115_membership_on_events,
677674
)
678675

679676
events_after = await filter_events_for_client(
680677
self._storage_controllers,
681678
user.to_string(),
682679
res.events_after,
683-
msc4115_membership_on_events=self.hs.config.experimental.msc4115_membership_on_events,
684680
)
685681

686682
context: JsonDict = {

synapse/handlers/sync.py

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -844,7 +844,6 @@ async def _load_filtered_recents(
844844
sync_config.user.to_string(),
845845
recents,
846846
always_include_ids=current_state_ids,
847-
msc4115_membership_on_events=self.hs_config.experimental.msc4115_membership_on_events,
848847
)
849848
log_kv({"recents_after_visibility_filtering": len(recents)})
850849
else:
@@ -930,7 +929,6 @@ async def _load_filtered_recents(
930929
sync_config.user.to_string(),
931930
loaded_recents,
932931
always_include_ids=current_state_ids,
933-
msc4115_membership_on_events=self.hs_config.experimental.msc4115_membership_on_events,
934932
)
935933

936934
loaded_recents = []

synapse/notifier.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -721,7 +721,6 @@ async def check_for_updates(
721721
user.to_string(),
722722
new_events,
723723
is_peeking=is_peeking,
724-
msc4115_membership_on_events=self.hs.config.experimental.msc4115_membership_on_events,
725724
)
726725
elif keyname == StreamKeyType.PRESENCE:
727726
now = self.clock.time_msec()

synapse/push/mailer.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -532,7 +532,6 @@ async def _get_notif_vars(
532532
self._storage_controllers,
533533
user_id,
534534
results.events_before,
535-
msc4115_membership_on_events=self.hs.config.experimental.msc4115_membership_on_events,
536535
)
537536
the_events.append(notif_event)
538537

synapse/visibility.py

Lines changed: 3 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,6 @@ async def filter_events_for_client(
8282
is_peeking: bool = False,
8383
always_include_ids: FrozenSet[str] = frozenset(),
8484
filter_send_to_client: bool = True,
85-
msc4115_membership_on_events: bool = False,
8685
) -> List[EventBase]:
8786
"""
8887
Check which events a user is allowed to see. If the user can see the event but its
@@ -101,12 +100,10 @@ async def filter_events_for_client(
101100
filter_send_to_client: Whether we're checking an event that's going to be
102101
sent to a client. This might not always be the case since this function can
103102
also be called to check whether a user can see the state at a given point.
104-
msc4115_membership_on_events: Whether to include the requesting user's
105-
membership in the "unsigned" data, per MSC4115.
106103
107104
Returns:
108-
The filtered events. If `msc4115_membership_on_events` is true, the `unsigned`
109-
data is annotated with the membership state of `user_id` at each event.
105+
The filtered events. The `unsigned` data is annotated with the membership state
106+
of `user_id` at each event.
110107
"""
111108
# Filter out events that have been soft failed so that we don't relay them
112109
# to clients.
@@ -159,9 +156,6 @@ def allowed(event: EventBase) -> Optional[EventBase]:
159156
if filtered is None:
160157
return None
161158

162-
if not msc4115_membership_on_events:
163-
return filtered
164-
165159
# Annotate the event with the user's membership after the event.
166160
#
167161
# Normally we just look in `state_after_event`, but if the event is an outlier
@@ -186,7 +180,7 @@ def allowed(event: EventBase) -> Optional[EventBase]:
186180
# Copy the event before updating the unsigned data: this shouldn't be persisted
187181
# to the cache!
188182
cloned = clone_event(filtered)
189-
cloned.unsigned[EventUnsignedContentFields.MSC4115_MEMBERSHIP] = user_membership
183+
cloned.unsigned[EventUnsignedContentFields.MEMBERSHIP] = user_membership
190184

191185
return cloned
192186

tests/rest/client/test_retention.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -167,7 +167,6 @@ def test_visibility(self) -> None:
167167
storage_controllers,
168168
self.user_id,
169169
events,
170-
msc4115_membership_on_events=True,
171170
)
172171
)
173172

tests/test_visibility.py

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -336,15 +336,13 @@ def test_joined_history_visibility(self) -> None:
336336
self.hs.get_storage_controllers(),
337337
"@joiner:test",
338338
events_to_filter,
339-
msc4115_membership_on_events=True,
340339
)
341340
)
342341
resident_filtered_events = self.get_success(
343342
filter_events_for_client(
344343
self.hs.get_storage_controllers(),
345344
"@resident:test",
346345
events_to_filter,
347-
msc4115_membership_on_events=True,
348346
)
349347
)
350348

@@ -357,7 +355,7 @@ def test_joined_history_visibility(self) -> None:
357355
self.assertEqual(
358356
["join", "join", "leave"],
359357
[
360-
e.unsigned[EventUnsignedContentFields.MSC4115_MEMBERSHIP]
358+
e.unsigned[EventUnsignedContentFields.MEMBERSHIP]
361359
for e in joiner_filtered_events
362360
],
363361
)
@@ -379,7 +377,7 @@ def test_joined_history_visibility(self) -> None:
379377
self.assertEqual(
380378
["join", "join", "join", "join", "join"],
381379
[
382-
e.unsigned[EventUnsignedContentFields.MSC4115_MEMBERSHIP]
380+
e.unsigned[EventUnsignedContentFields.MEMBERSHIP]
383381
for e in resident_filtered_events
384382
],
385383
)
@@ -441,7 +439,6 @@ def test_out_of_band_invite_rejection(self) -> None:
441439
self.hs.get_storage_controllers(),
442440
"@user:test",
443441
[invite_event, reject_event],
444-
msc4115_membership_on_events=True,
445442
)
446443
)
447444
self.assertEqual(
@@ -451,7 +448,7 @@ def test_out_of_band_invite_rejection(self) -> None:
451448
self.assertEqual(
452449
["invite", "leave"],
453450
[
454-
e.unsigned[EventUnsignedContentFields.MSC4115_MEMBERSHIP]
451+
e.unsigned[EventUnsignedContentFields.MEMBERSHIP]
455452
for e in filtered_events
456453
],
457454
)
@@ -463,7 +460,6 @@ def test_out_of_band_invite_rejection(self) -> None:
463460
self.hs.get_storage_controllers(),
464461
"@other:test",
465462
[invite_event, reject_event],
466-
msc4115_membership_on_events=True,
467463
)
468464
),
469465
[],

0 commit comments

Comments
 (0)