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

Commit a69a199

Browse files
committed
Implement MSC4069: Inhibit profile propagation
MSC: matrix-org/matrix-spec-proposals#4069
1 parent 4dd18bd commit a69a199

File tree

4 files changed

+40
-4
lines changed

4 files changed

+40
-4
lines changed

synapse/config/experimental.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -419,3 +419,7 @@ def read_config(self, config: JsonDict, **kwargs: Any) -> None:
419419
self.msc4028_push_encrypted_events = experimental.get(
420420
"msc4028_push_encrypted_events", False
421421
)
422+
423+
self.msc4069_profile_inhibit_propagation = experimental.get(
424+
"msc4069_profile_inhibit_propagation", False
425+
)

synapse/handlers/profile.py

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -129,6 +129,7 @@ async def set_displayname(
129129
new_displayname: str,
130130
by_admin: bool = False,
131131
deactivation: bool = False,
132+
propagate: bool = True,
132133
) -> None:
133134
"""Set the displayname of a user
134135
@@ -138,6 +139,7 @@ async def set_displayname(
138139
new_displayname: The displayname to give this user.
139140
by_admin: Whether this change was made by an administrator.
140141
deactivation: Whether this change was made while deactivating the user.
142+
propagate: Whether this change also applies to the user's membership events.
141143
"""
142144
if not self.hs.is_mine(target_user):
143145
raise SynapseError(400, "User is not hosted on this homeserver")
@@ -188,7 +190,8 @@ async def set_displayname(
188190
target_user.to_string(), profile, by_admin, deactivation
189191
)
190192

191-
await self._update_join_states(requester, target_user)
193+
if propagate:
194+
await self._update_join_states(requester, target_user)
192195

193196
async def get_avatar_url(self, target_user: UserID) -> Optional[str]:
194197
if self.hs.is_mine(target_user):
@@ -221,6 +224,7 @@ async def set_avatar_url(
221224
new_avatar_url: str,
222225
by_admin: bool = False,
223226
deactivation: bool = False,
227+
propagate: bool = True,
224228
) -> None:
225229
"""Set a new avatar URL for a user.
226230
@@ -230,6 +234,7 @@ async def set_avatar_url(
230234
new_avatar_url: The avatar URL to give this user.
231235
by_admin: Whether this change was made by an administrator.
232236
deactivation: Whether this change was made while deactivating the user.
237+
propagate: Whether this change also applies to the user's membership events.
233238
"""
234239
if not self.hs.is_mine(target_user):
235240
raise SynapseError(400, "User is not hosted on this homeserver")
@@ -278,7 +283,8 @@ async def set_avatar_url(
278283
target_user.to_string(), profile, by_admin, deactivation
279284
)
280285

281-
await self._update_join_states(requester, target_user)
286+
if propagate:
287+
await self._update_join_states(requester, target_user)
282288

283289
@cached()
284290
async def check_avatar_size_and_mime_type(self, mxc: str) -> bool:

synapse/rest/client/profile.py

Lines changed: 26 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
# limitations under the License.
1414

1515
""" This module contains REST servlets to do with profile: /profile/<paths> """
16+
1617
from http import HTTPStatus
1718
from typing import TYPE_CHECKING, Tuple
1819

@@ -27,6 +28,23 @@
2728
from synapse.server import HomeServer
2829

2930

31+
def _read_propagate(hs: "HomeServer", request: SynapseRequest)->bool:
32+
propagate = True
33+
if hs.config.experimental.msc4069_profile_inhibit_propagation:
34+
do_propagate = request.args.get(b"org.matrix.msc4069.propagate")
35+
if do_propagate is not None:
36+
do_propagate = do_propagate[0].lower()
37+
if do_propagate not in [b'true', b'false']:
38+
raise SynapseError(
39+
400,
40+
"'propagate' is malformed",
41+
errcode=Codes.INVALID_PARAM
42+
)
43+
else:
44+
propagate = do_propagate == b'true'
45+
return propagate
46+
47+
3048
class ProfileDisplaynameRestServlet(RestServlet):
3149
PATTERNS = client_patterns("/profile/(?P<user_id>[^/]*)/displayname", v1=True)
3250
CATEGORY = "Event sending requests"
@@ -80,7 +98,11 @@ async def on_PUT(
8098
errcode=Codes.BAD_JSON,
8199
)
82100

83-
await self.profile_handler.set_displayname(user, requester, new_name, is_admin)
101+
propagate = _read_propagate(self.hs, request)
102+
103+
await self.profile_handler.set_displayname(
104+
user, requester, new_name, is_admin, propagate=propagate
105+
)
84106

85107
return 200, {}
86108

@@ -135,8 +157,10 @@ async def on_PUT(
135157
400, "Missing key 'avatar_url'", errcode=Codes.MISSING_PARAM
136158
)
137159

160+
propagate = _read_propagate(self.hs, request)
161+
138162
await self.profile_handler.set_avatar_url(
139-
user, requester, new_avatar_url, is_admin
163+
user, requester, new_avatar_url, is_admin, propagate=propagate
140164
)
141165

142166
return 200, {}

synapse/rest/client/versions.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -126,6 +126,8 @@ def on_GET(self, request: Request) -> Tuple[int, JsonDict]:
126126
"org.matrix.msc3981": self.config.experimental.msc3981_recurse_relations,
127127
# Adds support for deleting account data.
128128
"org.matrix.msc3391": self.config.experimental.msc3391_enabled,
129+
# Allows clients to inhibit profile update propagation.
130+
"org.matrix.msc4069": self.config.experimental.msc4069_profile_inhibit_propagation,
129131
},
130132
},
131133
)

0 commit comments

Comments
 (0)