Skip to content
This repository was archived by the owner on Apr 26, 2024. It is now read-only.

Commit eaf3ab1

Browse files
author
Kateřina Churanová
committed
fix: Push notifications for invite over federation
Signed-off-by: Kateřina Churanová <k.churanova@famedly.com>
1 parent 9d2823a commit eaf3ab1

File tree

8 files changed

+52
-33
lines changed

8 files changed

+52
-33
lines changed

changelog.d/13719.bugfix

+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Send invite push notifications for invite over federation.

synapse/events/__init__.py

+10-3
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@
3737
from typing_extensions import Literal
3838
from unpaddedbase64 import encode_base64
3939

40-
from synapse.api.constants import RelationTypes
40+
from synapse.api.constants import Membership, RelationTypes
4141
from synapse.api.room_versions import EventFormatVersions, RoomVersion, RoomVersions
4242
from synapse.types import JsonDict, RoomStreamToken
4343
from synapse.util.caches import intern_dict
@@ -339,12 +339,19 @@ def event_id(self) -> str:
339339
raise NotImplementedError()
340340

341341
@property
342-
def membership(self) -> str:
343-
return self.content["membership"]
342+
def membership(self) -> Optional[str]:
343+
return self.content.get("membership")
344344

345345
def is_state(self) -> bool:
346346
return self.get_state_key() is not None
347347

348+
@property
349+
def is_notifiable(self) -> bool:
350+
return (
351+
self.membership == Membership.INVITE
352+
or not self.internal_metadata.is_outlier()
353+
)
354+
348355
def get_state_key(self) -> Optional[str]:
349356
"""Get the state key of this event, or None if it's not a state event"""
350357
return self._dict.get("state_key")

synapse/handlers/federation.py

+6
Original file line numberDiff line numberDiff line change
@@ -946,6 +946,12 @@ async def on_invite_request(
946946
)
947947

948948
context = EventContext.for_outlier(self._storage_controllers)
949+
950+
if event.is_notifiable:
951+
await self._federation_event_handler.bulk_push_rule_evaluator.action_for_event_by_user(
952+
event, context
953+
)
954+
949955
await self._federation_event_handler.persist_events_and_notify(
950956
event.room_id, [(event, context)]
951957
)

synapse/handlers/federation_event.py

+8-7
Original file line numberDiff line numberDiff line change
@@ -145,7 +145,7 @@ def __init__(self, hs: "HomeServer"):
145145
self._event_creation_handler = hs.get_event_creation_handler()
146146
self._event_auth_handler = hs.get_event_auth_handler()
147147
self._message_handler = hs.get_message_handler()
148-
self._bulk_push_rule_evaluator = hs.get_bulk_push_rule_evaluator()
148+
self.bulk_push_rule_evaluator = hs.get_bulk_push_rule_evaluator()
149149
self._state_resolution_handler = hs.get_state_resolution_handler()
150150
# avoid a circular dependency by deferring execution here
151151
self._get_room_member_handler = hs.get_room_member_handler
@@ -2110,7 +2110,7 @@ async def _run_push_actions_and_persist_event(
21102110
min_depth,
21112111
)
21122112
else:
2113-
await self._bulk_push_rule_evaluator.action_for_event_by_user(
2113+
await self.bulk_push_rule_evaluator.action_for_event_by_user(
21142114
event, context
21152115
)
21162116

@@ -2153,6 +2153,7 @@ async def persist_events_and_notify(
21532153
if instance != self._instance_name:
21542154
# Limit the number of events sent over replication. We choose 200
21552155
# here as that is what we default to in `max_request_body_size(..)`
2156+
result = {}
21562157
try:
21572158
for batch in batch_iter(event_and_contexts, 200):
21582159
result = await self._send_events(
@@ -2173,28 +2174,28 @@ async def persist_events_and_notify(
21732174
# Note that this returns the events that were persisted, which may not be
21742175
# the same as were passed in if some were deduplicated due to transaction IDs.
21752176
(
2176-
events,
2177+
output_events,
21772178
max_stream_token,
21782179
) = await self._storage_controllers.persistence.persist_events(
21792180
event_and_contexts, backfilled=backfilled
21802181
)
21812182

21822183
if self._ephemeral_messages_enabled:
2183-
for event in events:
2184+
for event in output_events:
21842185
# If there's an expiry timestamp on the event, schedule its expiry.
21852186
self._message_handler.maybe_schedule_expiry(event)
21862187

21872188
if not backfilled: # Never notify for backfilled events
21882189
with start_active_span("notify_persisted_events"):
21892190
set_tag(
21902191
SynapseTags.RESULT_PREFIX + "event_ids",
2191-
str([ev.event_id for ev in events]),
2192+
str([ev.event_id for ev in output_events]),
21922193
)
21932194
set_tag(
21942195
SynapseTags.RESULT_PREFIX + "event_ids.length",
2195-
str(len(events)),
2196+
str(len(output_events)),
21962197
)
2197-
for event in events:
2198+
for event in output_events:
21982199
await self._notify_persisted_event(event, max_stream_token)
21992200

22002201
return max_stream_token.stream

synapse/push/bulk_push_rule_evaluator.py

+7-3
Original file line numberDiff line numberDiff line change
@@ -173,7 +173,11 @@ async def _get_rules_for_event(
173173

174174
async def _get_power_levels_and_sender_level(
175175
self, event: EventBase, context: EventContext
176-
) -> Tuple[dict, int]:
176+
) -> Tuple[dict, Optional[int]]:
177+
# There are no power levels and sender levels possible to get from outlier
178+
if event.internal_metadata.is_outlier():
179+
return {}, None
180+
177181
event_types = auth_types_for_event(event.room_version, event)
178182
prev_state_ids = await context.get_prev_state_ids(
179183
StateFilter.from_types(event_types)
@@ -258,8 +262,8 @@ async def action_for_event_by_user(
258262
should increment the unread count, and insert the results into the
259263
event_push_actions_staging table.
260264
"""
261-
if event.internal_metadata.is_outlier():
262-
# This can happen due to out of band memberships
265+
if not event.is_notifiable:
266+
# Push rules for events that aren't notifiable can't be processed by this
263267
return
264268

265269
count_as_unread = _should_count_as_unread(event, context)

synapse/push/push_rule_evaluator.py

+8-8
Original file line numberDiff line numberDiff line change
@@ -42,18 +42,18 @@
4242
INEQUALITY_EXPR = re.compile("^([=<>]*)([0-9]*)$")
4343

4444

45-
def _room_member_count(
46-
ev: EventBase, condition: Mapping[str, Any], room_member_count: int
47-
) -> bool:
45+
def _room_member_count(condition: Mapping[str, Any], room_member_count: int) -> bool:
4846
return _test_ineq_condition(condition, room_member_count)
4947

5048

5149
def _sender_notification_permission(
52-
ev: EventBase,
5350
condition: Mapping[str, Any],
54-
sender_power_level: int,
51+
sender_power_level: Optional[int],
5552
power_levels: Dict[str, Union[int, Dict[str, int]]],
5653
) -> bool:
54+
if sender_power_level is None:
55+
return False
56+
5757
notif_level_key = condition.get("key")
5858
if notif_level_key is None:
5959
return False
@@ -129,7 +129,7 @@ def __init__(
129129
self,
130130
event: EventBase,
131131
room_member_count: int,
132-
sender_power_level: int,
132+
sender_power_level: Optional[int],
133133
power_levels: Dict[str, Union[int, Dict[str, int]]],
134134
relations: Dict[str, Set[Tuple[str, str]]],
135135
relations_match_enabled: bool,
@@ -198,10 +198,10 @@ def matches(
198198
elif condition["kind"] == "contains_display_name":
199199
return self._contains_display_name(display_name)
200200
elif condition["kind"] == "room_member_count":
201-
return _room_member_count(self._event, condition, self._room_member_count)
201+
return _room_member_count(condition, self._room_member_count)
202202
elif condition["kind"] == "sender_notification_permission":
203203
return _sender_notification_permission(
204-
self._event, condition, self._sender_power_level, self._power_levels
204+
condition, self._sender_power_level, self._power_levels
205205
)
206206
elif (
207207
condition["kind"] == "org.matrix.msc3772.relation_match"

synapse/storage/controllers/persist_events.py

+6-4
Original file line numberDiff line numberDiff line change
@@ -423,16 +423,18 @@ async def enqueue(
423423
for d in ret_vals:
424424
replaced_events.update(d)
425425

426-
events = []
426+
persisted_events = []
427427
for event, _ in events_and_contexts:
428428
existing_event_id = replaced_events.get(event.event_id)
429429
if existing_event_id:
430-
events.append(await self.main_store.get_event(existing_event_id))
430+
persisted_events.append(
431+
await self.main_store.get_event(existing_event_id)
432+
)
431433
else:
432-
events.append(event)
434+
persisted_events.append(event)
433435

434436
return (
435-
events,
437+
persisted_events,
436438
self.main_store.get_room_max_token(),
437439
)
438440

synapse/storage/databases/main/events.py

+6-8
Original file line numberDiff line numberDiff line change
@@ -2180,13 +2180,11 @@ def _set_push_actions_for_event_and_users_txn(
21802180
appear in events_and_context.
21812181
"""
21822182

2183-
# Only non outlier events will have push actions associated with them,
2183+
# Only notifiable events will have push actions associated with them,
21842184
# so let's filter them out. (This makes joining large rooms faster, as
21852185
# these queries took seconds to process all the state events).
2186-
non_outlier_events = [
2187-
event
2188-
for event, _ in events_and_contexts
2189-
if not event.internal_metadata.is_outlier()
2186+
notifiable_events = [
2187+
event for event, _ in events_and_contexts if event.is_notifiable
21902188
]
21912189

21922190
sql = """
@@ -2199,7 +2197,7 @@ def _set_push_actions_for_event_and_users_txn(
21992197
WHERE event_id = ?
22002198
"""
22012199

2202-
if non_outlier_events:
2200+
if notifiable_events:
22032201
txn.execute_batch(
22042202
sql,
22052203
(
@@ -2209,12 +2207,12 @@ def _set_push_actions_for_event_and_users_txn(
22092207
event.depth,
22102208
event.event_id,
22112209
)
2212-
for event in non_outlier_events
2210+
for event in notifiable_events
22132211
),
22142212
)
22152213

22162214
room_to_event_ids: Dict[str, List[str]] = {}
2217-
for e in non_outlier_events:
2215+
for e in notifiable_events:
22182216
room_to_event_ids.setdefault(e.room_id, []).append(e.event_id)
22192217

22202218
for room_id, event_ids in room_to_event_ids.items():

0 commit comments

Comments
 (0)