Added support for GET /events/$eventid with auth checks.

This commit is contained in:
Kegan Dougal 2014-08-27 10:33:01 +01:00
parent dfa0cd1d90
commit c65885e166
4 changed files with 45 additions and 2 deletions

View file

@ -17,7 +17,7 @@ from .register import RegistrationHandler
from .room import ( from .room import (
MessageHandler, RoomCreationHandler, RoomMemberHandler, RoomListHandler MessageHandler, RoomCreationHandler, RoomMemberHandler, RoomListHandler
) )
from .events import EventStreamHandler from .events import EventStreamHandler, EventHandler
from .federation import FederationHandler from .federation import FederationHandler
from .login import LoginHandler from .login import LoginHandler
from .profile import ProfileHandler from .profile import ProfileHandler
@ -39,6 +39,7 @@ class Handlers(object):
self.room_creation_handler = RoomCreationHandler(hs) self.room_creation_handler = RoomCreationHandler(hs)
self.room_member_handler = RoomMemberHandler(hs) self.room_member_handler = RoomMemberHandler(hs)
self.event_stream_handler = EventStreamHandler(hs) self.event_stream_handler = EventStreamHandler(hs)
self.event_handler = EventHandler(hs)
self.federation_handler = FederationHandler(hs) self.federation_handler = FederationHandler(hs)
self.profile_handler = ProfileHandler(hs) self.profile_handler = ProfileHandler(hs)
self.presence_handler = PresenceHandler(hs) self.presence_handler = PresenceHandler(hs)

View file

@ -144,3 +144,29 @@ class EventStreamHandler(BaseHandler):
self._stop_timer_per_user[auth_user] = ( self._stop_timer_per_user[auth_user] = (
self.clock.call_later(5, _later) 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)

View file

@ -47,5 +47,22 @@ class EventStreamRestServlet(RestServlet):
return (200, {}) 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): def register_servlets(hs, http_server):
EventStreamRestServlet(hs).register(http_server) EventStreamRestServlet(hs).register(http_server)
EventRestServlet(hs).register(http_server)

View file

@ -80,7 +80,6 @@ class DataStore(RoomMemberStore, RoomStore,
[ [
"event_id", "event_id",
"type", "type",
"sender",
"room_id", "room_id",
"content", "content",
"unrecognized_keys" "unrecognized_keys"