Allow users that have left the room to view the member list from the point they left
This commit is contained in:
parent
1d579df664
commit
bc8b25eb56
|
@ -25,7 +25,6 @@ from synapse.api.constants import (
|
||||||
from synapse.api.errors import StoreError, SynapseError
|
from synapse.api.errors import StoreError, SynapseError
|
||||||
from synapse.util import stringutils, unwrapFirstError
|
from synapse.util import stringutils, unwrapFirstError
|
||||||
from synapse.util.async import run_on_reactor
|
from synapse.util.async import run_on_reactor
|
||||||
from synapse.events.utils import serialize_event
|
|
||||||
|
|
||||||
from collections import OrderedDict
|
from collections import OrderedDict
|
||||||
import logging
|
import logging
|
||||||
|
@ -342,41 +341,6 @@ class RoomMemberHandler(BaseHandler):
|
||||||
if remotedomains is not None:
|
if remotedomains is not None:
|
||||||
remotedomains.add(member.domain)
|
remotedomains.add(member.domain)
|
||||||
|
|
||||||
@defer.inlineCallbacks
|
|
||||||
def get_room_members_as_pagination_chunk(self, room_id=None, user_id=None,
|
|
||||||
limit=0, start_tok=None,
|
|
||||||
end_tok=None):
|
|
||||||
"""Retrieve a list of room members in the room.
|
|
||||||
|
|
||||||
Args:
|
|
||||||
room_id (str): The room to get the member list for.
|
|
||||||
user_id (str): The ID of the user making the request.
|
|
||||||
limit (int): The max number of members to return.
|
|
||||||
start_tok (str): Optional. The start token if known.
|
|
||||||
end_tok (str): Optional. The end token if known.
|
|
||||||
Returns:
|
|
||||||
dict: A Pagination streamable dict.
|
|
||||||
Raises:
|
|
||||||
SynapseError if something goes wrong.
|
|
||||||
"""
|
|
||||||
yield self.auth.check_joined_room(room_id, user_id)
|
|
||||||
|
|
||||||
member_list = yield self.store.get_room_members(room_id=room_id)
|
|
||||||
time_now = self.clock.time_msec()
|
|
||||||
event_list = [
|
|
||||||
serialize_event(entry, time_now)
|
|
||||||
for entry in member_list
|
|
||||||
]
|
|
||||||
chunk_data = {
|
|
||||||
"start": "START", # FIXME (erikj): START is no longer valid
|
|
||||||
"end": "END",
|
|
||||||
"chunk": event_list
|
|
||||||
}
|
|
||||||
# TODO honor Pagination stream params
|
|
||||||
# TODO snapshot this list to return on subsequent requests when
|
|
||||||
# paginating
|
|
||||||
defer.returnValue(chunk_data)
|
|
||||||
|
|
||||||
@defer.inlineCallbacks
|
@defer.inlineCallbacks
|
||||||
def change_membership(self, event, context, do_auth=True):
|
def change_membership(self, event, context, do_auth=True):
|
||||||
""" Change the membership status of a user in a room.
|
""" Change the membership status of a user in a room.
|
||||||
|
|
|
@ -290,12 +290,18 @@ class RoomMemberListRestServlet(ClientV1RestServlet):
|
||||||
def on_GET(self, request, room_id):
|
def on_GET(self, request, room_id):
|
||||||
# TODO support Pagination stream API (limit/tokens)
|
# TODO support Pagination stream API (limit/tokens)
|
||||||
user, _ = yield self.auth.get_user_by_req(request)
|
user, _ = yield self.auth.get_user_by_req(request)
|
||||||
handler = self.handlers.room_member_handler
|
handler = self.handlers.message_handler
|
||||||
members = yield handler.get_room_members_as_pagination_chunk(
|
events = yield handler.get_state_events(
|
||||||
room_id=room_id,
|
room_id=room_id,
|
||||||
user_id=user.to_string())
|
user_id=user.to_string(),
|
||||||
|
)
|
||||||
|
|
||||||
for event in members["chunk"]:
|
chunk = []
|
||||||
|
|
||||||
|
for event in events:
|
||||||
|
if event["type"] != EventTypes.Member:
|
||||||
|
continue
|
||||||
|
chunk.append(event)
|
||||||
# FIXME: should probably be state_key here, not user_id
|
# FIXME: should probably be state_key here, not user_id
|
||||||
target_user = UserID.from_string(event["user_id"])
|
target_user = UserID.from_string(event["user_id"])
|
||||||
# Presence is an optional cache; don't fail if we can't fetch it
|
# Presence is an optional cache; don't fail if we can't fetch it
|
||||||
|
@ -308,7 +314,9 @@ class RoomMemberListRestServlet(ClientV1RestServlet):
|
||||||
except:
|
except:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
defer.returnValue((200, members))
|
defer.returnValue((200, {
|
||||||
|
"chunk": chunk
|
||||||
|
}))
|
||||||
|
|
||||||
|
|
||||||
# TODO: Needs unit testing
|
# TODO: Needs unit testing
|
||||||
|
|
|
@ -492,9 +492,9 @@ class RoomsMemberListTestCase(RestTestCase):
|
||||||
self.assertEquals(200, code, msg=str(response))
|
self.assertEquals(200, code, msg=str(response))
|
||||||
|
|
||||||
yield self.leave(room=room_id, user=self.user_id)
|
yield self.leave(room=room_id, user=self.user_id)
|
||||||
# can no longer see list, you've left.
|
# can see old list once left
|
||||||
(code, response) = yield self.mock_resource.trigger_get(room_path)
|
(code, response) = yield self.mock_resource.trigger_get(room_path)
|
||||||
self.assertEquals(403, code, msg=str(response))
|
self.assertEquals(200, code, msg=str(response))
|
||||||
|
|
||||||
|
|
||||||
class RoomsCreateTestCase(RestTestCase):
|
class RoomsCreateTestCase(RestTestCase):
|
||||||
|
|
Loading…
Reference in New Issue