From 0fcefa4125d924395063672cab9a238c8e6ff589 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Timo=20K=C3=B6sters?= 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> { + self.eventid_pduid + .get(event_id.as_bytes())? + .map_or_else::, _, _>( + || 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>> { 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!("

{}

\n
{}\n
\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 ", + ), + )); + } + } _ => { 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::>() }) .collect::>(), - 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)?;