summary refs log tree commit diff
diff options
context:
space:
mode:
authorMichael Hollister <michael.s.hollister@protonmail.com>2024-07-23 04:59:24 -0500
committerGitHub <noreply@github.com>2024-07-23 09:59:24 +0000
commita9ee832e4899fefcfd27fba475091e1ffaa069b8 (patch)
tree5e5922d2aaf6c388150a978905bc001653b954ab
parentBump hiredis from 2.3.2 to 3.0.0 (#17464) (diff)
downloadsynapse-a9ee832e4899fefcfd27fba475091e1ffaa069b8.tar.xz
Fixed presence results not returning offline users on initial sync (#17231)
This is to address an issue in which `m.presence` results on initial
sync are not returning entries of users who are currently offline.

The original behaviour was from
https://github.com/element-hq/synapse/issues/1535

This change is useful for applications that use the
presence system for tracking user profile information/updates (e.g.
https://github.com/element-hq/synapse/pull/16992 or for profile status
messages).

This is gated behind a new configuration option to avoid performance
impact for applications that don't need this, as a pragmatic solution
for now.
-rw-r--r--changelog.d/17231.bugfix1
-rw-r--r--docs/usage/configuration/config_documentation.md5
-rw-r--r--synapse/config/server.py5
-rw-r--r--synapse/handlers/sync.py6
4 files changed, 16 insertions, 1 deletions
diff --git a/changelog.d/17231.bugfix b/changelog.d/17231.bugfix
new file mode 100644
index 0000000000..d09b455654
--- /dev/null
+++ b/changelog.d/17231.bugfix
@@ -0,0 +1 @@
+Added configurable option to always include offline users in presence sync results. Contributed by @Michael-Hollister.
diff --git a/docs/usage/configuration/config_documentation.md b/docs/usage/configuration/config_documentation.md
index e8bc2df798..649f4f71c7 100644
--- a/docs/usage/configuration/config_documentation.md
+++ b/docs/usage/configuration/config_documentation.md
@@ -246,6 +246,7 @@ Example configuration:
 ```yaml
 presence:
   enabled: false
+  include_offline_users_on_sync: false
 ```
 
 `enabled` can also be set to a special value of "untracked" which ignores updates
@@ -254,6 +255,10 @@ received via clients and federation, while still accepting updates from the
 
 *The "untracked" option was added in Synapse 1.96.0.*
 
+When clients perform an initial or `full_state` sync, presence results for offline users are
+not included by default. Setting `include_offline_users_on_sync` to `true` will always include
+offline users in the results. Defaults to false.
+
 ---
 ### `require_auth_for_profile_requests`
 
diff --git a/synapse/config/server.py b/synapse/config/server.py
index 8bb97df175..fd52c0475c 100644
--- a/synapse/config/server.py
+++ b/synapse/config/server.py
@@ -384,6 +384,11 @@ class ServerConfig(Config):
         # Whether to internally track presence, requires that presence is enabled,
         self.track_presence = self.presence_enabled and presence_enabled != "untracked"
 
+        # Determines if presence results for offline users are included on initial/full sync
+        self.presence_include_offline_users_on_sync = presence_config.get(
+            "include_offline_users_on_sync", False
+        )
+
         # Custom presence router module
         # This is the legacy way of configuring it (the config should now be put in the modules section)
         self.presence_router_module_class = None
diff --git a/synapse/handlers/sync.py b/synapse/handlers/sync.py
index de227faec3..ede014180c 100644
--- a/synapse/handlers/sync.py
+++ b/synapse/handlers/sync.py
@@ -2270,7 +2270,11 @@ class SyncHandler:
             user=user,
             from_key=presence_key,
             is_guest=sync_config.is_guest,
-            include_offline=include_offline,
+            include_offline=(
+                True
+                if self.hs_config.server.presence_include_offline_users_on_sync
+                else include_offline
+            ),
         )
         assert presence_key
         sync_result_builder.now_token = now_token.copy_and_replace(