Do not show "Invalid room version" errors when server is not in room

This commit is contained in:
Timo Kösters 2023-08-11 10:48:48 +02:00
parent 0c2cfda3ae
commit 11103a92ed
No known key found for this signature in database
GPG key ID: 0B25E636FBA7E4CB
4 changed files with 26 additions and 12 deletions

2
Cargo.lock generated
View file

@ -363,7 +363,7 @@ checksum = "3d7b894f5411737b7867f4827955924d7c254fc9f4d91a6aad6b097804b1018b"
[[package]] [[package]]
name = "conduit" name = "conduit"
version = "0.6.0" version = "0.7.0-alpha"
dependencies = [ dependencies = [
"async-trait", "async-trait",
"axum", "axum",

View file

@ -6,7 +6,7 @@ authors = ["timokoesters <timo@koesters.xyz>"]
homepage = "https://conduit.rs" homepage = "https://conduit.rs"
repository = "https://gitlab.com/famedly/conduit" repository = "https://gitlab.com/famedly/conduit"
readme = "README.md" readme = "README.md"
version = "0.6.0" version = "0.7.0-alpha"
edition = "2021" edition = "2021"
# When changing this, make sure to update the `flake.lock` file by running # When changing this, make sure to update the `flake.lock` file by running

View file

@ -55,7 +55,7 @@ use std::{
time::{Duration, Instant, SystemTime}, time::{Duration, Instant, SystemTime},
}; };
use tracing::{debug, error, warn}; use tracing::{debug, error, trace, warn};
/// Wraps either an literal IP address plus port, or a hostname plus complement /// Wraps either an literal IP address plus port, or a hostname plus complement
/// (colon-plus-port if it was specified). /// (colon-plus-port if it was specified).
@ -707,6 +707,23 @@ pub async fn send_transaction_message_route(
// let mut auth_cache = EventMap::new(); // let mut auth_cache = EventMap::new();
for pdu in &body.pdus { for pdu in &body.pdus {
let value: CanonicalJsonObject = serde_json::from_str(pdu.get()).map_err(|e| {
warn!("Error parsing incoming event {:?}: {:?}", pdu, e);
Error::BadServerResponse("Invalid PDU in server response")
})?;
let room_id: OwnedRoomId = value
.get("room_id")
.and_then(|id| RoomId::parse(id.as_str()?).ok())
.ok_or(Error::BadRequest(
ErrorKind::InvalidParam,
"Invalid room id in pdu",
))?;
if services().rooms.state.get_room_version(&room_id).is_err() {
debug!("Server is not in room {room_id}");
continue;
}
let r = parse_incoming_pdu(&pdu); let r = parse_incoming_pdu(&pdu);
let (event_id, value, room_id) = match r { let (event_id, value, room_id) = match r {
Ok(t) => t, Ok(t) => t,

View file

@ -6,6 +6,7 @@ use std::{
pub use data::Data; pub use data::Data;
use ruma::{ use ruma::{
api::client::error::ErrorKind,
events::{ events::{
room::{create::RoomCreateEventContent, member::MembershipState}, room::{create::RoomCreateEventContent, member::MembershipState},
AnyStrippedStateEvent, StateEventType, TimelineEventType, AnyStrippedStateEvent, StateEventType, TimelineEventType,
@ -331,7 +332,7 @@ impl Service {
"", "",
)?; )?;
let create_event_content: Option<RoomCreateEventContent> = create_event let create_event_content: RoomCreateEventContent = create_event
.as_ref() .as_ref()
.map(|create_event| { .map(|create_event| {
serde_json::from_str(create_event.content.get()).map_err(|e| { serde_json::from_str(create_event.content.get()).map_err(|e| {
@ -339,14 +340,10 @@ impl Service {
Error::bad_database("Invalid create event in db.") Error::bad_database("Invalid create event in db.")
}) })
}) })
.transpose()?; .transpose()?
let room_version = create_event_content .ok_or_else(|| Error::BadRequest(ErrorKind::InvalidParam, "No create event found"))?;
.map(|create_event| create_event.room_version)
.ok_or_else(|| { Ok(create_event_content.room_version)
warn!("Invalid room version for room {room_id}");
Error::BadDatabase("Invalid room version")
})?;
Ok(room_version)
} }
pub fn get_room_shortstatehash(&self, room_id: &RoomId) -> Result<Option<u64>> { pub fn get_room_shortstatehash(&self, room_id: &RoomId) -> Result<Option<u64>> {