Merge pull request #5196 from matrix-org/babolivier/per_room_profiles
Add an option to disable per-room profilespull/5210/head
						commit
						fdeac1e984
					
				| 
						 | 
					@ -0,0 +1 @@
 | 
				
			||||||
 | 
					Add an option to disable per-room profiles.
 | 
				
			||||||
| 
						 | 
					@ -276,6 +276,12 @@ listeners:
 | 
				
			||||||
#
 | 
					#
 | 
				
			||||||
#require_membership_for_aliases: false
 | 
					#require_membership_for_aliases: false
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Whether to allow per-room membership profiles through the send of membership
 | 
				
			||||||
 | 
					# events with profile information that differ from the target's global profile.
 | 
				
			||||||
 | 
					# Defaults to 'true'.
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					#allow_per_room_profiles: false
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
## TLS ##
 | 
					## TLS ##
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,6 +1,7 @@
 | 
				
			||||||
# -*- coding: utf-8 -*-
 | 
					# -*- coding: utf-8 -*-
 | 
				
			||||||
# Copyright 2014-2016 OpenMarket Ltd
 | 
					# Copyright 2014-2016 OpenMarket Ltd
 | 
				
			||||||
# Copyright 2017-2018 New Vector Ltd
 | 
					# Copyright 2017-2018 New Vector Ltd
 | 
				
			||||||
 | 
					# Copyright 2019 The Matrix.org Foundation C.I.C.
 | 
				
			||||||
#
 | 
					#
 | 
				
			||||||
# Licensed under the Apache License, Version 2.0 (the "License");
 | 
					# Licensed under the Apache License, Version 2.0 (the "License");
 | 
				
			||||||
# you may not use this file except in compliance with the License.
 | 
					# you may not use this file except in compliance with the License.
 | 
				
			||||||
| 
						 | 
					@ -173,6 +174,10 @@ class ServerConfig(Config):
 | 
				
			||||||
            "require_membership_for_aliases", True,
 | 
					            "require_membership_for_aliases", True,
 | 
				
			||||||
        )
 | 
					        )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        # Whether to allow per-room membership profiles through the send of membership
 | 
				
			||||||
 | 
					        # events with profile information that differ from the target's global profile.
 | 
				
			||||||
 | 
					        self.allow_per_room_profiles = config.get("allow_per_room_profiles", True)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        self.listeners = []
 | 
					        self.listeners = []
 | 
				
			||||||
        for listener in config.get("listeners", []):
 | 
					        for listener in config.get("listeners", []):
 | 
				
			||||||
            if not isinstance(listener.get("port", None), int):
 | 
					            if not isinstance(listener.get("port", None), int):
 | 
				
			||||||
| 
						 | 
					@ -566,6 +571,12 @@ class ServerConfig(Config):
 | 
				
			||||||
        # Defaults to 'true'.
 | 
					        # Defaults to 'true'.
 | 
				
			||||||
        #
 | 
					        #
 | 
				
			||||||
        #require_membership_for_aliases: false
 | 
					        #require_membership_for_aliases: false
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        # Whether to allow per-room membership profiles through the send of membership
 | 
				
			||||||
 | 
					        # events with profile information that differ from the target's global profile.
 | 
				
			||||||
 | 
					        # Defaults to 'true'.
 | 
				
			||||||
 | 
					        #
 | 
				
			||||||
 | 
					        #allow_per_room_profiles: false
 | 
				
			||||||
        """ % locals()
 | 
					        """ % locals()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def read_arguments(self, args):
 | 
					    def read_arguments(self, args):
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,6 +1,7 @@
 | 
				
			||||||
# -*- coding: utf-8 -*-
 | 
					# -*- coding: utf-8 -*-
 | 
				
			||||||
# Copyright 2016 OpenMarket Ltd
 | 
					# Copyright 2016 OpenMarket Ltd
 | 
				
			||||||
# Copyright 2018 New Vector Ltd
 | 
					# Copyright 2018 New Vector Ltd
 | 
				
			||||||
 | 
					# Copyright 2019 The Matrix.org Foundation C.I.C.
 | 
				
			||||||
#
 | 
					#
 | 
				
			||||||
# Licensed under the Apache License, Version 2.0 (the "License");
 | 
					# Licensed under the Apache License, Version 2.0 (the "License");
 | 
				
			||||||
# you may not use this file except in compliance with the License.
 | 
					# you may not use this file except in compliance with the License.
 | 
				
			||||||
| 
						 | 
					@ -73,6 +74,7 @@ class RoomMemberHandler(object):
 | 
				
			||||||
        self.spam_checker = hs.get_spam_checker()
 | 
					        self.spam_checker = hs.get_spam_checker()
 | 
				
			||||||
        self._server_notices_mxid = self.config.server_notices_mxid
 | 
					        self._server_notices_mxid = self.config.server_notices_mxid
 | 
				
			||||||
        self._enable_lookup = hs.config.enable_3pid_lookup
 | 
					        self._enable_lookup = hs.config.enable_3pid_lookup
 | 
				
			||||||
 | 
					        self.allow_per_room_profiles = self.config.allow_per_room_profiles
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        # This is only used to get at ratelimit function, and
 | 
					        # This is only used to get at ratelimit function, and
 | 
				
			||||||
        # maybe_kick_guest_users. It's fine there are multiple of these as
 | 
					        # maybe_kick_guest_users. It's fine there are multiple of these as
 | 
				
			||||||
| 
						 | 
					@ -357,6 +359,13 @@ class RoomMemberHandler(object):
 | 
				
			||||||
            # later on.
 | 
					            # later on.
 | 
				
			||||||
            content = dict(content)
 | 
					            content = dict(content)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if not self.allow_per_room_profiles:
 | 
				
			||||||
 | 
					            # Strip profile data, knowing that new profile data will be added to the
 | 
				
			||||||
 | 
					            # event's content in event_creation_handler.create_event() using the target's
 | 
				
			||||||
 | 
					            # global profile.
 | 
				
			||||||
 | 
					            content.pop("displayname", None)
 | 
				
			||||||
 | 
					            content.pop("avatar_url", None)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        effective_membership_state = action
 | 
					        effective_membership_state = action
 | 
				
			||||||
        if action in ["kick", "unban"]:
 | 
					        if action in ["kick", "unban"]:
 | 
				
			||||||
            effective_membership_state = "leave"
 | 
					            effective_membership_state = "leave"
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,5 +1,6 @@
 | 
				
			||||||
# -*- coding: utf-8 -*-
 | 
					# -*- coding: utf-8 -*-
 | 
				
			||||||
# Copyright 2014-2016 OpenMarket Ltd
 | 
					# Copyright 2014-2016 OpenMarket Ltd
 | 
				
			||||||
 | 
					# Copyright 2019 The Matrix.org Foundation C.I.C.
 | 
				
			||||||
#
 | 
					#
 | 
				
			||||||
# Licensed under the Apache License, Version 2.0 (the "License");
 | 
					# Licensed under the Apache License, Version 2.0 (the "License");
 | 
				
			||||||
# you may not use this file except in compliance with the License.
 | 
					# you may not use this file except in compliance with the License.
 | 
				
			||||||
| 
						 | 
					@ -24,7 +25,7 @@ from twisted.internet import defer
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import synapse.rest.admin
 | 
					import synapse.rest.admin
 | 
				
			||||||
from synapse.api.constants import Membership
 | 
					from synapse.api.constants import Membership
 | 
				
			||||||
from synapse.rest.client.v1 import login, room
 | 
					from synapse.rest.client.v1 import login, profile, room
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from tests import unittest
 | 
					from tests import unittest
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -936,3 +937,70 @@ class PublicRoomsRestrictedTestCase(unittest.HomeserverTestCase):
 | 
				
			||||||
        request, channel = self.make_request("GET", self.url, access_token=tok)
 | 
					        request, channel = self.make_request("GET", self.url, access_token=tok)
 | 
				
			||||||
        self.render(request)
 | 
					        self.render(request)
 | 
				
			||||||
        self.assertEqual(channel.code, 200, channel.result)
 | 
					        self.assertEqual(channel.code, 200, channel.result)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class PerRoomProfilesForbiddenTestCase(unittest.HomeserverTestCase):
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    servlets = [
 | 
				
			||||||
 | 
					        synapse.rest.admin.register_servlets_for_client_rest_resource,
 | 
				
			||||||
 | 
					        room.register_servlets,
 | 
				
			||||||
 | 
					        login.register_servlets,
 | 
				
			||||||
 | 
					        profile.register_servlets,
 | 
				
			||||||
 | 
					    ]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def make_homeserver(self, reactor, clock):
 | 
				
			||||||
 | 
					        config = self.default_config()
 | 
				
			||||||
 | 
					        config["allow_per_room_profiles"] = False
 | 
				
			||||||
 | 
					        self.hs = self.setup_test_homeserver(config=config)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        return self.hs
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def prepare(self, reactor, clock, homeserver):
 | 
				
			||||||
 | 
					        self.user_id = self.register_user("test", "test")
 | 
				
			||||||
 | 
					        self.tok = self.login("test", "test")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        # Set a profile for the test user
 | 
				
			||||||
 | 
					        self.displayname = "test user"
 | 
				
			||||||
 | 
					        data = {
 | 
				
			||||||
 | 
					            "displayname": self.displayname,
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        request_data = json.dumps(data)
 | 
				
			||||||
 | 
					        request, channel = self.make_request(
 | 
				
			||||||
 | 
					            "PUT",
 | 
				
			||||||
 | 
					            "/_matrix/client/r0/profile/%s/displayname" % (self.user_id,),
 | 
				
			||||||
 | 
					            request_data,
 | 
				
			||||||
 | 
					            access_token=self.tok,
 | 
				
			||||||
 | 
					        )
 | 
				
			||||||
 | 
					        self.render(request)
 | 
				
			||||||
 | 
					        self.assertEqual(channel.code, 200, channel.result)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        self.room_id = self.helper.create_room_as(self.user_id, tok=self.tok)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def test_per_room_profile_forbidden(self):
 | 
				
			||||||
 | 
					        data = {
 | 
				
			||||||
 | 
					            "membership": "join",
 | 
				
			||||||
 | 
					            "displayname": "other test user"
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        request_data = json.dumps(data)
 | 
				
			||||||
 | 
					        request, channel = self.make_request(
 | 
				
			||||||
 | 
					            "PUT",
 | 
				
			||||||
 | 
					            "/_matrix/client/r0/rooms/%s/state/m.room.member/%s" % (
 | 
				
			||||||
 | 
					                self.room_id, self.user_id,
 | 
				
			||||||
 | 
					            ),
 | 
				
			||||||
 | 
					            request_data,
 | 
				
			||||||
 | 
					            access_token=self.tok,
 | 
				
			||||||
 | 
					        )
 | 
				
			||||||
 | 
					        self.render(request)
 | 
				
			||||||
 | 
					        self.assertEqual(channel.code, 200, channel.result)
 | 
				
			||||||
 | 
					        event_id = channel.json_body["event_id"]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        request, channel = self.make_request(
 | 
				
			||||||
 | 
					            "GET",
 | 
				
			||||||
 | 
					            "/_matrix/client/r0/rooms/%s/event/%s" % (self.room_id, event_id),
 | 
				
			||||||
 | 
					            access_token=self.tok,
 | 
				
			||||||
 | 
					        )
 | 
				
			||||||
 | 
					        self.render(request)
 | 
				
			||||||
 | 
					        self.assertEqual(channel.code, 200, channel.result)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        res_displayname = channel.json_body["content"]["displayname"]
 | 
				
			||||||
 | 
					        self.assertEqual(res_displayname, self.displayname, channel.result)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue