Skip to content

Commit ddcbe88

Browse files
clokepphil-flex
authored andcommitted
Allow admins to create aliases when they are not in the room (matrix-org#7191)
1 parent 654a716 commit ddcbe88

File tree

3 files changed

+68
-1
lines changed

3 files changed

+68
-1
lines changed

changelog.d/7191.feature

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Admin users are no longer required to be in a room to create an alias for it.

synapse/handlers/directory.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -127,7 +127,11 @@ def create_association(
127127
errcode=Codes.EXCLUSIVE,
128128
)
129129
else:
130-
if self.require_membership and check_membership:
130+
# Server admins are not subject to the same constraints as normal
131+
# users when creating an alias (e.g. being in the room).
132+
is_admin = yield self.auth.is_server_admin(requester.user)
133+
134+
if (self.require_membership and check_membership) and not is_admin:
131135
rooms_for_user = yield self.store.get_rooms_for_user(user_id)
132136
if room_id not in rooms_for_user:
133137
raise AuthError(

tests/handlers/test_directory.py

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,68 @@ def test_incoming_fed_query(self):
102102
self.assertEquals({"room_id": "!8765asdf:test", "servers": ["test"]}, response)
103103

104104

105+
class TestCreateAlias(unittest.HomeserverTestCase):
106+
servlets = [
107+
synapse.rest.admin.register_servlets,
108+
login.register_servlets,
109+
room.register_servlets,
110+
directory.register_servlets,
111+
]
112+
113+
def prepare(self, reactor, clock, hs):
114+
self.handler = hs.get_handlers().directory_handler
115+
116+
# Create user
117+
self.admin_user = self.register_user("admin", "pass", admin=True)
118+
self.admin_user_tok = self.login("admin", "pass")
119+
120+
# Create a test room
121+
self.room_id = self.helper.create_room_as(
122+
self.admin_user, tok=self.admin_user_tok
123+
)
124+
125+
self.test_alias = "#test:test"
126+
self.room_alias = RoomAlias.from_string(self.test_alias)
127+
128+
# Create a test user.
129+
self.test_user = self.register_user("user", "pass", admin=False)
130+
self.test_user_tok = self.login("user", "pass")
131+
self.helper.join(room=self.room_id, user=self.test_user, tok=self.test_user_tok)
132+
133+
def test_create_alias_joined_room(self):
134+
"""A user can create an alias for a room they're in."""
135+
self.get_success(
136+
self.handler.create_association(
137+
create_requester(self.test_user), self.room_alias, self.room_id,
138+
)
139+
)
140+
141+
def test_create_alias_other_room(self):
142+
"""A user cannot create an alias for a room they're NOT in."""
143+
other_room_id = self.helper.create_room_as(
144+
self.admin_user, tok=self.admin_user_tok
145+
)
146+
147+
self.get_failure(
148+
self.handler.create_association(
149+
create_requester(self.test_user), self.room_alias, other_room_id,
150+
),
151+
synapse.api.errors.SynapseError,
152+
)
153+
154+
def test_create_alias_admin(self):
155+
"""An admin can create an alias for a room they're NOT in."""
156+
other_room_id = self.helper.create_room_as(
157+
self.test_user, tok=self.test_user_tok
158+
)
159+
160+
self.get_success(
161+
self.handler.create_association(
162+
create_requester(self.admin_user), self.room_alias, other_room_id,
163+
)
164+
)
165+
166+
105167
class TestDeleteAlias(unittest.HomeserverTestCase):
106168
servlets = [
107169
synapse.rest.admin.register_servlets,

0 commit comments

Comments
 (0)