diff options
author | Erik Johnston <erik@matrix.org> | 2018-09-13 15:33:16 +0100 |
---|---|---|
committer | Erik Johnston <erik@matrix.org> | 2018-09-13 15:44:12 +0100 |
commit | 89a76d18898a0172010c25e5a7c66d57c16b9196 (patch) | |
tree | 030ab431c73868185687a09cf464453713846e45 /synapse | |
parent | Attempt to figure out what's going on with timeouts (#3857) (diff) | |
download | synapse-89a76d18898a0172010c25e5a7c66d57c16b9196.tar.xz |
Fix handling of redacted events from federation
If we receive an event that doesn't pass their content hash check (e.g. due to already being redacted) then we hit a bug which causes an exception to be raised, which then promplty stops the event (and request) from being processed. This effects all sorts of federation APIs, including joining rooms with a redacted state event.
Diffstat (limited to 'synapse')
-rw-r--r-- | synapse/events/__init__.py | 5 | ||||
-rw-r--r-- | synapse/federation/federation_base.py | 2 |
2 files changed, 6 insertions, 1 deletions
diff --git a/synapse/events/__init__.py b/synapse/events/__init__.py index 51f9084b90..b782af6308 100644 --- a/synapse/events/__init__.py +++ b/synapse/events/__init__.py @@ -13,6 +13,8 @@ # See the License for the specific language governing permissions and # limitations under the License. +import six + from synapse.util.caches import intern_dict from synapse.util.frozenutils import freeze @@ -147,6 +149,9 @@ class EventBase(object): def items(self): return list(self._event_dict.items()) + def keys(self): + return six.iterkeys(self._event_dict) + class FrozenEvent(EventBase): def __init__(self, event_dict, internal_metadata_dict={}, rejected_reason=None): diff --git a/synapse/federation/federation_base.py b/synapse/federation/federation_base.py index 61782ae1c0..b7ad729c63 100644 --- a/synapse/federation/federation_base.py +++ b/synapse/federation/federation_base.py @@ -153,7 +153,7 @@ class FederationBase(object): # *actual* redacted copy to be on the safe side.) redacted_event = prune_event(pdu) if ( - set(six.iterkeys(redacted_event)) == set(six.iterkeys(pdu)) and + set(redacted_event.keys()) == set(pdu.keys()) and set(six.iterkeys(redacted_event.content)) == set(six.iterkeys(pdu.content)) ): |