From 251dc12469ecd96d0ec491551589b244f12d6d92 Mon Sep 17 00:00:00 2001 From: Nicolas Werner <nicolas.werner@hotmail.de> Date: Sat, 10 Sep 2022 13:17:43 +0200 Subject: [PATCH] Fix sync with invites without state --- lib/structs/responses/sync.cpp | 8 +- tests/responses.cpp | 193 +++++++++++++++++++++++++++++++++ 2 files changed, 199 insertions(+), 2 deletions(-) diff --git a/lib/structs/responses/sync.cpp b/lib/structs/responses/sync.cpp index 76d92e85e..0b87e3c2c 100644 --- a/lib/structs/responses/sync.cpp +++ b/lib/structs/responses/sync.cpp @@ -136,13 +136,17 @@ InvitedRoom::avatar() const void from_json(const json &obj, InvitedRoom &room) { - utils::parse_stripped_events(obj.at("invite_state").at("events"), room.invite_state); + if (auto state = obj.find("invite_state"); state != obj.end()) + if (auto events = state->find("events"); events != state->end()) + utils::parse_stripped_events(*events, room.invite_state); } void from_json(const json &obj, KnockedRoom &room) { - utils::parse_stripped_events(obj.at("knock_state").at("events"), room.knock_state); + if (auto state = obj.find("knock_state"); state != obj.end()) + if (auto events = state->find("events"); events != state->end()) + utils::parse_stripped_events(*events, room.knock_state); } void diff --git a/tests/responses.cpp b/tests/responses.cpp index 6c1fe179a..d981fcd05 100644 --- a/tests/responses.cpp +++ b/tests/responses.cpp @@ -359,6 +359,199 @@ TEST(Responses, Sync) EXPECT_EQ(sync2.rooms.join.size(), 0); EXPECT_EQ(sync2.rooms.leave.size(), 0); EXPECT_EQ(sync2.rooms.invite.size(), 0); + + json data_missing_fields = R"( +{ + "account_data": { + "events": [ + { + "content": { + "custom_config_key": "custom_config_value" + }, + "type": "org.example.custom.config" + } + ] + }, + "next_batch": "s72595_4483_1934", + "presence": { + "events": [ + { + "content": { + "avatar_url": "mxc://localhost/wefuiwegh8742w", + "currently_active": false, + "last_active_ago": 2478593, + "presence": "online", + "status_msg": "Making cupcakes" + }, + "sender": "@example:localhost", + "type": "m.presence" + } + ] + }, + "rooms": { + "invite": { + "!696r7674:example.com": { + "invite_state": { + "events": [ + { + "content": { + "name": "My Room Name" + }, + "sender": "@alice:example.com", + "state_key": "", + "type": "m.room.name" + }, + { + "content": { + "membership": "invite" + }, + "sender": "@alice:example.com", + "state_key": "@bob:example.com", + "type": "m.room.member" + } + ] + } + }, + "!696r7675:example.com": {} + }, + "join": { + "!726s6s6q:example.com": { + "account_data": { + "events": [ + { + "content": { + "tags": { + "u.work": { + "order": 0.9 + } + } + }, + "type": "m.tag" + }, + { + "content": { + "custom_config_key": "custom_config_value" + }, + "type": "org.example.custom.room.config" + } + ] + }, + "ephemeral": { + "events": [ + { + "content": { + "user_ids": [ + "@alice:matrix.org", + "@bob:example.com" + ] + }, + "type": "m.typing" + } + ] + }, + "state": { + "events": [ + { + "content": { + "avatar_url": "mxc://example.org/SEsfnsuifSDFSSEF", + "displayname": "Alice Margatroid", + "membership": "join", + "reason": "Looking for support" + }, + "event_id": "$143273582443PhrSn:example.org", + "origin_server_ts": 1432735824653, + "room_id": "!jEsUZKDJdhlrceRyVU:example.org", + "sender": "@example:example.org", + "state_key": "@alice:example.org", + "type": "m.room.member", + "unsigned": { + "age": 1234 + } + } + ] + }, + "summary": { + "m.heroes": [ + "@alice:example.com", + "@bob:example.com" + ], + "m.invited_member_count": 0, + "m.joined_member_count": 2 + }, + "timeline": { + "events": [ + { + "content": { + "avatar_url": "mxc://example.org/SEsfnsuifSDFSSEF", + "displayname": "Alice Margatroid", + "membership": "join", + "reason": "Looking for support" + }, + "event_id": "$143273582443PhrSn:example.org", + "origin_server_ts": 1432735824653, + "room_id": "!jEsUZKDJdhlrceRyVU:example.org", + "sender": "@example:example.org", + "state_key": "@alice:example.org", + "type": "m.room.member", + "unsigned": { + "age": 1234 + } + }, + { + "content": { + "body": "This is an example text message", + "format": "org.matrix.custom.html", + "formatted_body": "<b>This is an example text message</b>", + "msgtype": "m.text" + }, + "event_id": "$143273582443PhrSn:example.org", + "origin_server_ts": 1432735824653, + "room_id": "!jEsUZKDJdhlrceRyVU:example.org", + "sender": "@example:example.org", + "type": "m.room.message", + "unsigned": { + "age": 1234 + } + } + ], + "limited": true, + "prev_batch": "t34-23535_0_0" + } + }, + "!726s7s6q:example.com": {} + }, + "knock": { + "!223asd456:example.com": { + "knock_state": { + "events": [ + { + "content": { + "name": "My Room Name" + }, + "sender": "@alice:example.com", + "state_key": "", + "type": "m.room.name" + }, + { + "content": { + "membership": "knock" + }, + "sender": "@bob:example.com", + "state_key": "@bob:example.com", + "type": "m.room.member" + } + ] + } + }, + "!223asd457:example.com": {} + }, + "leave": {} + } +})"_json; + Sync sync3 = data_missing_fields.get<Sync>(); + EXPECT_EQ(sync3.rooms.invite.count("!696r7675:example.com"), 1); + EXPECT_EQ(sync3.rooms.knock.count("!223asd457:example.com"), 1); + EXPECT_EQ(sync3.rooms.join.count("!726s7s6q:example.com"), 1); } TEST(Responses, SyncWithEncryption) -- GitLab