diff --git a/synapse/rest/room.py b/synapse/rest/room.py
index 9752469863..a07e031984 100644
--- a/synapse/rest/room.py
+++ b/synapse/rest/room.py
@@ -18,9 +18,10 @@ from twisted.internet import defer
from base import RestServlet, client_path_pattern
from synapse.api.errors import SynapseError, Codes
-from synapse.api.events.room import (RoomTopicEvent, MessageEvent,
- RoomMemberEvent, FeedbackEvent)
-from synapse.api.constants import Feedback, Membership
+from synapse.api.events.room import (
+ MessageEvent, RoomMemberEvent, FeedbackEvent
+)
+from synapse.api.constants import Feedback
from synapse.api.streams import PaginationConfig
import json
@@ -131,8 +132,8 @@ class RoomStateEventRestServlet(RestServlet):
data = yield msg_handler.get_room_data(
user_id=user.to_string(),
room_id=urllib.unquote(room_id),
- event_type=event_type,
- state_key=state_key,
+ event_type=urllib.unquote(event_type),
+ state_key=urllib.unquote(state_key),
)
if not data:
@@ -142,6 +143,7 @@ class RoomStateEventRestServlet(RestServlet):
@defer.inlineCallbacks
def on_PUT(self, request, room_id, event_type, state_key):
user = yield self.auth.get_user_by_req(request)
+ event_type = urllib.unquote(event_type)
content = _parse_json(request)
@@ -150,14 +152,20 @@ class RoomStateEventRestServlet(RestServlet):
content=content,
room_id=urllib.unquote(room_id),
user_id=user.to_string(),
- state_key=state_key
+ state_key=urllib.unquote(state_key)
)
-
- msg_handler = self.handlers.message_handler
- yield msg_handler.store_room_data(
- event=event
- )
- defer.returnValue((200, ""))
+ if event_type == RoomMemberEvent.TYPE:
+ # membership events are special
+ handler = self.handlers.room_member_handler
+ yield handler.change_membership(event)
+ defer.returnValue((200, ""))
+ else:
+ # store random bits of state
+ msg_handler = self.handlers.message_handler
+ yield msg_handler.store_room_data(
+ event=event
+ )
+ defer.returnValue((200, ""))
class JoinRoomAliasServlet(RestServlet):
@@ -180,73 +188,6 @@ class JoinRoomAliasServlet(RestServlet):
defer.returnValue((200, ret_dict))
-class RoomMemberRestServlet(RestServlet):
- PATTERN = client_path_pattern("/rooms/(?P<room_id>[^/]*)/members/"
- + "(?P<target_user_id>[^/]*)/state$")
-
- def get_event_type(self):
- return RoomMemberEvent.TYPE
-
- @defer.inlineCallbacks
- def on_GET(self, request, room_id, target_user_id):
- room_id = urllib.unquote(room_id)
- user = yield self.auth.get_user_by_req(request)
-
- handler = self.handlers.room_member_handler
- member = yield handler.get_room_member(
- room_id,
- urllib.unquote(target_user_id),
- user.to_string())
- if not member:
- raise SynapseError(404, "Member not found.",
- errcode=Codes.NOT_FOUND)
- defer.returnValue((200, member.content))
-
- @defer.inlineCallbacks
- def on_DELETE(self, request, roomid, target_user_id):
- user = yield self.auth.get_user_by_req(request)
-
- event = self.event_factory.create_event(
- etype=self.get_event_type(),
- target_user_id=urllib.unquote(target_user_id),
- room_id=urllib.unquote(roomid),
- user_id=user.to_string(),
- membership=Membership.LEAVE,
- content={"membership": Membership.LEAVE}
- )
-
- handler = self.handlers.room_member_handler
- yield handler.change_membership(event)
- defer.returnValue((200, ""))
-
- @defer.inlineCallbacks
- def on_PUT(self, request, roomid, target_user_id):
- user = yield self.auth.get_user_by_req(request)
-
- content = _parse_json(request)
- if "membership" not in content:
- raise SynapseError(400, "No membership key.",
- errcode=Codes.BAD_JSON)
-
- valid_membership_values = [Membership.JOIN, Membership.INVITE]
- if (content["membership"] not in valid_membership_values):
- raise SynapseError(400, "Membership value must be %s." % (
- valid_membership_values,), errcode=Codes.BAD_JSON)
-
- event = self.event_factory.create_event(
- etype=self.get_event_type(),
- target_user_id=urllib.unquote(target_user_id),
- room_id=urllib.unquote(roomid),
- user_id=user.to_string(),
- membership=content["membership"],
- content=content
- )
-
- handler = self.handlers.room_member_handler
- yield handler.change_membership(event)
- defer.returnValue((200, ""))
-
-
class MessageRestServlet(RestServlet):
PATTERN = client_path_pattern("/rooms/(?P<room_id>[^/]*)/messages/"
+ "(?P<sender_id>[^/]*)/(?P<msg_id>[^/]*)$")
@@ -377,7 +318,7 @@ class RoomMemberListRestServlet(RestServlet):
user_id=user.to_string())
for event in members["chunk"]:
- target_user = self.hs.parse_userid(event["target_user_id"])
+ target_user = self.hs.parse_userid(event["state_key"])
# Presence is an optional cache; don't fail if we can't fetch it
try:
presence_state = yield self.handlers.presence_handler.get_state(
@@ -423,6 +364,7 @@ class RoomTriggerBackfill(RestServlet):
res = [event.get_dict() for event in events]
defer.returnValue((200, res))
+
def _parse_json(request):
try:
content = json.loads(request.content.read())
@@ -436,7 +378,6 @@ def _parse_json(request):
def register_servlets(hs, http_server):
RoomStateEventRestServlet(hs).register(http_server)
- RoomMemberRestServlet(hs).register(http_server)
MessageRestServlet(hs).register(http_server)
FeedbackRestServlet(hs).register(http_server)
RoomCreateRestServlet(hs).register(http_server)
|