From 05f9d927b833e22709d0eb0b46cc4d15a60f3408 Mon Sep 17 00:00:00 2001
From: timokoesters <timo@koesters.xyz>
Date: Tue, 28 Jul 2020 14:02:29 +0200
Subject: [PATCH] fix: account data

---
 src/client_server.rs         |  7 ++-----
 src/database/account_data.rs | 19 +++++++++++++------
 2 files changed, 15 insertions(+), 11 deletions(-)

diff --git a/src/client_server.rs b/src/client_server.rs
index 2a67a572..6cc8e3d6 100644
--- a/src/client_server.rs
+++ b/src/client_server.rs
@@ -622,17 +622,14 @@ pub fn get_global_account_data_route(
 
     let data = db
         .account_data
-        .get::<ruma::events::AnyBasicEvent>(
+        .get::<Raw<ruma::events::AnyBasicEvent>>(
             None,
             sender_id,
             EventType::try_from(&body.event_type).expect("EventType::try_from can never fail"),
         )?
         .ok_or(Error::BadRequest(ErrorKind::NotFound, "Data not found."))?;
 
-    Ok(get_global_account_data::Response {
-        account_data: Raw::from(data),
-    }
-    .into())
+    Ok(get_global_account_data::Response { account_data: data }.into())
 }
 
 #[cfg_attr(
diff --git a/src/database/account_data.rs b/src/database/account_data.rs
index 1afbcd61..99e0d5c7 100644
--- a/src/database/account_data.rs
+++ b/src/database/account_data.rs
@@ -1,5 +1,6 @@
 use crate::{utils, Error, Result};
 use ruma::{
+    api::client::error::ErrorKind,
     events::{AnyEvent as EduEvent, EventType},
     Raw, RoomId, UserId,
 };
@@ -19,7 +20,7 @@ impl AccountData {
         room_id: Option<&RoomId>,
         user_id: &UserId,
         event_type: EventType,
-        event: &T,
+        data: &T,
         globals: &super::globals::Globals,
     ) -> Result<()> {
         let mut prefix = room_id
@@ -42,10 +43,16 @@ impl AccountData {
         key.push(0xff);
         key.extend_from_slice(event_type.to_string().as_bytes());
 
-        self.roomuserdataid_accountdata.insert(
-            key,
-            &*serde_json::to_string(&event).expect("Map::to_string always works"),
-        )?;
+        let json = serde_json::to_value(data).expect("all types here can be serialized"); // TODO: maybe add error handling
+        if json.get("type").is_none() || json.get("content").is_none() {
+            return Err(Error::BadRequest(
+                ErrorKind::InvalidParam,
+                "Account data doesn't have all required fields.",
+            ));
+        }
+
+        self.roomuserdataid_accountdata
+            .insert(key, &*json.to_string())?;
 
         Ok(())
     }
@@ -60,7 +67,7 @@ impl AccountData {
         self.find_event(room_id, user_id, &kind)
             .map(|r| {
                 let (_, v) = r?;
-                serde_json::from_slice(&v).map_err(|_| Error::BadDatabase("could not deserialize"))
+                serde_json::from_slice(&v).map_err(|_| Error::bad_database("could not deserialize"))
             })
             .transpose()
     }