diff --git a/synapse/handlers/__init__.py b/synapse/handlers/__init__.py
index 8a4aa6e5d6..7417a02cea 100644
--- a/synapse/handlers/__init__.py
+++ b/synapse/handlers/__init__.py
@@ -17,7 +17,7 @@ from .register import RegistrationHandler
from .room import (
MessageHandler, RoomCreationHandler, RoomMemberHandler, RoomListHandler
)
-from .events import EventStreamHandler
+from .events import EventStreamHandler, EventHandler
from .federation import FederationHandler
from .login import LoginHandler
from .profile import ProfileHandler
@@ -39,6 +39,7 @@ class Handlers(object):
self.room_creation_handler = RoomCreationHandler(hs)
self.room_member_handler = RoomMemberHandler(hs)
self.event_stream_handler = EventStreamHandler(hs)
+ self.event_handler = EventHandler(hs)
self.federation_handler = FederationHandler(hs)
self.profile_handler = ProfileHandler(hs)
self.presence_handler = PresenceHandler(hs)
diff --git a/synapse/handlers/events.py b/synapse/handlers/events.py
index 6bb797caf2..1bd173acd8 100644
--- a/synapse/handlers/events.py
+++ b/synapse/handlers/events.py
@@ -144,3 +144,29 @@ class EventStreamHandler(BaseHandler):
self._stop_timer_per_user[auth_user] = (
self.clock.call_later(5, _later)
)
+
+
+class EventHandler(BaseHandler):
+
+ @defer.inlineCallbacks
+ def get_event(self, user, event_id):
+ """Retrieve a single specified event.
+
+ Args:
+ user (synapse.types.UserID): The user requesting the event
+ event_id (str): The event ID to obtain.
+ Returns:
+ dict: An event, or None if there is no event matching this ID.
+ Raises:
+ SynapseError if there was a problem retrieving this event, or
+ AuthError if the user does not have the rights to inspect this
+ event.
+ """
+ event = yield self.store.get_event(event_id)
+
+ if not event:
+ defer.returnValue(None)
+ return
+
+ yield self.auth.check(event, raises=True)
+ defer.returnValue(event)
diff --git a/synapse/rest/events.py b/synapse/rest/events.py
index ca2f6978e5..d89dfc193c 100644
--- a/synapse/rest/events.py
+++ b/synapse/rest/events.py
@@ -47,5 +47,22 @@ class EventStreamRestServlet(RestServlet):
return (200, {})
+# TODO: Unit test gets, with and without auth, with different kinds of events.
+class EventRestServlet(RestServlet):
+ PATTERN = client_path_pattern("/events/(?P<event_id>[^/]*)$")
+
+ @defer.inlineCallbacks
+ def on_GET(self, request, event_id):
+ auth_user = yield self.auth.get_user_by_req(request)
+ handler = self.handlers.event_handler
+ event = yield handler.get_event(auth_user, event_id)
+
+ if event:
+ defer.returnValue((200, event.get_dict()))
+ else:
+ defer.returnValue((404, "Event not found."))
+
+
def register_servlets(hs, http_server):
EventStreamRestServlet(hs).register(http_server)
+ EventRestServlet(hs).register(http_server)
diff --git a/synapse/storage/__init__.py b/synapse/storage/__init__.py
index a97a42e1e3..38ab03c45c 100644
--- a/synapse/storage/__init__.py
+++ b/synapse/storage/__init__.py
@@ -80,7 +80,6 @@ class DataStore(RoomMemberStore, RoomStore,
[
"event_id",
"type",
- "sender",
"room_id",
"content",
"unrecognized_keys"
|