Fix bug when uploading state with empty state_key

This commit is contained in:
Erik Johnston 2014-12-10 14:02:48 +00:00
parent aae8a37e63
commit 02db7eb209
6 changed files with 29 additions and 88 deletions

View File

@ -118,6 +118,9 @@ class EventBase(object):
return d return d
def get(self, key, default):
return self._event_dict.get(key, default)
def get_internal_metadata_dict(self): def get_internal_metadata_dict(self):
return self.internal_metadata.get_dict() return self.internal_metadata.get_dict()
@ -165,6 +168,9 @@ class FrozenEvent(EventBase):
return _unfreeze(super(FrozenEvent, self).get_dict()) return _unfreeze(super(FrozenEvent, self).get_dict())
def __str__(self): def __str__(self):
return self.__repr__()
def __repr__(self):
return "<FrozenEvent event_id='%s', type='%s', state_key='%s'>" % ( return "<FrozenEvent event_id='%s', type='%s', state_key='%s'>" % (
self.event_id, self.type, self.state_key, self.event_id, self.type, self.get("state_key", None),
) )

View File

@ -97,6 +97,11 @@ class BaseHandler(object):
event = builder.build() event = builder.build()
logger.debug(
"Created event %s with auth_events: %s, current state: %s",
event.event_id, context.auth_events, context.current_state,
)
defer.returnValue( defer.returnValue(
(event, context,) (event, context,)
) )
@ -147,64 +152,3 @@ class BaseHandler(object):
None, None,
destinations=destinations, destinations=destinations,
) )
# @defer.inlineCallbacks
# def _on_new_room_event(self, event, snapshot, extra_destinations=[],
# extra_users=[], suppress_auth=False,
# do_invite_host=None):
# yield run_on_reactor()
#
# snapshot.fill_out_prev_events(event)
#
# yield self.state_handler.annotate_event_with_state(event)
#
# yield self.auth.add_auth_events(event)
#
# logger.debug("Signing event...")
#
# add_hashes_and_signatures(
# event, self.server_name, self.signing_key
# )
#
# logger.debug("Signed event.")
#
# if not suppress_auth:
# logger.debug("Authing...")
# self.auth.check(event, auth_events=event.old_state_events)
# logger.debug("Authed")
# else:
# logger.debug("Suppressed auth.")
#
# if do_invite_host:
# federation_handler = self.hs.get_handlers().federation_handler
# invite_event = yield federation_handler.send_invite(
# do_invite_host,
# event
# )
#
# # FIXME: We need to check if the remote changed anything else
# event.signatures = invite_event.signatures
#
# yield self.store.persist_event(event)
#
# destinations = set(extra_destinations)
# # Send a PDU to all hosts who have joined the room.
#
# for k, s in event.state_events.items():
# try:
# if k[0] == RoomMemberEvent.TYPE:
# if s.content["membership"] == Membership.JOIN:
# destinations.add(
# self.hs.parse_userid(s.state_key).domain
# )
# except:
# logger.warn(
# "Failed to get destination from event %s", s.event_id
# )
#
# event.destinations = list(destinations)
#
# yield self.notifier.on_new_room_event(event, extra_users=extra_users)
#
# federation_handler = self.hs.get_handlers().federation_handler
# yield federation_handler.handle_new_event(event, snapshot)

View File

@ -165,21 +165,6 @@ class MessageHandler(BaseHandler):
defer.returnValue(event) defer.returnValue(event)
@defer.inlineCallbacks
def store_room_data(self, event=None):
""" Stores data for a room.
Args:
event : The room path event
stamp_event (bool) : True to stamp event content with server keys.
Raises:
SynapseError if something went wrong.
"""
snapshot = yield self.store.snapshot_room(event)
yield self._on_new_room_event(event, snapshot)
@defer.inlineCallbacks @defer.inlineCallbacks
def get_room_data(self, user_id=None, room_id=None, def get_room_data(self, user_id=None, room_id=None,
event_type=None, state_key=""): event_type=None, state_key=""):

View File

@ -147,16 +147,18 @@ class RoomStateEventRestServlet(RestServlet):
content = _parse_json(request) content = _parse_json(request)
event_dict = {
"type": event_type,
"content": content,
"room_id": urllib.unquote(room_id),
"sender": user.to_string(),
}
if state_key is not None:
event_dict["state_key"] = urllib.unquote(state_key)
msg_handler = self.handlers.message_handler msg_handler = self.handlers.message_handler
yield msg_handler.handle_event( yield msg_handler.handle_event(event_dict)
{
"type": event_type,
"content": content,
"room_id": room_id,
"sender": user.to_string(),
"state_key": urllib.unquote(state_key),
}
)
defer.returnValue((200, {})) defer.returnValue((200, {}))

View File

@ -39,6 +39,7 @@ from .state import StateStore
from .signatures import SignatureStore from .signatures import SignatureStore
from syutil.base64util import decode_base64 from syutil.base64util import decode_base64
from syutil.jsonutil import encode_canonical_json
from synapse.crypto.event_signing import compute_event_reference_hash from synapse.crypto.event_signing import compute_event_reference_hash
@ -162,7 +163,8 @@ class DataStore(RoomMemberStore, RoomStore,
table="event_json", table="event_json",
values={ values={
"event_id": event.event_id, "event_id": event.event_id,
"json": json.dumps(event_dict, separators=(',', ':')), "room_id": event.room_id,
"json": encode_canonical_json(event_dict),
}, },
or_replace=True, or_replace=True,
) )

View File

@ -35,11 +35,13 @@ CREATE INDEX IF NOT EXISTS events_room_id ON events (room_id);
CREATE TABLE IF NOT EXISTS event_json( CREATE TABLE IF NOT EXISTS event_json(
event_id TEXT NOT NULL, event_id TEXT NOT NULL,
room_id TEXT NOT NULL,
json BLOB NOT NULL, json BLOB NOT NULL,
CONSTRAINT ev_j_uniq UNIQUE (event_id) CONSTRAINT ev_j_uniq UNIQUE (event_id)
); );
CREATE INDEX IF NOT EXISTS event_json_id ON event_json(event_id); CREATE INDEX IF NOT EXISTS event_json_id ON event_json(event_id);
CREATE INDEX IF NOT EXISTS event_json_room_id ON event_json(room_id);
CREATE TABLE IF NOT EXISTS state_events( CREATE TABLE IF NOT EXISTS state_events(