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.
This commit is contained in:
Michael Hollister 2024-07-23 04:59:24 -05:00 committed by GitHub
parent 13a99fba1b
commit a9ee832e48
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
4 changed files with 16 additions and 1 deletions

1
changelog.d/17231.bugfix Normal file
View File

@ -0,0 +1 @@
Added configurable option to always include offline users in presence sync results. Contributed by @Michael-Hollister.

View File

@ -246,6 +246,7 @@ Example configuration:
```yaml ```yaml
presence: presence:
enabled: false enabled: false
include_offline_users_on_sync: false
``` ```
`enabled` can also be set to a special value of "untracked" which ignores updates `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.* *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` ### `require_auth_for_profile_requests`

View File

@ -384,6 +384,11 @@ class ServerConfig(Config):
# Whether to internally track presence, requires that presence is enabled, # Whether to internally track presence, requires that presence is enabled,
self.track_presence = self.presence_enabled and presence_enabled != "untracked" 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 # Custom presence router module
# This is the legacy way of configuring it (the config should now be put in the modules section) # This is the legacy way of configuring it (the config should now be put in the modules section)
self.presence_router_module_class = None self.presence_router_module_class = None

View File

@ -2270,7 +2270,11 @@ class SyncHandler:
user=user, user=user,
from_key=presence_key, from_key=presence_key,
is_guest=sync_config.is_guest, 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 assert presence_key
sync_result_builder.now_token = now_token.copy_and_replace( sync_result_builder.now_token = now_token.copy_and_replace(