diff --git a/synapse/events/__init__.py b/synapse/events/__init__.py
index 4252e5ab5c..64e08223b0 100644
--- a/synapse/events/__init__.py
+++ b/synapse/events/__init__.py
@@ -13,12 +13,12 @@
# See the License for the specific language governing permissions and
# limitations under the License.
-from synapse.util.frozenutils import freeze, unfreeze
+from synapse.util.frozenutils import freeze
class _EventInternalMetadata(object):
def __init__(self, internal_metadata_dict):
- self.__dict__ = internal_metadata_dict
+ self.__dict__ = dict(internal_metadata_dict)
def get_dict(self):
return dict(self.__dict__)
@@ -77,7 +77,7 @@ class EventBase(object):
return self.content["membership"]
def is_state(self):
- return hasattr(self, "state_key")
+ return hasattr(self, "state_key") and self.state_key is not None
def get_dict(self):
d = dict(self._event_dict)
@@ -140,10 +140,6 @@ class FrozenEvent(EventBase):
return e
- def get_dict(self):
- # We need to unfreeze what we return
- return unfreeze(super(FrozenEvent, self).get_dict())
-
def __str__(self):
return self.__repr__()
diff --git a/synapse/events/builder.py b/synapse/events/builder.py
index d4cb602ebb..9d45bdb892 100644
--- a/synapse/events/builder.py
+++ b/synapse/events/builder.py
@@ -23,22 +23,17 @@ import copy
class EventBuilder(EventBase):
- def __init__(self, key_values={}):
+ def __init__(self, key_values={}, internal_metadata_dict={}):
signatures = copy.deepcopy(key_values.pop("signatures", {}))
unsigned = copy.deepcopy(key_values.pop("unsigned", {}))
super(EventBuilder, self).__init__(
key_values,
signatures=signatures,
- unsigned=unsigned
+ unsigned=unsigned,
+ internal_metadata_dict=internal_metadata_dict,
)
- def update_event_key(self, key, value):
- self._event_dict[key] = value
-
- def update_event_keys(self, other_dict):
- self._event_dict.update(other_dict)
-
def build(self):
return FrozenEvent.from_event(self)
diff --git a/synapse/events/snapshot.py b/synapse/events/snapshot.py
index 6bbba8d6ba..7e98bdef28 100644
--- a/synapse/events/snapshot.py
+++ b/synapse/events/snapshot.py
@@ -20,3 +20,4 @@ class EventContext(object):
self.current_state = current_state
self.auth_events = auth_events
self.state_group = None
+ self.rejected = False
diff --git a/synapse/events/utils.py b/synapse/events/utils.py
index 5bfa820f96..1aa952150e 100644
--- a/synapse/events/utils.py
+++ b/synapse/events/utils.py
@@ -88,48 +88,78 @@ def prune_event(event):
if "age_ts" in event.unsigned:
allowed_fields["unsigned"]["age_ts"] = event.unsigned["age_ts"]
- return type(event)(allowed_fields)
+ return type(event)(
+ allowed_fields,
+ internal_metadata_dict=event.internal_metadata.get_dict()
+ )
-def serialize_event(hs, e):
+def format_event_raw(d):
+ return d
+
+
+def format_event_for_client_v1(d):
+ d["user_id"] = d.pop("sender", None)
+
+ move_keys = ("age", "redacted_because", "replaces_state", "prev_content")
+ for key in move_keys:
+ if key in d["unsigned"]:
+ d[key] = d["unsigned"][key]
+
+ drop_keys = (
+ "auth_events", "prev_events", "hashes", "signatures", "depth",
+ "unsigned", "origin", "prev_state"
+ )
+ for key in drop_keys:
+ d.pop(key, None)
+ return d
+
+
+def format_event_for_client_v2(d):
+ drop_keys = (
+ "auth_events", "prev_events", "hashes", "signatures", "depth",
+ "origin", "prev_state",
+ )
+ for key in drop_keys:
+ d.pop(key, None)
+ return d
+
+
+def format_event_for_client_v2_without_event_id(d):
+ d = format_event_for_client_v2(d)
+ d.pop("room_id", None)
+ d.pop("event_id", None)
+ return d
+
+
+def serialize_event(e, time_now_ms, as_client_event=True,
+ event_format=format_event_for_client_v1,
+ token_id=None):
# FIXME(erikj): To handle the case of presence events and the like
if not isinstance(e, EventBase):
return e
+ time_now_ms = int(time_now_ms)
+
# Should this strip out None's?
d = {k: v for k, v in e.get_dict().items()}
+
if "age_ts" in d["unsigned"]:
- now = int(hs.get_clock().time_msec())
- d["age"] = now - d["unsigned"]["age_ts"]
+ d["unsigned"]["age"] = time_now_ms - d["unsigned"]["age_ts"]
del d["unsigned"]["age_ts"]
- d["user_id"] = d.pop("sender", None)
-
if "redacted_because" in e.unsigned:
- d["redacted_because"] = serialize_event(
- hs, e.unsigned["redacted_because"]
+ d["unsigned"]["redacted_because"] = serialize_event(
+ e.unsigned["redacted_because"], time_now_ms
)
- del d["unsigned"]["redacted_because"]
+ if token_id is not None:
+ if token_id == getattr(e.internal_metadata, "token_id", None):
+ txn_id = getattr(e.internal_metadata, "txn_id", None)
+ if txn_id is not None:
+ d["unsigned"]["transaction_id"] = txn_id
- if "redacted_by" in e.unsigned:
- d["redacted_by"] = e.unsigned["redacted_by"]
- del d["unsigned"]["redacted_by"]
-
- if "replaces_state" in e.unsigned:
- d["replaces_state"] = e.unsigned["replaces_state"]
- del d["unsigned"]["replaces_state"]
-
- if "prev_content" in e.unsigned:
- 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)
-
- return d
+ if as_client_event:
+ return event_format(d)
+ else:
+ return d
|