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