refactor various patterns for serde_json::from_ elim

bump ruma

Signed-off-by: Jason Volk <jason@zemos.net>
This commit is contained in:
Jason Volk 2024-10-03 09:57:43 +00:00 committed by strawberry
parent 55c85f6851
commit d526db681f
9 changed files with 64 additions and 96 deletions

26
Cargo.lock generated
View file

@ -2976,7 +2976,7 @@ dependencies = [
[[package]] [[package]]
name = "ruma" name = "ruma"
version = "0.10.1" version = "0.10.1"
source = "git+https://github.com/girlbossceo/ruwuma?rev=e81ed2741b4ebe98fe41cabdfee2ac28a52a8e37#e81ed2741b4ebe98fe41cabdfee2ac28a52a8e37" source = "git+https://github.com/girlbossceo/ruwuma?rev=f485a0265c67a59df75fc6686787538172fa4cac#f485a0265c67a59df75fc6686787538172fa4cac"
dependencies = [ dependencies = [
"assign", "assign",
"js_int", "js_int",
@ -2998,7 +2998,7 @@ dependencies = [
[[package]] [[package]]
name = "ruma-appservice-api" name = "ruma-appservice-api"
version = "0.10.0" version = "0.10.0"
source = "git+https://github.com/girlbossceo/ruwuma?rev=e81ed2741b4ebe98fe41cabdfee2ac28a52a8e37#e81ed2741b4ebe98fe41cabdfee2ac28a52a8e37" source = "git+https://github.com/girlbossceo/ruwuma?rev=f485a0265c67a59df75fc6686787538172fa4cac#f485a0265c67a59df75fc6686787538172fa4cac"
dependencies = [ dependencies = [
"js_int", "js_int",
"ruma-common", "ruma-common",
@ -3010,7 +3010,7 @@ dependencies = [
[[package]] [[package]]
name = "ruma-client-api" name = "ruma-client-api"
version = "0.18.0" version = "0.18.0"
source = "git+https://github.com/girlbossceo/ruwuma?rev=e81ed2741b4ebe98fe41cabdfee2ac28a52a8e37#e81ed2741b4ebe98fe41cabdfee2ac28a52a8e37" source = "git+https://github.com/girlbossceo/ruwuma?rev=f485a0265c67a59df75fc6686787538172fa4cac#f485a0265c67a59df75fc6686787538172fa4cac"
dependencies = [ dependencies = [
"as_variant", "as_variant",
"assign", "assign",
@ -3033,7 +3033,7 @@ dependencies = [
[[package]] [[package]]
name = "ruma-common" name = "ruma-common"
version = "0.13.0" version = "0.13.0"
source = "git+https://github.com/girlbossceo/ruwuma?rev=e81ed2741b4ebe98fe41cabdfee2ac28a52a8e37#e81ed2741b4ebe98fe41cabdfee2ac28a52a8e37" source = "git+https://github.com/girlbossceo/ruwuma?rev=f485a0265c67a59df75fc6686787538172fa4cac#f485a0265c67a59df75fc6686787538172fa4cac"
dependencies = [ dependencies = [
"as_variant", "as_variant",
"base64 0.22.1", "base64 0.22.1",
@ -3063,7 +3063,7 @@ dependencies = [
[[package]] [[package]]
name = "ruma-events" name = "ruma-events"
version = "0.28.1" version = "0.28.1"
source = "git+https://github.com/girlbossceo/ruwuma?rev=e81ed2741b4ebe98fe41cabdfee2ac28a52a8e37#e81ed2741b4ebe98fe41cabdfee2ac28a52a8e37" source = "git+https://github.com/girlbossceo/ruwuma?rev=f485a0265c67a59df75fc6686787538172fa4cac#f485a0265c67a59df75fc6686787538172fa4cac"
dependencies = [ dependencies = [
"as_variant", "as_variant",
"indexmap 2.6.0", "indexmap 2.6.0",
@ -3087,7 +3087,7 @@ dependencies = [
[[package]] [[package]]
name = "ruma-federation-api" name = "ruma-federation-api"
version = "0.9.0" version = "0.9.0"
source = "git+https://github.com/girlbossceo/ruwuma?rev=e81ed2741b4ebe98fe41cabdfee2ac28a52a8e37#e81ed2741b4ebe98fe41cabdfee2ac28a52a8e37" source = "git+https://github.com/girlbossceo/ruwuma?rev=f485a0265c67a59df75fc6686787538172fa4cac#f485a0265c67a59df75fc6686787538172fa4cac"
dependencies = [ dependencies = [
"bytes", "bytes",
"http", "http",
@ -3105,7 +3105,7 @@ dependencies = [
[[package]] [[package]]
name = "ruma-identifiers-validation" name = "ruma-identifiers-validation"
version = "0.9.5" version = "0.9.5"
source = "git+https://github.com/girlbossceo/ruwuma?rev=e81ed2741b4ebe98fe41cabdfee2ac28a52a8e37#e81ed2741b4ebe98fe41cabdfee2ac28a52a8e37" source = "git+https://github.com/girlbossceo/ruwuma?rev=f485a0265c67a59df75fc6686787538172fa4cac#f485a0265c67a59df75fc6686787538172fa4cac"
dependencies = [ dependencies = [
"js_int", "js_int",
"thiserror", "thiserror",
@ -3114,7 +3114,7 @@ dependencies = [
[[package]] [[package]]
name = "ruma-identity-service-api" name = "ruma-identity-service-api"
version = "0.9.0" version = "0.9.0"
source = "git+https://github.com/girlbossceo/ruwuma?rev=e81ed2741b4ebe98fe41cabdfee2ac28a52a8e37#e81ed2741b4ebe98fe41cabdfee2ac28a52a8e37" source = "git+https://github.com/girlbossceo/ruwuma?rev=f485a0265c67a59df75fc6686787538172fa4cac#f485a0265c67a59df75fc6686787538172fa4cac"
dependencies = [ dependencies = [
"js_int", "js_int",
"ruma-common", "ruma-common",
@ -3124,7 +3124,7 @@ dependencies = [
[[package]] [[package]]
name = "ruma-macros" name = "ruma-macros"
version = "0.13.0" version = "0.13.0"
source = "git+https://github.com/girlbossceo/ruwuma?rev=e81ed2741b4ebe98fe41cabdfee2ac28a52a8e37#e81ed2741b4ebe98fe41cabdfee2ac28a52a8e37" source = "git+https://github.com/girlbossceo/ruwuma?rev=f485a0265c67a59df75fc6686787538172fa4cac#f485a0265c67a59df75fc6686787538172fa4cac"
dependencies = [ dependencies = [
"cfg-if", "cfg-if",
"once_cell", "once_cell",
@ -3140,7 +3140,7 @@ dependencies = [
[[package]] [[package]]
name = "ruma-push-gateway-api" name = "ruma-push-gateway-api"
version = "0.9.0" version = "0.9.0"
source = "git+https://github.com/girlbossceo/ruwuma?rev=e81ed2741b4ebe98fe41cabdfee2ac28a52a8e37#e81ed2741b4ebe98fe41cabdfee2ac28a52a8e37" source = "git+https://github.com/girlbossceo/ruwuma?rev=f485a0265c67a59df75fc6686787538172fa4cac#f485a0265c67a59df75fc6686787538172fa4cac"
dependencies = [ dependencies = [
"js_int", "js_int",
"ruma-common", "ruma-common",
@ -3152,7 +3152,7 @@ dependencies = [
[[package]] [[package]]
name = "ruma-server-util" name = "ruma-server-util"
version = "0.3.0" version = "0.3.0"
source = "git+https://github.com/girlbossceo/ruwuma?rev=e81ed2741b4ebe98fe41cabdfee2ac28a52a8e37#e81ed2741b4ebe98fe41cabdfee2ac28a52a8e37" source = "git+https://github.com/girlbossceo/ruwuma?rev=f485a0265c67a59df75fc6686787538172fa4cac#f485a0265c67a59df75fc6686787538172fa4cac"
dependencies = [ dependencies = [
"headers", "headers",
"http", "http",
@ -3165,7 +3165,7 @@ dependencies = [
[[package]] [[package]]
name = "ruma-signatures" name = "ruma-signatures"
version = "0.15.0" version = "0.15.0"
source = "git+https://github.com/girlbossceo/ruwuma?rev=e81ed2741b4ebe98fe41cabdfee2ac28a52a8e37#e81ed2741b4ebe98fe41cabdfee2ac28a52a8e37" source = "git+https://github.com/girlbossceo/ruwuma?rev=f485a0265c67a59df75fc6686787538172fa4cac#f485a0265c67a59df75fc6686787538172fa4cac"
dependencies = [ dependencies = [
"base64 0.22.1", "base64 0.22.1",
"ed25519-dalek", "ed25519-dalek",
@ -3181,7 +3181,7 @@ dependencies = [
[[package]] [[package]]
name = "ruma-state-res" name = "ruma-state-res"
version = "0.11.0" version = "0.11.0"
source = "git+https://github.com/girlbossceo/ruwuma?rev=e81ed2741b4ebe98fe41cabdfee2ac28a52a8e37#e81ed2741b4ebe98fe41cabdfee2ac28a52a8e37" source = "git+https://github.com/girlbossceo/ruwuma?rev=f485a0265c67a59df75fc6686787538172fa4cac#f485a0265c67a59df75fc6686787538172fa4cac"
dependencies = [ dependencies = [
"futures-util", "futures-util",
"itertools 0.13.0", "itertools 0.13.0",

View file

@ -315,7 +315,7 @@ version = "0.1.2"
[workspace.dependencies.ruma] [workspace.dependencies.ruma]
git = "https://github.com/girlbossceo/ruwuma" git = "https://github.com/girlbossceo/ruwuma"
#branch = "conduwuit-changes" #branch = "conduwuit-changes"
rev = "e81ed2741b4ebe98fe41cabdfee2ac28a52a8e37" rev = "f485a0265c67a59df75fc6686787538172fa4cac"
features = [ features = [
"compat", "compat",
"rand", "rand",

View file

@ -183,10 +183,8 @@ pub(crate) async fn join_room_by_id_route(
.await .await
.unwrap_or_default() .unwrap_or_default()
.iter() .iter()
.filter_map(|event| serde_json::from_str(event.json().get()).ok()) .filter_map(|event| event.get_field("sender").ok().flatten())
.filter_map(|event: serde_json::Value| event.get("sender").cloned()) .filter_map(|sender: &str| UserId::parse(sender).ok())
.filter_map(|sender| sender.as_str().map(ToOwned::to_owned))
.filter_map(|sender| UserId::parse(sender).ok())
.map(|user| user.server_name().to_owned()), .map(|user| user.server_name().to_owned()),
); );
@ -248,10 +246,8 @@ pub(crate) async fn join_room_by_id_or_alias_route(
.await .await
.unwrap_or_default() .unwrap_or_default()
.iter() .iter()
.filter_map(|event| serde_json::from_str(event.json().get()).ok()) .filter_map(|event| event.get_field("sender").ok().flatten())
.filter_map(|event: serde_json::Value| event.get("sender").cloned()) .filter_map(|sender: &str| UserId::parse(sender).ok())
.filter_map(|sender| sender.as_str().map(ToOwned::to_owned))
.filter_map(|sender| UserId::parse(sender).ok())
.map(|user| user.server_name().to_owned()), .map(|user| user.server_name().to_owned()),
); );
@ -294,10 +290,8 @@ pub(crate) async fn join_room_by_id_or_alias_route(
.await .await
.unwrap_or_default() .unwrap_or_default()
.iter() .iter()
.filter_map(|event| serde_json::from_str(event.json().get()).ok()) .filter_map(|event| event.get_field("sender").ok().flatten())
.filter_map(|event: serde_json::Value| event.get("sender").cloned()) .filter_map(|sender: &str| UserId::parse(sender).ok())
.filter_map(|sender| sender.as_str().map(ToOwned::to_owned))
.filter_map(|sender| UserId::parse(sender).ok())
.map(|user| user.server_name().to_owned()), .map(|user| user.server_name().to_owned()),
); );
@ -1708,10 +1702,8 @@ async fn remote_leave_room(services: &Services, user_id: &UserId, room_id: &Room
servers.extend( servers.extend(
invite_state invite_state
.iter() .iter()
.filter_map(|event| serde_json::from_str(event.json().get()).ok()) .filter_map(|event| event.get_field("sender").ok().flatten())
.filter_map(|event: serde_json::Value| event.get("sender").cloned()) .filter_map(|sender: &str| UserId::parse(sender).ok())
.filter_map(|sender| sender.as_str().map(ToOwned::to_owned))
.filter_map(|sender| UserId::parse(sender).ok())
.map(|user| user.server_name().to_owned()), .map(|user| user.server_name().to_owned()),
); );

View file

@ -1,7 +1,7 @@
use std::sync::Arc; use std::sync::Arc;
use axum::extract::State; use axum::extract::State;
use conduit::{err, error, pdu::PduBuilder, Err, Error, Result}; use conduit::{err, pdu::PduBuilder, utils::BoolExt, Err, Error, Result};
use ruma::{ use ruma::{
api::client::{ api::client::{
error::ErrorKind, error::ErrorKind,
@ -137,27 +137,15 @@ pub(crate) async fn get_state_events_for_key_route(
)))) ))))
})?; })?;
if body let event_format = body
.format .format
.as_ref() .as_ref()
.is_some_and(|f| f.to_lowercase().eq("event")) .is_some_and(|f| f.to_lowercase().eq("event"));
{
Ok(get_state_events_for_key::v3::Response { Ok(get_state_events_for_key::v3::Response {
content: None, content: event_format.or(|| event.get_content_as_value()),
event: serde_json::from_str(event.to_state_event().json().get()).map_err(|e| { event: event_format.then(|| event.to_state_event_value()),
error!("Invalid room state event in database: {}", e);
Error::bad_database("Invalid room state event in database")
})?,
}) })
} else {
Ok(get_state_events_for_key::v3::Response {
content: Some(serde_json::from_str(event.content.get()).map_err(|e| {
error!("Invalid room state event content in database: {}", e);
Error::bad_database("Invalid room state event content in database")
})?),
event: None,
})
}
} }
/// # `GET /_matrix/client/v3/rooms/{roomid}/state/{eventType}` /// # `GET /_matrix/client/v3/rooms/{roomid}/state/{eventType}`

View file

@ -2,7 +2,7 @@ use axum::extract::State;
use conduit::{Error, Result}; use conduit::{Error, Result};
use ruma::{ use ruma::{
api::{client::error::ErrorKind, federation::event::get_missing_events}, api::{client::error::ErrorKind, federation::event::get_missing_events},
OwnedEventId, RoomId, CanonicalJsonValue, EventId, RoomId,
}; };
use crate::Ruma; use crate::Ruma;
@ -78,17 +78,19 @@ pub(crate) async fn get_missing_events_route(
continue; continue;
} }
queued_events.extend_from_slice( let prev_events = pdu
&serde_json::from_value::<Vec<OwnedEventId>>( .get("prev_events")
serde_json::to_value( .and_then(CanonicalJsonValue::as_array)
pdu.get("prev_events") .unwrap_or_default();
.cloned()
.ok_or_else(|| Error::bad_database("Event in db has no prev_events property."))?, queued_events.extend(
) prev_events
.expect("canonical json is valid json value"), .iter()
) .map(<&EventId>::try_from)
.map_err(|_| Error::bad_database("Invalid prev_events in event in database."))?, .filter_map(Result::ok)
.map(ToOwned::to_owned),
); );
events.push( events.push(
services services
.sending .sending

View file

@ -1,11 +1,11 @@
use axum::extract::State; use axum::extract::State;
use axum_client_ip::InsecureClientIp; use axum_client_ip::InsecureClientIp;
use conduit::{utils, warn, Error, PduEvent, Result}; use conduit::{err, utils, warn, Err, Error, PduEvent, Result};
use ruma::{ use ruma::{
api::{client::error::ErrorKind, federation::membership::create_invite}, api::{client::error::ErrorKind, federation::membership::create_invite},
events::room::member::{MembershipState, RoomMemberEventContent}, events::room::member::{MembershipState, RoomMemberEventContent},
serde::JsonObject, serde::JsonObject,
CanonicalJsonValue, EventId, OwnedUserId, CanonicalJsonValue, EventId, OwnedUserId, UserId,
}; };
use crate::Ruma; use crate::Ruma;
@ -79,14 +79,11 @@ pub(crate) async fn create_invite_route(
let mut signed_event = utils::to_canonical_object(&body.event) let mut signed_event = utils::to_canonical_object(&body.event)
.map_err(|_| Error::BadRequest(ErrorKind::InvalidParam, "Invite event is invalid."))?; .map_err(|_| Error::BadRequest(ErrorKind::InvalidParam, "Invite event is invalid."))?;
let invited_user: OwnedUserId = serde_json::from_value( let invited_user: OwnedUserId = signed_event
signed_event
.get("state_key") .get("state_key")
.ok_or_else(|| Error::BadRequest(ErrorKind::InvalidParam, "Event has no state_key property."))? .try_into()
.clone() .map(UserId::to_owned)
.into(), .map_err(|e| err!(Request(InvalidParam("Invalid state_key property: {e}"))))?;
)
.map_err(|_| Error::BadRequest(ErrorKind::InvalidParam, "state_key is not a user ID."))?;
if !services.globals.server_is_ours(invited_user.server_name()) { if !services.globals.server_is_ours(invited_user.server_name()) {
return Err(Error::BadRequest( return Err(Error::BadRequest(
@ -121,14 +118,10 @@ pub(crate) async fn create_invite_route(
// Add event_id back // Add event_id back
signed_event.insert("event_id".to_owned(), CanonicalJsonValue::String(event_id.to_string())); signed_event.insert("event_id".to_owned(), CanonicalJsonValue::String(event_id.to_string()));
let sender: OwnedUserId = serde_json::from_value( let sender: &UserId = signed_event
signed_event
.get("sender") .get("sender")
.ok_or_else(|| Error::BadRequest(ErrorKind::InvalidParam, "Event had no sender property."))? .try_into()
.clone() .map_err(|e| err!(Request(InvalidParam("Invalid sender property: {e}"))))?;
.into(),
)
.map_err(|_| Error::BadRequest(ErrorKind::InvalidParam, "sender is not a user ID."))?;
if services.rooms.metadata.is_banned(&body.room_id).await && !services.users.is_admin(&invited_user).await { if services.rooms.metadata.is_banned(&body.room_id).await && !services.users.is_admin(&invited_user).await {
return Err(Error::BadRequest( return Err(Error::BadRequest(
@ -171,7 +164,7 @@ pub(crate) async fn create_invite_route(
&body.room_id, &body.room_id,
&invited_user, &invited_user,
RoomMemberEventContent::new(MembershipState::Invite), RoomMemberEventContent::new(MembershipState::Invite),
&sender, sender,
Some(invite_state), Some(invite_state),
body.via.clone(), body.via.clone(),
true, true,

View file

@ -30,8 +30,8 @@ use ruma::{
int, int,
serde::Base64, serde::Base64,
state_res::{self, EventTypeExt, RoomVersion, StateMap}, state_res::{self, EventTypeExt, RoomVersion, StateMap},
uint, CanonicalJsonValue, EventId, MilliSecondsSinceUnixEpoch, OwnedEventId, OwnedRoomId, OwnedUserId, RoomId, uint, CanonicalJsonValue, EventId, MilliSecondsSinceUnixEpoch, OwnedEventId, OwnedRoomId, RoomId, RoomVersionId,
RoomVersionId, ServerName, ServerName, UserId,
}; };
use tokio::sync::RwLock; use tokio::sync::RwLock;
@ -157,14 +157,10 @@ impl Service {
self.acl_check(origin, room_id).await?; self.acl_check(origin, room_id).await?;
// 1.3.2 Check room ACL on sender's server name // 1.3.2 Check room ACL on sender's server name
let sender: OwnedUserId = serde_json::from_value( let sender: &UserId = value
value
.get("sender") .get("sender")
.ok_or_else(|| Error::BadRequest(ErrorKind::InvalidParam, "PDU does not have a sender key"))? .try_into()
.clone() .map_err(|e| err!(Request(InvalidParam("PDU does not have a valid sender key: {e}"))))?;
.into(),
)
.map_err(|_| Error::BadRequest(ErrorKind::BadJson, "User ID in sender is invalid"))?;
self.acl_check(sender.server_name(), room_id).await?; self.acl_check(sender.server_name(), room_id).await?;

View file

@ -9,6 +9,7 @@ use std::{
use conduit::{ use conduit::{
err, err,
result::FlatOk,
utils::{calculate_hash, stream::TryIgnore, IterStream, MutexMap, MutexMapGuard}, utils::{calculate_hash, stream::TryIgnore, IterStream, MutexMap, MutexMapGuard},
warn, PduEvent, Result, warn, PduEvent, Result,
}; };

View file

@ -528,13 +528,9 @@ impl Service {
for pdu in pdus { for pdu in pdus {
// Redacted events are not notification targets (we don't send push for them) // Redacted events are not notification targets (we don't send push for them)
if let Some(unsigned) = &pdu.unsigned { if pdu.contains_unsigned_property("redacted_because", serde_json::Value::is_string) {
if let Ok(unsigned) = serde_json::from_str::<serde_json::Value>(unsigned.get()) {
if unsigned.get("redacted_because").is_some() {
continue; continue;
} }
}
}
let rules_for_user = self let rules_for_user = self
.services .services