Change to create new room and join other users

This commit is contained in:
Erik Johnston 2017-06-19 14:10:13 +01:00
parent 5db7070dd1
commit b490299a3b
2 changed files with 70 additions and 10 deletions

View File

@ -61,7 +61,7 @@ class RoomCreationHandler(BaseHandler):
} }
@defer.inlineCallbacks @defer.inlineCallbacks
def create_room(self, requester, config): def create_room(self, requester, config, ratelimit=True):
""" Creates a new room. """ Creates a new room.
Args: Args:
@ -75,6 +75,7 @@ class RoomCreationHandler(BaseHandler):
""" """
user_id = requester.user.to_string() user_id = requester.user.to_string()
if ratelimit:
yield self.ratelimit(requester) yield self.ratelimit(requester)
if "room_alias_name" in config: if "room_alias_name" in config:
@ -167,6 +168,7 @@ class RoomCreationHandler(BaseHandler):
initial_state=initial_state, initial_state=initial_state,
creation_content=creation_content, creation_content=creation_content,
room_alias=room_alias, room_alias=room_alias,
power_level_content_override=config.get("power_level_content_override", {})
) )
if "name" in config: if "name" in config:
@ -245,7 +247,8 @@ class RoomCreationHandler(BaseHandler):
invite_list, invite_list,
initial_state, initial_state,
creation_content, creation_content,
room_alias room_alias,
power_level_content_override,
): ):
def create(etype, content, **kwargs): def create(etype, content, **kwargs):
e = { e = {
@ -291,7 +294,15 @@ class RoomCreationHandler(BaseHandler):
ratelimit=False, ratelimit=False,
) )
if (EventTypes.PowerLevels, '') not in initial_state: # We treat the power levels override specially as this needs to be one
# of the first events that get sent into a room.
pl_content = initial_state.pop((EventTypes.PowerLevels, ''), None)
if pl_content is not None:
yield send(
etype=EventTypes.PowerLevels,
content=pl_content,
)
else:
power_level_content = { power_level_content = {
"users": { "users": {
creator_id: 100, creator_id: 100,
@ -316,6 +327,8 @@ class RoomCreationHandler(BaseHandler):
for invitee in invite_list: for invitee in invite_list:
power_level_content["users"][invitee] = 100 power_level_content["users"][invitee] = 100
power_level_content.update(power_level_content_override)
yield send( yield send(
etype=EventTypes.PowerLevels, etype=EventTypes.PowerLevels,
content=power_level_content, content=power_level_content,

View File

@ -15,7 +15,7 @@
from twisted.internet import defer from twisted.internet import defer
from synapse.api.constants import Membership from synapse.api.constants import Membership, EventTypes
from synapse.api.errors import AuthError, SynapseError from synapse.api.errors import AuthError, SynapseError
from synapse.types import UserID, create_requester from synapse.types import UserID, create_requester
from synapse.http.servlet import parse_json_object_from_request from synapse.http.servlet import parse_json_object_from_request
@ -161,10 +161,16 @@ class DeactivateAccountRestServlet(ClientV1RestServlet):
class ShutdownRoomRestServlet(ClientV1RestServlet): class ShutdownRoomRestServlet(ClientV1RestServlet):
"""Shuts down a room by removing all local users from the room and blocking """Shuts down a room by removing all local users from the room and blocking
all future invites and joins to the room. Any local aliases will be repointed all future invites and joins to the room. Any local aliases will be repointed
to a given room id. to a new room created by `new_room_user_id` and kicked users will be auto
joined to the new room.
""" """
PATTERNS = client_path_patterns("/admin/shutdown_room/(?P<room_id>[^/]+)") PATTERNS = client_path_patterns("/admin/shutdown_room/(?P<room_id>[^/]+)")
DEFAULT_MESSAGE = (
"Sharing illegal content on this server is not permitted and rooms in"
" violatation will be blocked."
)
def __init__(self, hs): def __init__(self, hs):
super(ShutdownRoomRestServlet, self).__init__(hs) super(ShutdownRoomRestServlet, self).__init__(hs)
self.store = hs.get_datastore() self.store = hs.get_datastore()
@ -180,9 +186,39 @@ class ShutdownRoomRestServlet(ClientV1RestServlet):
content = parse_json_object_from_request(request) content = parse_json_object_from_request(request)
repoint_aliases_to_room_id = content.get("repoint_aliases_to_room_id") new_room_user_id = content.get("new_room_user_id")
if not repoint_aliases_to_room_id: if not new_room_user_id:
raise SynapseError(400, "Please provide field `repoint_aliases_to_room_id`") raise SynapseError(400, "Please provide field `new_room_user_id`")
room_creator_requester = create_requester(new_room_user_id)
message = content.get("message", self.DEFAULT_MESSAGE)
room_name = content.get("room_name", "Content Violation Notification")
info = yield self.handlers.room_creation_handler.create_room(
room_creator_requester,
config={
"preset": "public_chat",
"name": room_name,
"power_level_content_override": {
"users_default": -10,
},
},
ratelimit=False,
)
new_room_id = info["room_id"]
msg_handler = self.handlers.message_handler
yield msg_handler.create_and_send_nonmember_event(
room_creator_requester,
{
"type": "m.room.message",
"content": {"body": message, "msgtype": "m.text"},
"room_id": new_room_id,
"sender": new_room_user_id,
},
ratelimit=False,
)
requester_user_id = requester.user.to_string() requester_user_id = requester.user.to_string()
@ -205,21 +241,32 @@ class ShutdownRoomRestServlet(ClientV1RestServlet):
room_id=room_id, room_id=room_id,
action=Membership.LEAVE, action=Membership.LEAVE,
content={}, content={},
ratelimit=False
) )
yield self.handlers.room_member_handler.forget(target_requester.user, room_id) yield self.handlers.room_member_handler.forget(target_requester.user, room_id)
yield self.handlers.room_member_handler.update_membership(
requester=target_requester,
target=target_requester.user,
room_id=new_room_id,
action=Membership.JOIN,
content={},
ratelimit=False
)
kicked_users.append(user_id) kicked_users.append(user_id)
aliases_for_room = yield self.store.get_aliases_for_room(room_id) aliases_for_room = yield self.store.get_aliases_for_room(room_id)
yield self.store.update_aliases_for_room( yield self.store.update_aliases_for_room(
room_id, repoint_aliases_to_room_id, requester_user_id room_id, new_room_id, requester_user_id
) )
defer.returnValue((200, { defer.returnValue((200, {
"kicked_users": kicked_users, "kicked_users": kicked_users,
"local_aliases": aliases_for_room, "local_aliases": aliases_for_room,
"new_room_id": new_room_id,
})) }))