summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--changelog.d/9850.feature1
-rw-r--r--synapse/federation/sender/__init__.py4
-rw-r--r--synapse/handlers/presence.py11
3 files changed, 13 insertions, 3 deletions
diff --git a/changelog.d/9850.feature b/changelog.d/9850.feature
new file mode 100644
index 0000000000..f56b0bb3bd
--- /dev/null
+++ b/changelog.d/9850.feature
@@ -0,0 +1 @@
+Add experimental support for handling presence on a worker.
diff --git a/synapse/federation/sender/__init__.py b/synapse/federation/sender/__init__.py
index 6266accaf5..b00a55324c 100644
--- a/synapse/federation/sender/__init__.py
+++ b/synapse/federation/sender/__init__.py
@@ -539,6 +539,10 @@ class FederationSender(AbstractFederationSender):
             # No-op if presence is disabled.
             return
 
+        # Ensure we only send out presence states for local users.
+        for state in states:
+            assert self.is_mine_id(state.user_id)
+
         for destination in destinations:
             if destination == self.server_name:
                 continue
diff --git a/synapse/handlers/presence.py b/synapse/handlers/presence.py
index 6460eb9952..bd2382193f 100644
--- a/synapse/handlers/presence.py
+++ b/synapse/handlers/presence.py
@@ -125,6 +125,7 @@ class BasePresenceHandler(abc.ABC):
         self.store = hs.get_datastore()
         self.presence_router = hs.get_presence_router()
         self.state = hs.get_state_handler()
+        self.is_mine_id = hs.is_mine_id
 
         self._federation = None
         if hs.should_send_federation() or not hs.config.worker_app:
@@ -261,7 +262,8 @@ class BasePresenceHandler(abc.ABC):
         self, states: List[UserPresenceState]
     ):
         """If this instance is a federation sender, send the states to all
-        destinations that are interested.
+        destinations that are interested. Filters out any states for remote
+        users.
         """
 
         if not self._send_federation:
@@ -270,6 +272,11 @@ class BasePresenceHandler(abc.ABC):
         # If this worker sends federation we must have a FederationSender.
         assert self._federation
 
+        states = [s for s in states if self.is_mine_id(s.user_id)]
+
+        if not states:
+            return
+
         hosts_and_states = await get_interested_remotes(
             self.store,
             self.presence_router,
@@ -292,7 +299,6 @@ class WorkerPresenceHandler(BasePresenceHandler):
     def __init__(self, hs):
         super().__init__(hs)
         self.hs = hs
-        self.is_mine_id = hs.is_mine_id
 
         self._presence_enabled = hs.config.use_presence
 
@@ -492,7 +498,6 @@ class PresenceHandler(BasePresenceHandler):
     def __init__(self, hs: "HomeServer"):
         super().__init__(hs)
         self.hs = hs
-        self.is_mine_id = hs.is_mine_id
         self.server_name = hs.hostname
         self.wheel_timer = WheelTimer()
         self.notifier = hs.get_notifier()