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

Commit 9bc7474

Browse files
authored
Add configs to make profile data more private (#9203)
Add off-by-default configuration settings to: - disable putting an invitee's profile info in invite events - disable profile lookup via federation Signed-off-by: Andrew Ferrazzutti <[email protected]>
1 parent 84a7191 commit 9bc7474

File tree

9 files changed

+66
-7
lines changed

9 files changed

+66
-7
lines changed

changelog.d/9203.feature

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Add some configuration settings to make users' profile data more private.

docs/sample_config.yaml

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,14 @@ pid_file: DATADIR/homeserver.pid
101101
#
102102
#limit_profile_requests_to_users_who_share_rooms: true
103103

104+
# Uncomment to prevent a user's profile data from being retrieved and
105+
# displayed in a room until they have joined it. By default, a user's
106+
# profile data is included in an invite event, regardless of the values
107+
# of the above two settings, and whether or not the users share a server.
108+
# Defaults to 'true'.
109+
#
110+
#include_profile_data_on_invite: false
111+
104112
# If set to 'true', removes the need for authentication to access the server's
105113
# public rooms directory through the client API, meaning that anyone can
106114
# query the room directory. Defaults to 'false'.
@@ -699,6 +707,12 @@ acme:
699707
# - matrix.org
700708
# - example.com
701709

710+
# Uncomment to disable profile lookup over federation. By default, the
711+
# Federation API allows other homeservers to obtain profile data of any user
712+
# on this homeserver. Defaults to 'true'.
713+
#
714+
#allow_profile_lookup_over_federation: false
715+
702716

703717
## Caching ##
704718

synapse/config/federation.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,10 @@ def read_config(self, config, **kwargs):
4141
)
4242
self.federation_metrics_domains = set(federation_metrics_domains)
4343

44+
self.allow_profile_lookup_over_federation = config.get(
45+
"allow_profile_lookup_over_federation", True
46+
)
47+
4448
def generate_config_section(self, config_dir_path, server_name, **kwargs):
4549
return """\
4650
## Federation ##
@@ -66,6 +70,12 @@ def generate_config_section(self, config_dir_path, server_name, **kwargs):
6670
#federation_metrics_domains:
6771
# - matrix.org
6872
# - example.com
73+
74+
# Uncomment to disable profile lookup over federation. By default, the
75+
# Federation API allows other homeservers to obtain profile data of any user
76+
# on this homeserver. Defaults to 'true'.
77+
#
78+
#allow_profile_lookup_over_federation: false
6979
"""
7080

7181

synapse/config/server.py

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -263,6 +263,12 @@ def read_config(self, config, **kwargs):
263263
False,
264264
)
265265

266+
# Whether to retrieve and display profile data for a user when they
267+
# are invited to a room
268+
self.include_profile_data_on_invite = config.get(
269+
"include_profile_data_on_invite", True
270+
)
271+
266272
if "restrict_public_rooms_to_local_users" in config and (
267273
"allow_public_rooms_without_auth" in config
268274
or "allow_public_rooms_over_federation" in config
@@ -848,6 +854,14 @@ def generate_config_section(
848854
#
849855
#limit_profile_requests_to_users_who_share_rooms: true
850856
857+
# Uncomment to prevent a user's profile data from being retrieved and
858+
# displayed in a room until they have joined it. By default, a user's
859+
# profile data is included in an invite event, regardless of the values
860+
# of the above two settings, and whether or not the users share a server.
861+
# Defaults to 'true'.
862+
#
863+
#include_profile_data_on_invite: false
864+
851865
# If set to 'true', removes the need for authentication to access the server's
852866
# public rooms directory through the client API, meaning that anyone can
853867
# query the room directory. Defaults to 'false'.

synapse/federation/transport/server.py

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -484,10 +484,9 @@ class FederationQueryServlet(BaseFederationServlet):
484484

485485
# This is when we receive a server-server Query
486486
async def on_GET(self, origin, content, query, query_type):
487-
return await self.handler.on_query_request(
488-
query_type,
489-
{k.decode("utf8"): v[0].decode("utf-8") for k, v in query.items()},
490-
)
487+
args = {k.decode("utf8"): v[0].decode("utf-8") for k, v in query.items()}
488+
args["origin"] = origin
489+
return await self.handler.on_query_request(query_type, args)
491490

492491

493492
class FederationMakeJoinServlet(BaseFederationServlet):

synapse/handlers/message.py

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -387,6 +387,12 @@ def __init__(self, hs: "HomeServer"):
387387

388388
self.room_invite_state_types = self.hs.config.room_invite_state_types
389389

390+
self.membership_types_to_include_profile_data_in = (
391+
{Membership.JOIN, Membership.INVITE}
392+
if self.hs.config.include_profile_data_on_invite
393+
else {Membership.JOIN}
394+
)
395+
390396
self.send_event = ReplicationSendEventRestServlet.make_client(hs)
391397

392398
# This is only used to get at ratelimit function, and maybe_kick_guest_users
@@ -500,7 +506,7 @@ async def create_event(
500506
membership = builder.content.get("membership", None)
501507
target = UserID.from_string(builder.state_key)
502508

503-
if membership in {Membership.JOIN, Membership.INVITE}:
509+
if membership in self.membership_types_to_include_profile_data_in:
504510
# If event doesn't include a display name, add one.
505511
profile = self.profile_handler
506512
content = builder.content

synapse/handlers/profile.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -310,6 +310,16 @@ async def set_avatar_url(
310310
await self._update_join_states(requester, target_user)
311311

312312
async def on_profile_query(self, args: JsonDict) -> JsonDict:
313+
"""Handles federation profile query requests.
314+
"""
315+
316+
if not self.hs.config.allow_profile_lookup_over_federation:
317+
raise SynapseError(
318+
403,
319+
"Profile lookup over federation is disabled on this homeserver",
320+
Codes.FORBIDDEN,
321+
)
322+
313323
user = UserID.from_string(args["user_id"])
314324
if not self.hs.is_mine(user):
315325
raise SynapseError(400, "User is not hosted on this homeserver")

synapse/replication/http/federation.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -213,8 +213,9 @@ async def _handle_request(self, request, query_type):
213213
content = parse_json_object_from_request(request)
214214

215215
args = content["args"]
216+
args["origin"] = content["origin"]
216217

217-
logger.info("Got %r query", query_type)
218+
logger.info("Got %r query from %s", query_type, args["origin"])
218219

219220
result = await self.registry.on_query(query_type, args)
220221

tests/handlers/test_profile.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -161,7 +161,11 @@ def test_incoming_fed_query(self):
161161

162162
response = self.get_success(
163163
self.query_handlers["profile"](
164-
{"user_id": "@caroline:test", "field": "displayname"}
164+
{
165+
"user_id": "@caroline:test",
166+
"field": "displayname",
167+
"origin": "servername.tld",
168+
}
165169
)
166170
)
167171

0 commit comments

Comments
 (0)