From 26c85d112c50a62a7e8f5e545a34ee94fb938a9e Mon Sep 17 00:00:00 2001 From: Neil Johnson Date: Wed, 5 Dec 2018 23:01:10 +0000 Subject: [PATCH 1/5] catch and log state event parse errors in _process_state_event --- matrix_client/room.py | 53 +++++++++++++++++++++++++------------------ 1 file changed, 31 insertions(+), 22 deletions(-) diff --git a/matrix_client/room.py b/matrix_client/room.py index 488f335b..3c13b6f7 100644 --- a/matrix_client/room.py +++ b/matrix_client/room.py @@ -13,13 +13,17 @@ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. +import logging import re +import traceback from uuid import uuid4 from .checks import check_room_id from .user import User from .errors import MatrixRequestError +logger = logging.getLogger(__name__) + class Room(object): """Call room-specific functions after joining a room from the client. @@ -643,28 +647,33 @@ def _process_state_event(self, state_event): # Don't keep track of room state if caching turned off if clevel >= 0: - if etype == "m.room.name": - self.name = econtent.get("name") - elif etype == "m.room.canonical_alias": - self.canonical_alias = econtent.get("alias") - elif etype == "m.room.topic": - self.topic = econtent.get("topic") - elif etype == "m.room.aliases": - self.aliases = econtent.get("aliases") - elif etype == "m.room.join_rules": - self.invite_only = econtent["join_rule"] == "invite" - elif etype == "m.room.guest_access": - self.guest_access = econtent["guest_access"] == "can_join" - elif etype == "m.room.encryption": - if econtent.get("algorithm") == "m.megolm.v1.aes-sha2": - self.encrypted = True - elif etype == "m.room.member" and clevel == clevel.ALL: - # tracking room members can be large e.g. #matrix:matrix.org - if econtent["membership"] == "join": - user_id = state_event["state_key"] - self._add_member(user_id, econtent.get("displayname")) - elif econtent["membership"] in ("leave", "kick", "invite"): - self._members.pop(state_event["state_key"], None) + try: + if etype == "m.room.name": + self.name = econtent.get("name") + elif etype == "m.room.canonical_alias": + self.canonical_alias = econtent.get("alias") + elif etype == "m.room.topic": + self.topic = econtent.get("topic") + elif etype == "m.room.aliases": + self.aliases = econtent.get("aliases") + elif etype == "m.room.join_rules": + self.invite_only = econtent["join_rule"] == "invite" + elif etype == "m.room.guest_access": + self.guest_access = econtent["guest_access"] == "can_join" + elif etype == "m.room.encryption": + if econtent.get("algorithm") == "m.megolm.v1.aes-sha2": + self.encrypted = True + elif etype == "m.room.member" and clevel == clevel.ALL: + # tracking room members can be large e.g. #matrix:matrix.org + if econtent["membership"] == "join": + user_id = state_event["state_key"] + self._add_member(user_id, econtent.get("displayname")) + elif econtent["membership"] in ("leave", "kick", "invite"): + self._members.pop(state_event["state_key"], None) + except KeyError: + id = state_event['event_id'] + logger.error("Unable to parse state event %s, passing over." % id) + traceback.print_exc() for listener in self.state_listeners: if ( From dace2947382521622e6b0548093ba58428c185b0 Mon Sep 17 00:00:00 2001 From: Neil Johnson Date: Wed, 5 Dec 2018 23:59:13 +0000 Subject: [PATCH 2/5] check that exceptions thrown due to malformed events are handled --- test/client_test.py | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/test/client_test.py b/test/client_test.py index c5884924..c9b8464a 100644 --- a/test/client_test.py +++ b/test/client_test.py @@ -99,7 +99,8 @@ def test_state_event(): ev = { "type": "m.room.name", - "content": {} + "content": {}, + "event_id": "$10000000000000AAAAA:matrix.org" } room._process_state_event(ev) @@ -152,6 +153,13 @@ def test_state_event(): room._process_state_event(ev) assert room.guest_access + # test malformed event (check does not throw exception) + room.guest_access = False + ev["type"] = "m.room.guest_access" + ev["content"] = {} + room._process_state_event(ev) + assert not room.guest_access + # test encryption room.encrypted = False ev["type"] = "m.room.encryption" From 757274a34a92ca6441c3fe57d3ba3d709c9c9400 Mon Sep 17 00:00:00 2001 From: Neil Johnson Date: Fri, 7 Dec 2018 10:58:50 +0000 Subject: [PATCH 3/5] tidy up logging --- matrix_client/room.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/matrix_client/room.py b/matrix_client/room.py index 3c13b6f7..1e4b0b02 100644 --- a/matrix_client/room.py +++ b/matrix_client/room.py @@ -671,9 +671,8 @@ def _process_state_event(self, state_event): elif econtent["membership"] in ("leave", "kick", "invite"): self._members.pop(state_event["state_key"], None) except KeyError: - id = state_event['event_id'] - logger.error("Unable to parse state event %s, passing over." % id) - traceback.print_exc() + logger.exception("Unable to parse state event %s, passing over.", + state_event['event_id']) for listener in self.state_listeners: if ( From 582c843890a8a19ab2185521dc0c1ca02013174c Mon Sep 17 00:00:00 2001 From: Neil Johnson Date: Fri, 7 Dec 2018 10:59:55 +0000 Subject: [PATCH 4/5] remove unnecessary traceback import --- matrix_client/room.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/matrix_client/room.py b/matrix_client/room.py index 1e4b0b02..5151c60b 100644 --- a/matrix_client/room.py +++ b/matrix_client/room.py @@ -15,7 +15,7 @@ # limitations under the License. import logging import re -import traceback + from uuid import uuid4 from .checks import check_room_id From 8eb0803e13f376dcae37d661b16c07ea9aa55709 Mon Sep 17 00:00:00 2001 From: Neil Johnson Date: Fri, 7 Dec 2018 21:03:27 +0000 Subject: [PATCH 5/5] remove new line --- matrix_client/room.py | 1 - 1 file changed, 1 deletion(-) diff --git a/matrix_client/room.py b/matrix_client/room.py index 5151c60b..9083ed4a 100644 --- a/matrix_client/room.py +++ b/matrix_client/room.py @@ -15,7 +15,6 @@ # limitations under the License. import logging import re - from uuid import uuid4 from .checks import check_room_id