Add published room list edit API
parent
e4054abfdc
commit
3e7fac0d56
|
@ -814,17 +814,16 @@ class Auth(object):
|
||||||
|
|
||||||
return auth_ids
|
return auth_ids
|
||||||
|
|
||||||
@log_function
|
def _get_send_level(self, etype, state_key, auth_events):
|
||||||
def _can_send_event(self, event, auth_events):
|
|
||||||
key = (EventTypes.PowerLevels, "", )
|
key = (EventTypes.PowerLevels, "", )
|
||||||
send_level_event = auth_events.get(key)
|
send_level_event = auth_events.get(key)
|
||||||
send_level = None
|
send_level = None
|
||||||
if send_level_event:
|
if send_level_event:
|
||||||
send_level = send_level_event.content.get("events", {}).get(
|
send_level = send_level_event.content.get("events", {}).get(
|
||||||
event.type
|
etype
|
||||||
)
|
)
|
||||||
if send_level is None:
|
if send_level is None:
|
||||||
if hasattr(event, "state_key"):
|
if state_key is not None:
|
||||||
send_level = send_level_event.content.get(
|
send_level = send_level_event.content.get(
|
||||||
"state_default", 50
|
"state_default", 50
|
||||||
)
|
)
|
||||||
|
@ -838,6 +837,13 @@ class Auth(object):
|
||||||
else:
|
else:
|
||||||
send_level = 0
|
send_level = 0
|
||||||
|
|
||||||
|
return send_level
|
||||||
|
|
||||||
|
@log_function
|
||||||
|
def _can_send_event(self, event, auth_events):
|
||||||
|
send_level = self._get_send_level(
|
||||||
|
event.type, event.get("state_key", None), auth_events
|
||||||
|
)
|
||||||
user_level = self._get_user_power_level(event.user_id, auth_events)
|
user_level = self._get_user_power_level(event.user_id, auth_events)
|
||||||
|
|
||||||
if user_level < send_level:
|
if user_level < send_level:
|
||||||
|
@ -982,3 +988,43 @@ class Auth(object):
|
||||||
"You don't have permission to add ops level greater "
|
"You don't have permission to add ops level greater "
|
||||||
"than your own"
|
"than your own"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@defer.inlineCallbacks
|
||||||
|
def check_can_change_room_list(self, room_id, user):
|
||||||
|
"""Check if the user is allowed to edit the room's entry in the
|
||||||
|
published room list.
|
||||||
|
|
||||||
|
Args:
|
||||||
|
room_id (str)
|
||||||
|
user (UserID)
|
||||||
|
"""
|
||||||
|
|
||||||
|
is_admin = yield self.is_server_admin(user)
|
||||||
|
if is_admin:
|
||||||
|
defer.returnValue(True)
|
||||||
|
|
||||||
|
user_id = user.to_string()
|
||||||
|
yield self.check_joined_room(room_id, user_id)
|
||||||
|
|
||||||
|
# We currently require the user is a "moderator" in the room. We do this
|
||||||
|
# by checking if they would (theoretically) be able to change the
|
||||||
|
# m.room.aliases events
|
||||||
|
power_level_event = yield self.state.get_current_state(
|
||||||
|
room_id, EventTypes.PowerLevels, ""
|
||||||
|
)
|
||||||
|
|
||||||
|
auth_events = {}
|
||||||
|
if power_level_event:
|
||||||
|
auth_events[(EventTypes.PowerLevels, "")] = power_level_event
|
||||||
|
|
||||||
|
send_level = self._get_send_level(
|
||||||
|
EventTypes.Aliases, "", auth_events
|
||||||
|
)
|
||||||
|
user_level = self._get_user_power_level(user_id, auth_events)
|
||||||
|
|
||||||
|
if user_level < send_level:
|
||||||
|
raise AuthError(
|
||||||
|
403,
|
||||||
|
"This server requires you to be a moderator in the room to"
|
||||||
|
" edit its room list entry"
|
||||||
|
)
|
||||||
|
|
|
@ -317,3 +317,19 @@ class DirectoryHandler(BaseHandler):
|
||||||
|
|
||||||
is_admin = yield self.auth.is_server_admin(UserID.from_string(user_id))
|
is_admin = yield self.auth.is_server_admin(UserID.from_string(user_id))
|
||||||
defer.returnValue(is_admin)
|
defer.returnValue(is_admin)
|
||||||
|
|
||||||
|
@defer.inlineCallbacks
|
||||||
|
def edit_published_room_list(self, requester, room_id, visibility):
|
||||||
|
if requester.is_guest:
|
||||||
|
raise AuthError(403, "Guests cannot edit the published room list")
|
||||||
|
|
||||||
|
if visibility not in ["public", "private"]:
|
||||||
|
raise SynapseError(400, "Invalide visibility setting")
|
||||||
|
|
||||||
|
room = yield self.store.get_room(room_id)
|
||||||
|
if room is None:
|
||||||
|
raise SynapseError(400, "Unknown room")
|
||||||
|
|
||||||
|
yield self.auth.check_can_change_room_list(room_id, requester.user)
|
||||||
|
|
||||||
|
yield self.store.set_room_is_public(room_id, visibility == "public")
|
||||||
|
|
|
@ -30,6 +30,7 @@ logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
def register_servlets(hs, http_server):
|
def register_servlets(hs, http_server):
|
||||||
ClientDirectoryServer(hs).register(http_server)
|
ClientDirectoryServer(hs).register(http_server)
|
||||||
|
ClientDirectoryListServer(hs).register(http_server)
|
||||||
|
|
||||||
|
|
||||||
class ClientDirectoryServer(ClientV1RestServlet):
|
class ClientDirectoryServer(ClientV1RestServlet):
|
||||||
|
@ -137,3 +138,44 @@ class ClientDirectoryServer(ClientV1RestServlet):
|
||||||
)
|
)
|
||||||
|
|
||||||
defer.returnValue((200, {}))
|
defer.returnValue((200, {}))
|
||||||
|
|
||||||
|
|
||||||
|
class ClientDirectoryListServer(ClientV1RestServlet):
|
||||||
|
PATTERNS = client_path_patterns("/directory/list/room/(?P<room_id>[^/]*)$")
|
||||||
|
|
||||||
|
def __init__(self, hs):
|
||||||
|
super(ClientDirectoryListServer, self).__init__(hs)
|
||||||
|
self.store = hs.get_datastore()
|
||||||
|
|
||||||
|
@defer.inlineCallbacks
|
||||||
|
def on_GET(self, request, room_id):
|
||||||
|
room = yield self.store.get_room(room_id)
|
||||||
|
if room is None:
|
||||||
|
raise SynapseError(400, "Unknown room")
|
||||||
|
|
||||||
|
defer.returnValue((200, {
|
||||||
|
"visibility": "public" if room["is_public"] else "private"
|
||||||
|
}))
|
||||||
|
|
||||||
|
@defer.inlineCallbacks
|
||||||
|
def on_PUT(self, request, room_id):
|
||||||
|
requester = yield self.auth.get_user_by_req(request)
|
||||||
|
|
||||||
|
content = parse_json_object_from_request(request)
|
||||||
|
visibility = content.get("visibility", "public")
|
||||||
|
|
||||||
|
yield self.handlers.directory_handler.edit_published_room_list(
|
||||||
|
requester, room_id, visibility,
|
||||||
|
)
|
||||||
|
|
||||||
|
defer.returnValue((200, {}))
|
||||||
|
|
||||||
|
@defer.inlineCallbacks
|
||||||
|
def on_DELETE(self, request, room_id):
|
||||||
|
requester = yield self.auth.get_user_by_req(request)
|
||||||
|
|
||||||
|
yield self.handlers.directory_handler.edit_published_room_list(
|
||||||
|
requester, room_id, "private",
|
||||||
|
)
|
||||||
|
|
||||||
|
defer.returnValue((200, {}))
|
||||||
|
|
|
@ -77,6 +77,14 @@ class RoomStore(SQLBaseStore):
|
||||||
allow_none=True,
|
allow_none=True,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
def set_room_is_public(self, room_id, is_public):
|
||||||
|
return self._simple_update_one(
|
||||||
|
table="rooms",
|
||||||
|
keyvalues={"room_id": room_id},
|
||||||
|
updatevalues={"is_public": is_public},
|
||||||
|
desc="set_room_is_public",
|
||||||
|
)
|
||||||
|
|
||||||
def get_public_room_ids(self):
|
def get_public_room_ids(self):
|
||||||
return self._simple_select_onecol(
|
return self._simple_select_onecol(
|
||||||
table="rooms",
|
table="rooms",
|
||||||
|
|
Loading…
Reference in New Issue