diff --git a/synapse/rest/base.py b/synapse/rest/base.py
index 2e8e3fa7d4..79fc4dfb84 100644
--- a/synapse/rest/base.py
+++ b/synapse/rest/base.py
@@ -18,6 +18,11 @@ from synapse.api.urls import CLIENT_PREFIX
from synapse.rest.transactions import HttpTransactionStore
import re
+import logging
+
+
+logger = logging.getLogger(__name__)
+
def client_path_pattern(path_regex):
"""Creates a regex compiled client path with the correct client path
@@ -62,6 +67,8 @@ class RestServlet(object):
self.auth = hs.get_auth()
self.txns = HttpTransactionStore()
+ self.validator = hs.get_event_validator()
+
def register(self, http_server):
""" Register this servlet with the given HTTP server. """
if hasattr(self, "PATTERN"):
diff --git a/synapse/rest/directory.py b/synapse/rest/directory.py
index 6c260e7102..35300c6a6f 100644
--- a/synapse/rest/directory.py
+++ b/synapse/rest/directory.py
@@ -36,7 +36,9 @@ class ClientDirectoryServer(RestServlet):
@defer.inlineCallbacks
def on_GET(self, request, room_alias):
- room_alias = self.hs.parse_roomalias(urllib.unquote(room_alias))
+ room_alias = self.hs.parse_roomalias(
+ urllib.unquote(room_alias).decode("utf-8")
+ )
dir_handler = self.handlers.directory_handler
res = yield dir_handler.get_association(room_alias)
@@ -54,7 +56,9 @@ class ClientDirectoryServer(RestServlet):
logger.debug("Got content: %s", content)
- room_alias = self.hs.parse_roomalias(urllib.unquote(room_alias))
+ room_alias = self.hs.parse_roomalias(
+ urllib.unquote(room_alias).decode("utf-8")
+ )
logger.debug("Got room name: %s", room_alias.to_string())
@@ -70,9 +74,11 @@ class ClientDirectoryServer(RestServlet):
dir_handler = self.handlers.directory_handler
try:
+ user_id = user.to_string()
yield dir_handler.create_association(
- user.to_string(), room_alias, room_id, servers
+ user_id, room_alias, room_id, servers
)
+ yield dir_handler.send_room_alias_update_event(user_id, room_id)
except SynapseError as e:
raise e
except:
@@ -91,7 +97,9 @@ class ClientDirectoryServer(RestServlet):
dir_handler = self.handlers.directory_handler
- room_alias = self.hs.parse_roomalias(urllib.unquote(room_alias))
+ room_alias = self.hs.parse_roomalias(
+ urllib.unquote(room_alias).decode("utf-8")
+ )
yield dir_handler.delete_association(
user.to_string(), room_alias
diff --git a/synapse/rest/events.py b/synapse/rest/events.py
index 097195d7cc..92ff5e5ca7 100644
--- a/synapse/rest/events.py
+++ b/synapse/rest/events.py
@@ -20,6 +20,12 @@ from synapse.api.errors import SynapseError
from synapse.streams.config import PaginationConfig
from synapse.rest.base import RestServlet, client_path_pattern
+import logging
+
+
+logger = logging.getLogger(__name__)
+
+
class EventStreamRestServlet(RestServlet):
PATTERN = client_path_pattern("/events$")
@@ -29,18 +35,22 @@ class EventStreamRestServlet(RestServlet):
@defer.inlineCallbacks
def on_GET(self, request):
auth_user = yield self.auth.get_user_by_req(request)
-
- handler = self.handlers.event_stream_handler
- pagin_config = PaginationConfig.from_request(request)
- timeout = EventStreamRestServlet.DEFAULT_LONGPOLL_TIME_MS
- if "timeout" in request.args:
- try:
- timeout = int(request.args["timeout"][0])
- except ValueError:
- raise SynapseError(400, "timeout must be in milliseconds.")
-
- chunk = yield handler.get_stream(auth_user.to_string(), pagin_config,
- timeout=timeout)
+ try:
+ handler = self.handlers.event_stream_handler
+ pagin_config = PaginationConfig.from_request(request)
+ timeout = EventStreamRestServlet.DEFAULT_LONGPOLL_TIME_MS
+ if "timeout" in request.args:
+ try:
+ timeout = int(request.args["timeout"][0])
+ except ValueError:
+ raise SynapseError(400, "timeout must be in milliseconds.")
+
+ chunk = yield handler.get_stream(
+ auth_user.to_string(), pagin_config, timeout=timeout
+ )
+ except:
+ logger.exception("Event stream failed")
+ raise
defer.returnValue((200, chunk))
diff --git a/synapse/rest/room.py b/synapse/rest/room.py
index ec0ce78fda..4f6d039b61 100644
--- a/synapse/rest/room.py
+++ b/synapse/rest/room.py
@@ -138,7 +138,7 @@ class RoomStateEventRestServlet(RestServlet):
raise SynapseError(
404, "Event not found.", errcode=Codes.NOT_FOUND
)
- defer.returnValue((200, data[0].get_dict()["content"]))
+ defer.returnValue((200, data.get_dict()["content"]))
@defer.inlineCallbacks
def on_PUT(self, request, room_id, event_type, state_key):
@@ -148,12 +148,15 @@ class RoomStateEventRestServlet(RestServlet):
content = _parse_json(request)
event = self.event_factory.create_event(
- etype=event_type,
+ etype=urllib.unquote(event_type),
content=content,
room_id=urllib.unquote(room_id),
user_id=user.to_string(),
state_key=urllib.unquote(state_key)
)
+
+ self.validator.validate(event)
+
if event_type == RoomMemberEvent.TYPE:
# membership events are special
handler = self.handlers.room_member_handler
@@ -182,12 +185,14 @@ class RoomSendEventRestServlet(RestServlet):
content = _parse_json(request)
event = self.event_factory.create_event(
- etype=event_type,
+ etype=urllib.unquote(event_type),
room_id=urllib.unquote(room_id),
user_id=user.to_string(),
content=content
)
+ self.validator.validate(event)
+
msg_handler = self.handlers.message_handler
yield msg_handler.send_message(event)
@@ -253,6 +258,9 @@ class JoinRoomAliasServlet(RestServlet):
user_id=user.to_string(),
state_key=user.to_string()
)
+
+ self.validator.validate(event)
+
handler = self.handlers.room_member_handler
yield handler.change_membership(event)
defer.returnValue((200, {}))
@@ -353,27 +361,14 @@ class RoomInitialSyncRestServlet(RestServlet):
@defer.inlineCallbacks
def on_GET(self, request, room_id):
- yield self.auth.get_user_by_req(request)
- # TODO: Get all the initial sync data for this room and return in the
- # same format as initial sync, that is:
- # {
- # membership: join,
- # messages: [
- # chunk: [ msg events ],
- # start: s_tok,
- # end: e_tok
- # ],
- # room_id: foo,
- # state: [
- # { state event } , { state event }
- # ]
- # }
- # Probably worth keeping the keys room_id and membership for parity
- # with /initialSync even though they must be joined to sync this and
- # know the room ID, so clients can reuse the same code (room_id and
- # membership are MANDATORY for /initialSync, so the code will expect
- # it to be there)
- defer.returnValue((200, {}))
+ user = yield self.auth.get_user_by_req(request)
+ pagination_config = PaginationConfig.from_request(request)
+ content = yield self.handlers.message_handler.room_initial_sync(
+ room_id=urllib.unquote(room_id),
+ user_id=user.to_string(),
+ pagin_config=pagination_config,
+ )
+ defer.returnValue((200, content))
class RoomTriggerBackfill(RestServlet):
@@ -424,6 +419,9 @@ class RoomMembershipRestServlet(RestServlet):
user_id=user.to_string(),
state_key=state_key
)
+
+ self.validator.validate(event)
+
handler = self.handlers.room_member_handler
yield handler.change_membership(event)
defer.returnValue((200, {}))
@@ -458,9 +456,11 @@ class RoomRedactEventRestServlet(RestServlet):
room_id=urllib.unquote(room_id),
user_id=user.to_string(),
content=content,
- redacts=event_id,
+ redacts=urllib.unquote(event_id),
)
+ self.validator.validate(event)
+
msg_handler = self.handlers.message_handler
yield msg_handler.send_message(event)
|