Remove StateStore trait from state-res collect events needed
parent
cdeb1236a2
commit
8de0d9f9ce
|
@ -231,9 +231,9 @@ dependencies = [
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "const_fn"
|
name = "const_fn"
|
||||||
version = "0.4.4"
|
version = "0.4.5"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "cd51eab21ab4fd6a3bf889e2d0958c0a6e3a61ad04260325e919e652a2a62826"
|
checksum = "28b9d6de7f49e22cf97ad17fc4036ece69300032f45f78f30b4a4482cdc3f4a6"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "constant_time_eq"
|
name = "constant_time_eq"
|
||||||
|
@ -558,7 +558,7 @@ dependencies = [
|
||||||
"futures-sink",
|
"futures-sink",
|
||||||
"futures-task",
|
"futures-task",
|
||||||
"memchr",
|
"memchr",
|
||||||
"pin-project 1.0.2",
|
"pin-project 1.0.3",
|
||||||
"pin-utils",
|
"pin-utils",
|
||||||
"proc-macro-hack",
|
"proc-macro-hack",
|
||||||
"proc-macro-nested",
|
"proc-macro-nested",
|
||||||
|
@ -587,13 +587,13 @@ dependencies = [
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "getrandom"
|
name = "getrandom"
|
||||||
version = "0.2.0"
|
version = "0.2.1"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "ee8025cf36f917e6a52cce185b7c7177689b838b7ec138364e50cc2277a56cf4"
|
checksum = "4060f4657be78b8e766215b02b18a2e862d83745545de804638e2b545e81aee6"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"cfg-if 0.1.10",
|
"cfg-if 1.0.0",
|
||||||
"libc",
|
"libc",
|
||||||
"wasi",
|
"wasi 0.10.0+wasi-snapshot-preview1",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
|
@ -722,7 +722,7 @@ dependencies = [
|
||||||
"httparse",
|
"httparse",
|
||||||
"httpdate",
|
"httpdate",
|
||||||
"itoa",
|
"itoa",
|
||||||
"pin-project 1.0.2",
|
"pin-project 1.0.3",
|
||||||
"socket2",
|
"socket2",
|
||||||
"tokio",
|
"tokio",
|
||||||
"tower-service",
|
"tower-service",
|
||||||
|
@ -1272,11 +1272,11 @@ dependencies = [
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "pin-project"
|
name = "pin-project"
|
||||||
version = "1.0.2"
|
version = "1.0.3"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "9ccc2237c2c489783abd8c4c80e5450fc0e98644555b1364da68cc29aa151ca7"
|
checksum = "5a83804639aad6ba65345661744708855f9fbcb71176ea8d28d05aeb11d975e7"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"pin-project-internal 1.0.2",
|
"pin-project-internal 1.0.3",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
|
@ -1292,9 +1292,9 @@ dependencies = [
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "pin-project-internal"
|
name = "pin-project-internal"
|
||||||
version = "1.0.2"
|
version = "1.0.3"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "f8e8d2bf0b23038a4424865103a4df472855692821aab4e4f5c3312d461d9e5f"
|
checksum = "b7bcc46b8f73443d15bc1c5fecbb315718491fa9187fa483f0e359323cde8b3a"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"proc-macro2",
|
"proc-macro2",
|
||||||
"quote",
|
"quote",
|
||||||
|
@ -1309,9 +1309,9 @@ checksum = "c917123afa01924fc84bb20c4c03f004d9c38e5127e3c039bbf7f4b9c76a2f6b"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "pin-project-lite"
|
name = "pin-project-lite"
|
||||||
version = "0.2.0"
|
version = "0.2.1"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "6b063f57ec186e6140e2b8b6921e5f1bd89c7356dda5b33acc5401203ca6131c"
|
checksum = "e36743d754ccdf9954c2e352ce2d4b106e024c814f6499c2dadff80da9a442d8"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "pin-utils"
|
name = "pin-utils"
|
||||||
|
@ -1416,13 +1416,13 @@ dependencies = [
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "rand"
|
name = "rand"
|
||||||
version = "0.8.0"
|
version = "0.8.1"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "a76330fb486679b4ace3670f117bbc9e16204005c4bde9c4bd372f45bed34f12"
|
checksum = "c24fcd450d3fa2b592732565aa4f17a27a61c65ece4726353e000939b0edee34"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"libc",
|
"libc",
|
||||||
"rand_chacha 0.3.0",
|
"rand_chacha 0.3.0",
|
||||||
"rand_core 0.6.0",
|
"rand_core 0.6.1",
|
||||||
"rand_hc 0.3.0",
|
"rand_hc 0.3.0",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
@ -1443,7 +1443,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "e12735cf05c9e10bf21534da50a147b924d555dc7a547c42e6bb2d5b6017ae0d"
|
checksum = "e12735cf05c9e10bf21534da50a147b924d555dc7a547c42e6bb2d5b6017ae0d"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"ppv-lite86",
|
"ppv-lite86",
|
||||||
"rand_core 0.6.0",
|
"rand_core 0.6.1",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
|
@ -1457,11 +1457,11 @@ dependencies = [
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "rand_core"
|
name = "rand_core"
|
||||||
version = "0.6.0"
|
version = "0.6.1"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "a8b34ba8cfb21243bd8df91854c830ff0d785fff2e82ebd4434c2644cb9ada18"
|
checksum = "c026d7df8b298d90ccbbc5190bd04d85e159eaf5576caeacf8741da93ccbd2e5"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"getrandom 0.2.0",
|
"getrandom 0.2.1",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
|
@ -1479,7 +1479,7 @@ version = "0.3.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "3190ef7066a446f2e7f42e239d161e905420ccab01eb967c9eb27d21b2322a73"
|
checksum = "3190ef7066a446f2e7f42e239d161e905420ccab01eb967c9eb27d21b2322a73"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"rand_core 0.6.0",
|
"rand_core 0.6.1",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
|
@ -1569,7 +1569,7 @@ dependencies = [
|
||||||
"mime_guess",
|
"mime_guess",
|
||||||
"native-tls",
|
"native-tls",
|
||||||
"percent-encoding",
|
"percent-encoding",
|
||||||
"pin-project-lite 0.2.0",
|
"pin-project-lite 0.2.1",
|
||||||
"serde",
|
"serde",
|
||||||
"serde_urlencoded",
|
"serde_urlencoded",
|
||||||
"tokio",
|
"tokio",
|
||||||
|
@ -1809,7 +1809,7 @@ version = "0.17.4"
|
||||||
source = "git+https://github.com/ruma/ruma?rev=210b6dd823ba89c5a44c3c9d913d377c4b54c896#210b6dd823ba89c5a44c3c9d913d377c4b54c896"
|
source = "git+https://github.com/ruma/ruma?rev=210b6dd823ba89c5a44c3c9d913d377c4b54c896#210b6dd823ba89c5a44c3c9d913d377c4b54c896"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"paste",
|
"paste",
|
||||||
"rand 0.8.0",
|
"rand 0.8.1",
|
||||||
"ruma-identifiers-macros",
|
"ruma-identifiers-macros",
|
||||||
"ruma-identifiers-validation",
|
"ruma-identifiers-validation",
|
||||||
"ruma-serde",
|
"ruma-serde",
|
||||||
|
@ -2028,9 +2028,9 @@ dependencies = [
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "serde_yaml"
|
name = "serde_yaml"
|
||||||
version = "0.8.14"
|
version = "0.8.15"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "f7baae0a99f1a324984bcdc5f0718384c1f69775f1c7eec8b859b71b443e3fd7"
|
checksum = "971be8f6e4d4a47163b405a3df70d14359186f9ab0f3a3ec37df144ca1ce089f"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"dtoa",
|
"dtoa",
|
||||||
"linked-hash-map",
|
"linked-hash-map",
|
||||||
|
@ -2127,7 +2127,7 @@ checksum = "3015a7d0a5fd5105c91c3710d42f9ccf0abfb287d62206484dcc67f9569a6483"
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "state-res"
|
name = "state-res"
|
||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
source = "git+https://github.com/ruma/state-res?branch=event-trait#e5d32e44adb66c5932a81d2c8a8d840abd17c870"
|
source = "git+https://github.com/ruma/state-res?branch=no-db#d31c88408e7f69f5b0f18141efeaefff6b83637f"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"itertools",
|
"itertools",
|
||||||
"maplit",
|
"maplit",
|
||||||
|
@ -2189,9 +2189,9 @@ checksum = "213701ba3370744dcd1a12960caa4843b3d68b4d1c0a5d575e0d65b2ee9d16c0"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "syn"
|
name = "syn"
|
||||||
version = "1.0.57"
|
version = "1.0.58"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "4211ce9909eb971f111059df92c45640aad50a619cf55cd76476be803c4c68e6"
|
checksum = "cc60a3d73ea6594cd712d830cc1f0390fd71542d8c8cd24e70cc54cdfd5e05d5"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"proc-macro2",
|
"proc-macro2",
|
||||||
"quote",
|
"quote",
|
||||||
|
@ -2398,7 +2398,7 @@ checksum = "9f47026cdc4080c07e49b37087de021820269d996f581aac150ef9e5583eefe3"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"cfg-if 1.0.0",
|
"cfg-if 1.0.0",
|
||||||
"log",
|
"log",
|
||||||
"pin-project-lite 0.2.0",
|
"pin-project-lite 0.2.1",
|
||||||
"tracing-attributes",
|
"tracing-attributes",
|
||||||
"tracing-core",
|
"tracing-core",
|
||||||
]
|
]
|
||||||
|
|
|
@ -25,7 +25,7 @@ ruma = { git = "https://github.com/ruma/ruma", features = ["rand", "client-api",
|
||||||
# Used when doing state resolution
|
# Used when doing state resolution
|
||||||
# state-res = { git = "https://github.com/timokoesters/state-res", branch = "timo-spec-comp", features = ["unstable-pre-spec"] }
|
# state-res = { git = "https://github.com/timokoesters/state-res", branch = "timo-spec-comp", features = ["unstable-pre-spec"] }
|
||||||
# TODO: remove the gen-eventid feature
|
# TODO: remove the gen-eventid feature
|
||||||
state-res = { git = "https://github.com/ruma/state-res", branch = "event-trait", features = ["unstable-pre-spec", "gen-eventid"] }
|
state-res = { git = "https://github.com/ruma/state-res", branch = "no-db", features = ["unstable-pre-spec", "gen-eventid"] }
|
||||||
# state-res = { path = "../../state-res", features = ["unstable-pre-spec", "gen-eventid"] }
|
# state-res = { path = "../../state-res", features = ["unstable-pre-spec", "gen-eventid"] }
|
||||||
|
|
||||||
# Used for long polling and federation sender, should be the same as rocket::tokio
|
# Used for long polling and federation sender, should be the same as rocket::tokio
|
||||||
|
|
|
@ -618,7 +618,6 @@ async fn join_room_by_id_helper(
|
||||||
&room_id,
|
&room_id,
|
||||||
&control_events,
|
&control_events,
|
||||||
&mut event_map,
|
&mut event_map,
|
||||||
&db.rooms,
|
|
||||||
&event_ids,
|
&event_ids,
|
||||||
);
|
);
|
||||||
|
|
||||||
|
@ -629,7 +628,6 @@ async fn join_room_by_id_helper(
|
||||||
&sorted_control_events,
|
&sorted_control_events,
|
||||||
&BTreeMap::new(), // We have no "clean/resolved" events to add (these extend the `resolved_control_events`)
|
&BTreeMap::new(), // We have no "clean/resolved" events to add (these extend the `resolved_control_events`)
|
||||||
&mut event_map,
|
&mut event_map,
|
||||||
&db.rooms,
|
|
||||||
)
|
)
|
||||||
.expect("iterative auth check failed on resolved events");
|
.expect("iterative auth check failed on resolved events");
|
||||||
|
|
||||||
|
@ -654,7 +652,6 @@ async fn join_room_by_id_helper(
|
||||||
&events_to_sort,
|
&events_to_sort,
|
||||||
power_level,
|
power_level,
|
||||||
&mut event_map,
|
&mut event_map,
|
||||||
&db.rooms,
|
|
||||||
);
|
);
|
||||||
|
|
||||||
let resolved_events = state_res::StateResolution::iterative_auth_check(
|
let resolved_events = state_res::StateResolution::iterative_auth_check(
|
||||||
|
@ -663,7 +660,6 @@ async fn join_room_by_id_helper(
|
||||||
&sorted_event_ids,
|
&sorted_event_ids,
|
||||||
&resolved_control_events,
|
&resolved_control_events,
|
||||||
&mut event_map,
|
&mut event_map,
|
||||||
&db.rooms,
|
|
||||||
)
|
)
|
||||||
.expect("iterative auth check failed on resolved events");
|
.expect("iterative auth check failed on resolved events");
|
||||||
|
|
||||||
|
|
|
@ -67,40 +67,6 @@ pub struct Rooms {
|
||||||
pub(super) stateid_pduid: sled::Tree, // StateId = StateHash + Short, PduId = Count (without roomid)
|
pub(super) stateid_pduid: sled::Tree, // StateId = StateHash + Short, PduId = Count (without roomid)
|
||||||
}
|
}
|
||||||
|
|
||||||
impl StateStore<PduEvent> for Rooms {
|
|
||||||
fn get_event(&self, room_id: &RoomId, event_id: &EventId) -> state_res::Result<Arc<PduEvent>> {
|
|
||||||
let pid = self
|
|
||||||
.get_pdu_id(event_id)
|
|
||||||
.map_err(StateError::custom)?
|
|
||||||
.ok_or_else(|| {
|
|
||||||
StateError::NotFound(format!(
|
|
||||||
"PDU via room_id and event_id not found in the db: {}",
|
|
||||||
event_id.as_str()
|
|
||||||
))
|
|
||||||
})?;
|
|
||||||
|
|
||||||
serde_json::from_slice(
|
|
||||||
&self
|
|
||||||
.pduid_pdu
|
|
||||||
.get(pid)
|
|
||||||
.map_err(StateError::custom)?
|
|
||||||
.ok_or_else(|| StateError::NotFound("PDU via pduid not found in db.".into()))?,
|
|
||||||
)
|
|
||||||
.map_err(Into::into)
|
|
||||||
.and_then(|pdu: PduEvent| {
|
|
||||||
// conduit's PDU's always contain a room_id but some
|
|
||||||
// of ruma's do not so this must be an Option
|
|
||||||
if pdu.room_id() == room_id {
|
|
||||||
Ok(Arc::new(pdu))
|
|
||||||
} else {
|
|
||||||
Err(StateError::NotFound(
|
|
||||||
"Found PDU for incorrect room in db.".into(),
|
|
||||||
))
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl Rooms {
|
impl Rooms {
|
||||||
/// Builds a StateMap by iterating over all keys that start
|
/// Builds a StateMap by iterating over all keys that start
|
||||||
/// with state_hash, this gives the full state for the given state_hash.
|
/// with state_hash, this gives the full state for the given state_hash.
|
||||||
|
@ -222,6 +188,72 @@ impl Rooms {
|
||||||
Ok(events)
|
Ok(events)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Returns a Vec of the related auth events to the given `event`.
|
||||||
|
///
|
||||||
|
/// A recursive list of all the auth_events going back to `RoomCreate` for each event in `event_ids`.
|
||||||
|
pub fn auth_events_full(
|
||||||
|
&self,
|
||||||
|
room_id: &RoomId,
|
||||||
|
event_ids: &[EventId],
|
||||||
|
) -> Result<Vec<PduEvent>> {
|
||||||
|
let mut result = BTreeMap::new();
|
||||||
|
let mut stack = event_ids.to_vec();
|
||||||
|
|
||||||
|
// DFS for auth event chain
|
||||||
|
while !stack.is_empty() {
|
||||||
|
let ev_id = stack.pop().unwrap();
|
||||||
|
if result.contains_key(&ev_id) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if let Some(ev) = self.get_pdu(&ev_id)? {
|
||||||
|
stack.extend(ev.auth_events());
|
||||||
|
result.insert(ev.event_id().clone(), ev);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Ok(result.into_iter().map(|(_, v)| v).collect())
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Returns a Vec<EventId> representing the difference in auth chains of the given `events`.
|
||||||
|
///
|
||||||
|
/// Each inner `Vec` of `event_ids` represents a state set (state at each forward extremity).
|
||||||
|
pub fn auth_chain_diff(
|
||||||
|
&self,
|
||||||
|
room_id: &RoomId,
|
||||||
|
event_ids: Vec<Vec<EventId>>,
|
||||||
|
) -> Result<Vec<EventId>> {
|
||||||
|
use std::collections::BTreeSet;
|
||||||
|
|
||||||
|
let mut chains = vec![];
|
||||||
|
for ids in event_ids {
|
||||||
|
// TODO state store `auth_event_ids` returns self in the event ids list
|
||||||
|
// when an event returns `auth_event_ids` self is not contained
|
||||||
|
let chain = self
|
||||||
|
.auth_events_full(room_id, &ids)?
|
||||||
|
.into_iter()
|
||||||
|
.map(|pdu| pdu.event_id)
|
||||||
|
.collect::<BTreeSet<_>>();
|
||||||
|
chains.push(chain);
|
||||||
|
}
|
||||||
|
|
||||||
|
if let Some(chain) = chains.first() {
|
||||||
|
let rest = chains.iter().skip(1).flatten().cloned().collect();
|
||||||
|
let common = chain.intersection(&rest).collect::<Vec<_>>();
|
||||||
|
|
||||||
|
Ok(chains
|
||||||
|
.iter()
|
||||||
|
.flatten()
|
||||||
|
.filter(|id| !common.contains(&id))
|
||||||
|
.cloned()
|
||||||
|
.collect::<BTreeSet<_>>()
|
||||||
|
.into_iter()
|
||||||
|
.collect())
|
||||||
|
} else {
|
||||||
|
Ok(vec![])
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// Generate a new StateHash.
|
/// Generate a new StateHash.
|
||||||
///
|
///
|
||||||
/// A unique hash made from hashing all PDU ids of the state joined with 0xff.
|
/// A unique hash made from hashing all PDU ids of the state joined with 0xff.
|
||||||
|
|
|
@ -603,7 +603,7 @@ pub async fn send_transaction_message_route<'a>(
|
||||||
};
|
};
|
||||||
|
|
||||||
// 4. Passes authorization rules based on the event's auth events, otherwise it is rejected.
|
// 4. Passes authorization rules based on the event's auth events, otherwise it is rejected.
|
||||||
// TODO: To me this sounds more like the auth_events should be get the pdu.auth_events not
|
// TODO: To me this sounds more like the auth_events should be "get the pdu.auth_events" not
|
||||||
// the auth events that would be correct for this pdu. Put another way we should use the auth events
|
// the auth events that would be correct for this pdu. Put another way we should use the auth events
|
||||||
// the pdu claims are its auth events
|
// the pdu claims are its auth events
|
||||||
let auth_events = db.rooms.get_auth_events(
|
let auth_events = db.rooms.get_auth_events(
|
||||||
|
@ -637,50 +637,56 @@ pub async fn send_transaction_message_route<'a>(
|
||||||
);
|
);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
// End of step 4.
|
||||||
|
|
||||||
let (state_at_event, incoming_auth_events): (StateMap<Arc<PduEvent>>, _) = match db
|
// Step 5. event passes auth based on state at the event
|
||||||
.sending
|
let (state_at_event, incoming_auth_events): (StateMap<Arc<PduEvent>>, Vec<Arc<PduEvent>>) =
|
||||||
.send_federation_request(
|
match db
|
||||||
&db.globals,
|
.sending
|
||||||
server_name.clone(),
|
.send_federation_request(
|
||||||
get_room_state_ids::v1::Request {
|
&db.globals,
|
||||||
room_id: pdu.room_id(),
|
server_name.clone(),
|
||||||
event_id: pdu.event_id(),
|
get_room_state_ids::v1::Request {
|
||||||
},
|
room_id: pdu.room_id(),
|
||||||
)
|
event_id: pdu.event_id(),
|
||||||
.await
|
},
|
||||||
{
|
|
||||||
Ok(res) => {
|
|
||||||
let state =
|
|
||||||
fetch_events(&db, server_name.clone(), &pub_key_map, &res.pdu_ids).await?;
|
|
||||||
// Sanity check: there are no conflicting events in the state we received
|
|
||||||
let mut seen = BTreeSet::new();
|
|
||||||
for ev in &state {
|
|
||||||
// If the key is already present
|
|
||||||
if !seen.insert((&ev.kind, &ev.state_key)) {
|
|
||||||
todo!("Server sent us an invalid state")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
let state = state
|
|
||||||
.into_iter()
|
|
||||||
.map(|pdu| ((pdu.kind.clone(), pdu.state_key.clone()), Arc::new(pdu)))
|
|
||||||
.collect();
|
|
||||||
|
|
||||||
(
|
|
||||||
state,
|
|
||||||
fetch_events(&db, server_name.clone(), &pub_key_map, &res.auth_chain_ids)
|
|
||||||
.await?,
|
|
||||||
)
|
)
|
||||||
}
|
.await
|
||||||
Err(_) => {
|
{
|
||||||
resolved_map.insert(
|
Ok(res) => {
|
||||||
event.event_id().clone(),
|
let state =
|
||||||
Err("Fetching state for event failed".into()),
|
fetch_events(&db, server_name.clone(), &pub_key_map, &res.pdu_ids).await?;
|
||||||
);
|
// Sanity check: there are no conflicting events in the state we received
|
||||||
continue;
|
let mut seen = BTreeSet::new();
|
||||||
}
|
for ev in &state {
|
||||||
};
|
// If the key is already present
|
||||||
|
if !seen.insert((&ev.kind, &ev.state_key)) {
|
||||||
|
todo!("Server sent us an invalid state")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
let state = state
|
||||||
|
.into_iter()
|
||||||
|
.map(|pdu| ((pdu.kind.clone(), pdu.state_key.clone()), Arc::new(pdu)))
|
||||||
|
.collect();
|
||||||
|
|
||||||
|
(
|
||||||
|
state,
|
||||||
|
fetch_events(&db, server_name.clone(), &pub_key_map, &res.auth_chain_ids)
|
||||||
|
.await?
|
||||||
|
.into_iter()
|
||||||
|
.map(Arc::new)
|
||||||
|
.collect(),
|
||||||
|
)
|
||||||
|
}
|
||||||
|
Err(_) => {
|
||||||
|
resolved_map.insert(
|
||||||
|
event.event_id().clone(),
|
||||||
|
Err("Fetching state for event failed".into()),
|
||||||
|
);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
if !state_res::event_auth::auth_check(
|
if !state_res::event_auth::auth_check(
|
||||||
&RoomVersionId::Version6,
|
&RoomVersionId::Version6,
|
||||||
|
@ -698,6 +704,7 @@ pub async fn send_transaction_message_route<'a>(
|
||||||
);
|
);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
// End of step 5.
|
||||||
|
|
||||||
// The event could still be soft failed
|
// The event could still be soft failed
|
||||||
append_state_soft(&db, &pdu)?;
|
append_state_soft(&db, &pdu)?;
|
||||||
|
@ -724,18 +731,30 @@ pub async fn send_transaction_message_route<'a>(
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// 6.
|
// Step 6. event passes auth based on state of all forks and current room state
|
||||||
let state_at_forks = if fork_states.is_empty() {
|
let state_at_forks = if fork_states.is_empty() {
|
||||||
// State is empty
|
// State is empty
|
||||||
Default::default()
|
Default::default()
|
||||||
} else if fork_states.len() == 1 {
|
} else if fork_states.len() == 1 {
|
||||||
fork_states[0].clone()
|
fork_states[0].clone()
|
||||||
} else {
|
} else {
|
||||||
|
let auth_events = fork_states
|
||||||
|
.iter()
|
||||||
|
.map(|map| {
|
||||||
|
db.rooms.auth_events_full(
|
||||||
|
pdu.room_id(),
|
||||||
|
&map.values()
|
||||||
|
.map(|pdu| pdu.event_id().clone())
|
||||||
|
.collect::<Vec<_>>(),
|
||||||
|
)
|
||||||
|
})
|
||||||
|
.collect();
|
||||||
|
|
||||||
// Add as much as we can to the `event_map` (less DB hits)
|
// Add as much as we can to the `event_map` (less DB hits)
|
||||||
event_map.extend(
|
event_map.extend(
|
||||||
incoming_auth_events
|
incoming_auth_events
|
||||||
.into_iter()
|
.into_iter()
|
||||||
.map(|pdu| (pdu.event_id().clone(), Arc::new(pdu))),
|
.map(|pdu| (pdu.event_id().clone(), pdu)),
|
||||||
);
|
);
|
||||||
event_map.extend(
|
event_map.extend(
|
||||||
state_at_event
|
state_at_event
|
||||||
|
@ -754,8 +773,8 @@ pub async fn send_transaction_message_route<'a>(
|
||||||
.collect::<StateMap<_>>()
|
.collect::<StateMap<_>>()
|
||||||
})
|
})
|
||||||
.collect::<Vec<_>>(),
|
.collect::<Vec<_>>(),
|
||||||
|
&auth_events,
|
||||||
&mut event_map,
|
&mut event_map,
|
||||||
&db.rooms,
|
|
||||||
) {
|
) {
|
||||||
Ok(res) => res
|
Ok(res) => res
|
||||||
.into_iter()
|
.into_iter()
|
||||||
|
|
Loading…
Reference in New Issue