summary refs log tree commit diff
diff options
context:
space:
mode:
authorKegan Dougal <kegan@matrix.org>2015-01-08 13:57:29 +0000
committerKegan Dougal <kegan@matrix.org>2015-01-08 13:57:40 +0000
commit5720ab59e03d6f5ab48c3be22e8957a8891ea56c (patch)
tree93186a77a9f70485724bd0d419e1339bb7a776cb
parentAdd optional limit to graph script (diff)
downloadsynapse-5720ab59e03d6f5ab48c3be22e8957a8891ea56c.tar.xz
Add 'raw' query parameter to expose the event graph and signatures to savvy clients.
-rw-r--r--synapse/events/utils.py17
-rw-r--r--synapse/handlers/events.py7
-rw-r--r--synapse/handlers/message.py6
-rw-r--r--synapse/rest/events.py5
-rw-r--r--synapse/rest/initial_sync.py5
-rw-r--r--synapse/server.py4
6 files changed, 28 insertions, 16 deletions
diff --git a/synapse/events/utils.py b/synapse/events/utils.py
index 4f4914467c..258dedb27c 100644
--- a/synapse/events/utils.py
+++ b/synapse/events/utils.py
@@ -89,7 +89,7 @@ def prune_event(event):
     return type(event)(allowed_fields)
 
 
-def serialize_event(hs, e):
+def serialize_event(hs, e, remove_data=True):
     # FIXME(erikj): To handle the case of presence events and the like
     if not isinstance(e, EventBase):
         return e
@@ -122,12 +122,13 @@ def serialize_event(hs, e):
         d["prev_content"] = e.unsigned["prev_content"]
         del d["unsigned"]["prev_content"]
 
-    del d["auth_events"]
-    del d["prev_events"]
-    del d["hashes"]
-    del d["signatures"]
-    d.pop("depth", None)
-    d.pop("unsigned", None)
-    d.pop("origin", None)
+    if remove_data:
+        del d["auth_events"]
+        del d["prev_events"]
+        del d["hashes"]
+        del d["signatures"]
+        d.pop("depth", None)
+        d.pop("unsigned", None)
+        d.pop("origin", None)
 
     return d
diff --git a/synapse/handlers/events.py b/synapse/handlers/events.py
index 808219bd10..4e805606b8 100644
--- a/synapse/handlers/events.py
+++ b/synapse/handlers/events.py
@@ -46,7 +46,8 @@ class EventStreamHandler(BaseHandler):
 
     @defer.inlineCallbacks
     @log_function
-    def get_stream(self, auth_user_id, pagin_config, timeout=0):
+    def get_stream(self, auth_user_id, pagin_config, timeout=0,
+                   trim_events=True):
         auth_user = self.hs.parse_userid(auth_user_id)
 
         try:
@@ -78,7 +79,9 @@ class EventStreamHandler(BaseHandler):
                     auth_user, room_ids, pagin_config, timeout
                 )
 
-            chunks = [self.hs.serialize_event(e) for e in events]
+            chunks = [
+                self.hs.serialize_event(e, trim_events) for e in events
+            ]
 
             chunk = {
                 "chunk": chunks,
diff --git a/synapse/handlers/message.py b/synapse/handlers/message.py
index 7195de98b5..b2bbcfc6e2 100644
--- a/synapse/handlers/message.py
+++ b/synapse/handlers/message.py
@@ -211,7 +211,7 @@ class MessageHandler(BaseHandler):
 
     @defer.inlineCallbacks
     def snapshot_all_rooms(self, user_id=None, pagin_config=None,
-                           feedback=False):
+                           feedback=False, trim_events=True):
         """Retrieve a snapshot of all rooms the user is invited or has joined.
 
         This snapshot may include messages for all rooms where the user is
@@ -280,7 +280,9 @@ class MessageHandler(BaseHandler):
                 end_token = now_token.copy_and_replace("room_key", token[1])
 
                 d["messages"] = {
-                    "chunk": [self.hs.serialize_event(m) for m in messages],
+                    "chunk": [
+                    self.hs.serialize_event(m, trim_events) for m in messages
+                    ],
                     "start": start_token.to_string(),
                     "end": end_token.to_string(),
                 }
diff --git a/synapse/rest/events.py b/synapse/rest/events.py
index cf6d13f817..ac1a75a559 100644
--- a/synapse/rest/events.py
+++ b/synapse/rest/events.py
@@ -44,8 +44,11 @@ class EventStreamRestServlet(RestServlet):
                 except ValueError:
                     raise SynapseError(400, "timeout must be in milliseconds.")
 
+            trim_events = "raw" not in request.args
+
             chunk = yield handler.get_stream(
-                auth_user.to_string(), pagin_config, timeout=timeout
+                auth_user.to_string(), pagin_config, timeout=timeout,
+                trim_events=trim_events
             )
         except:
             logger.exception("Event stream failed")
diff --git a/synapse/rest/initial_sync.py b/synapse/rest/initial_sync.py
index a571589581..d2c0c63aa6 100644
--- a/synapse/rest/initial_sync.py
+++ b/synapse/rest/initial_sync.py
@@ -27,12 +27,15 @@ class InitialSyncRestServlet(RestServlet):
     def on_GET(self, request):
         user = yield self.auth.get_user_by_req(request)
         with_feedback = "feedback" in request.args
+        trim_events = "raw" not in request.args
         pagination_config = PaginationConfig.from_request(request)
         handler = self.handlers.message_handler
         content = yield handler.snapshot_all_rooms(
             user_id=user.to_string(),
             pagin_config=pagination_config,
-            feedback=with_feedback)
+            feedback=with_feedback,
+            trim_events=trim_events
+        )
 
         defer.returnValue((200, content))
 
diff --git a/synapse/server.py b/synapse/server.py
index c3bf46abbf..88161107af 100644
--- a/synapse/server.py
+++ b/synapse/server.py
@@ -149,8 +149,8 @@ class BaseHomeServer(object):
         object."""
         return EventID.from_string(s)
 
-    def serialize_event(self, e):
-        return serialize_event(self, e)
+    def serialize_event(self, e, remove_data=True):
+        return serialize_event(self, e, remove_data)
 
     def get_ip_from_request(self, request):
         # May be an X-Forwarding-For header depending on config