From 0fcefa4125d924395063672cab9a238c8e6ff589 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Timo=20K=C3=B6sters?= <timo@koesters.xyz>
Date: Thu, 15 Jul 2021 19:54:04 +0200
Subject: [PATCH] fix: ruma

---
 Cargo.lock                     | 23 ++---------
 Cargo.toml                     |  8 ++--
 src/client_server/account.rs   | 17 ++++----
 src/client_server/directory.rs | 16 ++++----
 src/client_server/push.rs      | 14 +++----
 src/client_server/room.rs      | 14 ++++---
 src/database/rooms.rs          | 73 +++++++++++++++++++++++++++++++++-
 src/server_server.rs           | 16 ++------
 8 files changed, 115 insertions(+), 66 deletions(-)

diff --git a/Cargo.lock b/Cargo.lock
index befd3e2f..6c50f881 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -2015,7 +2015,6 @@ dependencies = [
 [[package]]
 name = "ruma"
 version = "0.2.0"
-source = "git+https://github.com/ruma/ruma?rev=174555857ef90d49e4b9a672be9e2fe0acdc2687#174555857ef90d49e4b9a672be9e2fe0acdc2687"
 dependencies = [
  "assign",
  "js_int",
@@ -2036,7 +2035,6 @@ dependencies = [
 [[package]]
 name = "ruma-api"
 version = "0.17.1"
-source = "git+https://github.com/ruma/ruma?rev=174555857ef90d49e4b9a672be9e2fe0acdc2687#174555857ef90d49e4b9a672be9e2fe0acdc2687"
 dependencies = [
  "bytes",
  "http",
@@ -2052,7 +2050,6 @@ dependencies = [
 [[package]]
 name = "ruma-api-macros"
 version = "0.17.1"
-source = "git+https://github.com/ruma/ruma?rev=174555857ef90d49e4b9a672be9e2fe0acdc2687#174555857ef90d49e4b9a672be9e2fe0acdc2687"
 dependencies = [
  "proc-macro-crate",
  "proc-macro2",
@@ -2063,7 +2060,6 @@ dependencies = [
 [[package]]
 name = "ruma-appservice-api"
 version = "0.3.0"
-source = "git+https://github.com/ruma/ruma?rev=174555857ef90d49e4b9a672be9e2fe0acdc2687#174555857ef90d49e4b9a672be9e2fe0acdc2687"
 dependencies = [
  "ruma-api",
  "ruma-common",
@@ -2077,7 +2073,6 @@ dependencies = [
 [[package]]
 name = "ruma-client-api"
 version = "0.11.0"
-source = "git+https://github.com/ruma/ruma?rev=174555857ef90d49e4b9a672be9e2fe0acdc2687#174555857ef90d49e4b9a672be9e2fe0acdc2687"
 dependencies = [
  "assign",
  "bytes",
@@ -2097,7 +2092,6 @@ dependencies = [
 [[package]]
 name = "ruma-common"
 version = "0.5.4"
-source = "git+https://github.com/ruma/ruma?rev=174555857ef90d49e4b9a672be9e2fe0acdc2687#174555857ef90d49e4b9a672be9e2fe0acdc2687"
 dependencies = [
  "indexmap",
  "js_int",
@@ -2111,8 +2105,7 @@ dependencies = [
 
 [[package]]
 name = "ruma-events"
-version = "0.23.1"
-source = "git+https://github.com/ruma/ruma?rev=174555857ef90d49e4b9a672be9e2fe0acdc2687#174555857ef90d49e4b9a672be9e2fe0acdc2687"
+version = "0.23.2"
 dependencies = [
  "indoc",
  "js_int",
@@ -2122,12 +2115,12 @@ dependencies = [
  "ruma-serde",
  "serde",
  "serde_json",
+ "thiserror",
 ]
 
 [[package]]
 name = "ruma-events-macros"
-version = "0.23.1"
-source = "git+https://github.com/ruma/ruma?rev=174555857ef90d49e4b9a672be9e2fe0acdc2687#174555857ef90d49e4b9a672be9e2fe0acdc2687"
+version = "0.23.2"
 dependencies = [
  "proc-macro-crate",
  "proc-macro2",
@@ -2138,7 +2131,6 @@ dependencies = [
 [[package]]
 name = "ruma-federation-api"
 version = "0.2.0"
-source = "git+https://github.com/ruma/ruma?rev=174555857ef90d49e4b9a672be9e2fe0acdc2687#174555857ef90d49e4b9a672be9e2fe0acdc2687"
 dependencies = [
  "js_int",
  "ruma-api",
@@ -2153,7 +2145,6 @@ dependencies = [
 [[package]]
 name = "ruma-identifiers"
 version = "0.19.4"
-source = "git+https://github.com/ruma/ruma?rev=174555857ef90d49e4b9a672be9e2fe0acdc2687#174555857ef90d49e4b9a672be9e2fe0acdc2687"
 dependencies = [
  "paste",
  "rand 0.8.4",
@@ -2167,7 +2158,6 @@ dependencies = [
 [[package]]
 name = "ruma-identifiers-macros"
 version = "0.19.4"
-source = "git+https://github.com/ruma/ruma?rev=174555857ef90d49e4b9a672be9e2fe0acdc2687#174555857ef90d49e4b9a672be9e2fe0acdc2687"
 dependencies = [
  "quote",
  "ruma-identifiers-validation",
@@ -2177,12 +2167,10 @@ dependencies = [
 [[package]]
 name = "ruma-identifiers-validation"
 version = "0.4.0"
-source = "git+https://github.com/ruma/ruma?rev=174555857ef90d49e4b9a672be9e2fe0acdc2687#174555857ef90d49e4b9a672be9e2fe0acdc2687"
 
 [[package]]
 name = "ruma-identity-service-api"
 version = "0.2.0"
-source = "git+https://github.com/ruma/ruma?rev=174555857ef90d49e4b9a672be9e2fe0acdc2687#174555857ef90d49e4b9a672be9e2fe0acdc2687"
 dependencies = [
  "js_int",
  "ruma-api",
@@ -2195,7 +2183,6 @@ dependencies = [
 [[package]]
 name = "ruma-push-gateway-api"
 version = "0.2.0"
-source = "git+https://github.com/ruma/ruma?rev=174555857ef90d49e4b9a672be9e2fe0acdc2687#174555857ef90d49e4b9a672be9e2fe0acdc2687"
 dependencies = [
  "js_int",
  "ruma-api",
@@ -2210,7 +2197,6 @@ dependencies = [
 [[package]]
 name = "ruma-serde"
 version = "0.4.1"
-source = "git+https://github.com/ruma/ruma?rev=174555857ef90d49e4b9a672be9e2fe0acdc2687#174555857ef90d49e4b9a672be9e2fe0acdc2687"
 dependencies = [
  "bytes",
  "form_urlencoded",
@@ -2224,7 +2210,6 @@ dependencies = [
 [[package]]
 name = "ruma-serde-macros"
 version = "0.4.1"
-source = "git+https://github.com/ruma/ruma?rev=174555857ef90d49e4b9a672be9e2fe0acdc2687#174555857ef90d49e4b9a672be9e2fe0acdc2687"
 dependencies = [
  "proc-macro-crate",
  "proc-macro2",
@@ -2235,7 +2220,6 @@ dependencies = [
 [[package]]
 name = "ruma-signatures"
 version = "0.8.0"
-source = "git+https://github.com/ruma/ruma?rev=174555857ef90d49e4b9a672be9e2fe0acdc2687#174555857ef90d49e4b9a672be9e2fe0acdc2687"
 dependencies = [
  "base64 0.13.0",
  "ed25519-dalek",
@@ -2252,7 +2236,6 @@ dependencies = [
 [[package]]
 name = "ruma-state-res"
 version = "0.2.0"
-source = "git+https://github.com/ruma/ruma?rev=174555857ef90d49e4b9a672be9e2fe0acdc2687#174555857ef90d49e4b9a672be9e2fe0acdc2687"
 dependencies = [
  "itertools 0.10.1",
  "js_int",
diff --git a/Cargo.toml b/Cargo.toml
index 0f40ab78..2a0f6972 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -18,8 +18,8 @@ edition = "2018"
 rocket = { version = "0.5.0-rc.1", features = ["tls"] } # Used to handle requests
 
 # Used for matrix spec type definitions and helpers
-ruma = { git = "https://github.com/ruma/ruma", rev = "174555857ef90d49e4b9a672be9e2fe0acdc2687", features = ["compat", "rand", "appservice-api-c", "client-api", "federation-api", "push-gateway-api-c", "state-res", "unstable-pre-spec", "unstable-exhaustive-types"] }
-#ruma = { path = "../ruma/crates/ruma", features = ["compat", "rand", "appservice-api-c", "client-api", "federation-api", "push-gateway-api-c", "state-res", "unstable-pre-spec", "unstable-exhaustive-types"] }
+#ruma = { git = "https://github.com/ruma/ruma", rev = "174555857ef90d49e4b9a672be9e2fe0acdc2687", features = ["compat", "rand", "appservice-api-c", "client-api", "federation-api", "push-gateway-api-c", "state-res", "unstable-pre-spec", "unstable-exhaustive-types"] }
+ruma = { path = "../ruma/crates/ruma", features = ["compat", "rand", "appservice-api-c", "client-api", "federation-api", "push-gateway-api-c", "state-res", "unstable-pre-spec", "unstable-exhaustive-types"] }
 
 # Used for long polling and federation sender, should be the same as rocket::tokio
 tokio = "1.2.0"
@@ -119,5 +119,5 @@ maintainer-scripts = "debian/"
 systemd-units = { unit-name = "matrix-conduit" }
 
 # For flamegraphs:
-#[profile.release]
-#debug = true
+[profile.release]
+debug = true
diff --git a/src/client_server/account.rs b/src/client_server/account.rs
index 9e16d90d..740a2dcc 100644
--- a/src/client_server/account.rs
+++ b/src/client_server/account.rs
@@ -1,4 +1,8 @@
-use std::{collections::BTreeMap, convert::TryInto, sync::Arc};
+use std::{
+    collections::BTreeMap,
+    convert::{TryFrom, TryInto},
+    sync::Arc,
+};
 
 use super::{DEVICE_ID_LENGTH, SESSION_ID_LENGTH, TOKEN_LENGTH};
 use crate::{database::DatabaseGuard, pdu::PduBuilder, utils, ConduitResult, Error, Ruma};
@@ -16,7 +20,8 @@ use ruma::{
     },
     events::{
         room::{
-            canonical_alias, guest_access, history_visibility, join_rules, member, message, name,
+            canonical_alias, guest_access, history_visibility, join_rules, member, message,
+            name::{self, RoomName},
             topic,
         },
         EventType,
@@ -375,11 +380,9 @@ pub async fn register_route(
         db.rooms.build_and_append_pdu(
             PduBuilder {
                 event_type: EventType::RoomName,
-                content: serde_json::to_value(
-                    name::NameEventContent::new("Admin Room".to_owned()).map_err(|_| {
-                        Error::BadRequest(ErrorKind::InvalidParam, "Name is invalid.")
-                    })?,
-                )
+                content: serde_json::to_value(name::NameEventContent::new(Some(
+                    RoomName::try_from("Admin Room".to_owned()).expect("Room name is valid"),
+                )))
                 .expect("event is valid, we just created it"),
                 unsigned: None,
                 state_key: Some("".to_owned()),
diff --git a/src/client_server/directory.rs b/src/client_server/directory.rs
index 4a440fd9..36b817f5 100644
--- a/src/client_server/directory.rs
+++ b/src/client_server/directory.rs
@@ -87,17 +87,17 @@ pub async fn set_room_visibility_route(
     let sender_user = body.sender_user.as_ref().expect("user is authenticated");
 
     match &body.visibility {
-        room::Visibility::_Custom(_s) => {
-            return Err(Error::BadRequest(
-                ErrorKind::InvalidParam,
-                "Room visibility type is not supported.",
-            ));
-        }
         room::Visibility::Public => {
             db.rooms.set_public(&body.room_id, true)?;
             info!("{} made {} public", sender_user, body.room_id);
         }
         room::Visibility::Private => db.rooms.set_public(&body.room_id, false)?,
+        _ => {
+            return Err(Error::BadRequest(
+                ErrorKind::InvalidParam,
+                "Room visibility type is not supported.",
+            ));
+        }
     }
 
     db.flush().await?;
@@ -231,8 +231,8 @@ pub async fn get_public_rooms_filtered_helper(
                             .map_err(|_| {
                                 Error::bad_database("Invalid room name event in database.")
                             })?
-                            .name()
-                            .map(|n| n.to_owned()))
+                            .name
+                            .map(|n| n.to_owned().into()))
                         })?,
                     num_joined_members: (db.rooms.room_members(&room_id).count() as u32).into(),
                     topic: db
diff --git a/src/client_server/push.rs b/src/client_server/push.rs
index 794cbce4..33e62d9a 100644
--- a/src/client_server/push.rs
+++ b/src/client_server/push.rs
@@ -81,7 +81,7 @@ pub async fn get_pushrule_route(
             .content
             .get(body.rule_id.as_str())
             .map(|rule| rule.clone().into()),
-        RuleKind::_Custom(_) => None,
+        _ => None,
     };
 
     if let Some(rule) = rule {
@@ -181,7 +181,7 @@ pub async fn set_pushrule_route(
                 .into(),
             );
         }
-        RuleKind::_Custom(_) => {}
+        _ => {}
     }
 
     db.account_data.update(
@@ -245,7 +245,7 @@ pub async fn get_pushrule_actions_route(
             .content
             .get(body.rule_id.as_str())
             .map(|rule| rule.actions.clone()),
-        RuleKind::_Custom(_) => None,
+        _ => None,
     };
 
     db.flush().await?;
@@ -314,7 +314,7 @@ pub async fn set_pushrule_actions_route(
                 global.content.replace(rule);
             }
         }
-        RuleKind::_Custom(_) => {}
+        _ => {}
     };
 
     db.account_data.update(
@@ -383,7 +383,7 @@ pub async fn get_pushrule_enabled_route(
             .iter()
             .find(|rule| rule.rule_id == body.rule_id)
             .map_or(false, |rule| rule.enabled),
-        RuleKind::_Custom(_) => false,
+        _ => false,
     };
 
     db.flush().await?;
@@ -454,7 +454,7 @@ pub async fn set_pushrule_enabled_route(
                 global.content.insert(rule);
             }
         }
-        RuleKind::_Custom(_) => {}
+        _ => {}
     }
 
     db.account_data.update(
@@ -523,7 +523,7 @@ pub async fn delete_pushrule_route(
                 global.content.remove(&rule);
             }
         }
-        RuleKind::_Custom(_) => {}
+        _ => {}
     }
 
     db.account_data.update(
diff --git a/src/client_server/room.rs b/src/client_server/room.rs
index f48c5e93..9f381a02 100644
--- a/src/client_server/room.rs
+++ b/src/client_server/room.rs
@@ -9,7 +9,11 @@ use ruma::{
         r0::room::{self, create_room, get_room_event, upgrade_room},
     },
     events::{
-        room::{guest_access, history_visibility, join_rules, member, name, topic},
+        room::{
+            guest_access, history_visibility, join_rules, member,
+            name::{self, RoomName},
+            topic,
+        },
         EventType,
     },
     serde::Raw,
@@ -113,7 +117,7 @@ pub async fn create_room_route(
         .unwrap_or_else(|| match &body.visibility {
             room::Visibility::Private => create_room::RoomPreset::PrivateChat,
             room::Visibility::Public => create_room::RoomPreset::PublicChat,
-            room::Visibility::_Custom(_) => create_room::RoomPreset::PrivateChat, // Room visibility should not be custom
+            _ => create_room::RoomPreset::PrivateChat, // Room visibility should not be custom
         });
 
     let mut users = BTreeMap::new();
@@ -251,11 +255,11 @@ pub async fn create_room_route(
         db.rooms.build_and_append_pdu(
             PduBuilder {
                 event_type: EventType::RoomName,
-                content: serde_json::to_value(
-                    name::NameEventContent::new(name.clone()).map_err(|_| {
+                content: serde_json::to_value(name::NameEventContent::new(Some(
+                    RoomName::try_from(name.clone()).map_err(|_| {
                         Error::BadRequest(ErrorKind::InvalidParam, "Name is invalid.")
                     })?,
-                )
+                )))
                 .expect("event is valid, we just created it"),
                 unsigned: None,
                 state_key: Some("".to_owned()),
diff --git a/src/database/rooms.rs b/src/database/rooms.rs
index 1542db85..f6f50215 100644
--- a/src/database/rooms.rs
+++ b/src/database/rooms.rs
@@ -490,6 +490,27 @@ impl Rooms {
             .transpose()
     }
 
+    /// Returns the json of a pdu.
+    pub fn get_non_outlier_pdu_json(
+        &self,
+        event_id: &EventId,
+    ) -> Result<Option<CanonicalJsonObject>> {
+        self.eventid_pduid
+            .get(event_id.as_bytes())?
+            .map_or_else::<Result<_>, _, _>(
+                || Ok(None),
+                |pduid| {
+                    Ok(Some(self.pduid_pdu.get(&pduid)?.ok_or_else(|| {
+                        Error::bad_database("Invalid pduid in eventid_pduid.")
+                    })?))
+                },
+            )?
+            .map(|pdu| {
+                serde_json::from_slice(&pdu).map_err(|_| Error::bad_database("Invalid PDU in db."))
+            })
+            .transpose()
+    }
+
     /// Returns the pdu's id.
     pub fn get_pdu_id(&self, event_id: &EventId) -> Result<Option<Vec<u8>>> {
         self.eventid_pduid
@@ -903,11 +924,59 @@ impl Rooms {
                                 "list_appservices" => {
                                     db.admin.send(AdminCommand::ListAppservices);
                                 }
+                                "get_pdu" => {
+                                    if args.len() == 1 {
+                                        if let Ok(event_id) = EventId::try_from(args[0]) {
+                                            let mut outlier = false;
+                                            let mut pdu_json =
+                                                db.rooms.get_non_outlier_pdu_json(&event_id)?;
+                                            if pdu_json.is_none() {
+                                                outlier = true;
+                                                pdu_json = db.rooms.get_pdu_json(&event_id)?;
+                                            }
+                                            match pdu_json {
+                                                Some(json) => {
+                                                    db.admin.send(AdminCommand::SendMessage(
+                                                        message::MessageEventContent::text_html(
+                                                            format!("{}\n```json\n{:#?}\n```", 
+                                                            if outlier {
+                                                                "PDU is outlier"
+                                                            } else { "PDU was accepted"}, json),
+                                                            format!("<p>{}</p>\n<pre><code class=\"language-json\">{}\n</code></pre>\n", 
+                                                            if outlier {
+                                                                "PDU is outlier"
+                                                            } else { "PDU was accepted"}, serde_json::to_string_pretty(&json).expect("canonical json is valid json"))
+                                                        ),
+                                                    ));
+                                                }
+                                                None => {
+                                                    db.admin.send(AdminCommand::SendMessage(
+                                                        message::MessageEventContent::text_plain(
+                                                            "PDU not found.",
+                                                        ),
+                                                    ));
+                                                }
+                                            }
+                                        } else {
+                                            db.admin.send(AdminCommand::SendMessage(
+                                                message::MessageEventContent::text_plain(
+                                                    "Event ID could not be parsed.",
+                                                ),
+                                            ));
+                                        }
+                                    } else {
+                                        db.admin.send(AdminCommand::SendMessage(
+                                            message::MessageEventContent::text_plain(
+                                                "Usage: get_pdu <eventid>",
+                                            ),
+                                        ));
+                                    }
+                                }
                                 _ => {
                                     db.admin.send(AdminCommand::SendMessage(
                                         message::MessageEventContent::text_plain(format!(
-                                            "Command: {}, Args: {:?}",
-                                            command, args
+                                            "Unrecognized command: {}",
+                                            command
                                         )),
                                     ));
                                 }
diff --git a/src/server_server.rs b/src/server_server.rs
index fb49d0ca..bc854079 100644
--- a/src/server_server.rs
+++ b/src/server_server.rs
@@ -1254,15 +1254,6 @@ pub fn handle_incoming_pdu<'a>(
             // We do need to force an update to this room's state
             update_state = true;
 
-            let mut auth_events = vec![];
-            for map in &fork_states {
-                let state_auth = map
-                    .values()
-                    .flat_map(|pdu| pdu.auth_events.clone())
-                    .collect();
-                auth_events.push(state_auth);
-            }
-
             match state_res::StateResolution::resolve(
                 &room_id,
                 room_version_id,
@@ -1274,8 +1265,7 @@ pub fn handle_incoming_pdu<'a>(
                             .collect::<StateMap<_>>()
                     })
                     .collect::<Vec<_>>(),
-                auth_events,
-                &|id| {
+                |id| {
                     let res = db.rooms.get_pdu(id);
                     if let Err(e) = &res {
                         error!("LOOK AT ME Failed to fetch event: {}", e);
@@ -2432,10 +2422,10 @@ pub fn get_profile_information_route(
     let mut avatar_url = None;
 
     match &body.field {
-        // TODO: what to do with custom
-        Some(ProfileField::_Custom(_s)) => {}
         Some(ProfileField::DisplayName) => displayname = db.users.displayname(&body.user_id)?,
         Some(ProfileField::AvatarUrl) => avatar_url = db.users.avatar_url(&body.user_id)?,
+        // TODO: what to do with custom
+        Some(_) => {}
         None => {
             displayname = db.users.displayname(&body.user_id)?;
             avatar_url = db.users.avatar_url(&body.user_id)?;