Don't unfreeze when using FreezeEvent.get_dict, as we are using a JSONEncoder that understands FrozenDict

This commit is contained in:
Erik Johnston 2015-02-11 15:44:28 +00:00
parent 4ebbaf0d43
commit ddb816cf60
6 changed files with 36 additions and 13 deletions

View File

@ -140,10 +140,6 @@ class FrozenEvent(EventBase):
return e return e
def get_dict(self):
# We need to unfreeze what we return
return unfreeze(super(FrozenEvent, self).get_dict())
def __str__(self): def __str__(self):
return self.__repr__() return self.__repr__()

View File

@ -23,7 +23,8 @@ from twisted.internet import defer
from synapse.util.logutils import log_function from synapse.util.logutils import log_function
import simplejson as json from syutil.jsonutil import encode_canonical_json
import logging import logging
@ -70,7 +71,7 @@ class TransactionActions(object):
transaction.transaction_id, transaction.transaction_id,
transaction.origin, transaction.origin,
code, code,
json.dumps(response) encode_canonical_json(response)
) )
@defer.inlineCallbacks @defer.inlineCallbacks
@ -100,5 +101,5 @@ class TransactionActions(object):
transaction.transaction_id, transaction.transaction_id,
transaction.destination, transaction.destination,
response_code, response_code,
json.dumps(response_dict) encode_canonical_json(response_dict)
) )

View File

@ -23,6 +23,7 @@ from synapse.api.errors import (
from synapse.api.constants import EventTypes, Membership, RejectedReason from synapse.api.constants import EventTypes, Membership, RejectedReason
from synapse.util.logutils import log_function from synapse.util.logutils import log_function
from synapse.util.async import run_on_reactor from synapse.util.async import run_on_reactor
from synapse.util.frozenutils import unfreeze
from synapse.crypto.event_signing import ( from synapse.crypto.event_signing import (
compute_event_signature, add_hashes_and_signatures, compute_event_signature, add_hashes_and_signatures,
) )
@ -311,9 +312,12 @@ class FederationHandler(BaseHandler):
self.room_queues[room_id] = [] self.room_queues[room_id] = []
builder = self.event_builder_factory.new( builder = self.event_builder_factory.new(
event.get_pdu_json() unfreeze(event.get_pdu_json())
) )
logger.info("Builder: %s", builder.get_pdu_json())
logger.info("Content: %s", content)
handled_events = set() handled_events = set()
try: try:
@ -324,14 +328,21 @@ class FederationHandler(BaseHandler):
if not hasattr(event, "signatures"): if not hasattr(event, "signatures"):
builder.signatures = {} builder.signatures = {}
logger.info("Content befhahs: %s", builder.content)
add_hashes_and_signatures( add_hashes_and_signatures(
builder, builder,
self.hs.hostname, self.hs.hostname,
self.hs.config.signing_key[0], self.hs.config.signing_key[0],
) )
logger.info("Content aftet hah: %s", builder.content)
logger.info("Content pdu json: %s", builder.get_pdu_json())
new_event = builder.build() new_event = builder.build()
logger.info("Content after build: %s", new_event.content)
# Try the host we successfully got a response to /make_join/ # Try the host we successfully got a response to /make_join/
# request first. # request first.
try: try:
@ -340,6 +351,7 @@ class FederationHandler(BaseHandler):
except ValueError: except ValueError:
pass pass
logger.info(new_event.content)
ret = yield self.replication_layer.send_join( ret = yield self.replication_layer.send_join(
target_hosts, target_hosts,
new_event new_event
@ -485,6 +497,7 @@ class FederationHandler(BaseHandler):
event.internal_metadata.outlier = False event.internal_metadata.outlier = False
logger.info(event.content)
context = yield self._handle_new_event(origin, event) context = yield self._handle_new_event(origin, event)
logger.debug( logger.debug(

View File

@ -403,7 +403,9 @@ class RoomMemberHandler(BaseHandler):
"membership": Membership.JOIN, "membership": Membership.JOIN,
"content": content, "content": content,
}) })
logger.info("Before build: %s", builder.get_pdu_json())
event, context = yield self._create_new_client_event(builder) event, context = yield self._create_new_client_event(builder)
logger.info("After build: %s", event.get_dict())
yield self._do_join(event, context, room_hosts=hosts, do_auth=True) yield self._do_join(event, context, room_hosts=hosts, do_auth=True)
@ -462,7 +464,7 @@ class RoomMemberHandler(BaseHandler):
room_hosts, room_hosts,
room_id, room_id,
event.user_id, event.user_id,
event.get_dict()["content"], # FIXME To get a non-frozen dict event.content, # FIXME To get a non-frozen dict
context context
) )
else: else:

View File

@ -298,12 +298,16 @@ class DataStore(RoomMemberStore, RoomStore,
or_replace=True, or_replace=True,
) )
content = encode_canonical_json(
event.content
).decode("UTF-8")
vals = { vals = {
"topological_ordering": event.depth, "topological_ordering": event.depth,
"event_id": event.event_id, "event_id": event.event_id,
"type": event.type, "type": event.type,
"room_id": event.room_id, "room_id": event.room_id,
"content": json.dumps(event.get_dict()["content"]), "content": content,
"processed": True, "processed": True,
"outlier": outlier, "outlier": outlier,
"depth": event.depth, "depth": event.depth,
@ -323,7 +327,10 @@ class DataStore(RoomMemberStore, RoomStore,
"prev_events", "prev_events",
] ]
} }
vals["unrecognized_keys"] = json.dumps(unrec)
vals["unrecognized_keys"] = encode_canonical_json(
unrec
).decode("UTF-8")
try: try:
self._simple_insert_txn( self._simple_insert_txn(

View File

@ -21,6 +21,9 @@ def freeze(o):
if t is dict: if t is dict:
return frozendict({k: freeze(v) for k, v in o.items()}) return frozendict({k: freeze(v) for k, v in o.items()})
if t is frozendict:
return o
if t is str or t is unicode: if t is str or t is unicode:
return o return o
@ -33,10 +36,11 @@ def freeze(o):
def unfreeze(o): def unfreeze(o):
if isinstance(o, frozendict) or isinstance(o, dict): t = type(o)
if t is dict or t is frozendict:
return dict({k: unfreeze(v) for k, v in o.items()}) return dict({k: unfreeze(v) for k, v in o.items()})
if isinstance(o, basestring): if t is str or t is unicode:
return o return o
try: try: