@@ -58,7 +58,11 @@ fn matches_sender(&self, filter: &RoomEventFilter) -> bool {
|
||||
#[implement(super::Pdu)]
|
||||
fn matches_type(&self, filter: &RoomEventFilter) -> bool {
|
||||
let event_type = &self.kind.to_cow_str();
|
||||
if filter.not_types.iter().any(is_equal_to!(event_type)) {
|
||||
if filter
|
||||
.not_types
|
||||
.iter()
|
||||
.any(is_equal_to!(event_type))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
@@ -97,7 +97,11 @@ impl From<Id> for RawId {
|
||||
match id.shorteventid {
|
||||
| Count::Normal(shorteventid) => {
|
||||
vec.extend(shorteventid.to_be_bytes());
|
||||
Self::Normal(vec.as_ref().try_into().expect("RawVec into RawId::Normal"))
|
||||
Self::Normal(
|
||||
vec.as_ref()
|
||||
.try_into()
|
||||
.expect("RawVec into RawId::Normal"),
|
||||
)
|
||||
},
|
||||
| Count::Backfilled(shorteventid) => {
|
||||
vec.extend(0_u64.to_be_bytes());
|
||||
|
||||
@@ -102,7 +102,8 @@ where
|
||||
#[implement(Pdu)]
|
||||
#[must_use]
|
||||
pub fn get_unsigned_as_value(&self) -> JsonValue {
|
||||
self.get_unsigned::<JsonValue>().unwrap_or_default()
|
||||
self.get_unsigned::<JsonValue>()
|
||||
.unwrap_or_default()
|
||||
}
|
||||
|
||||
#[implement(Pdu)]
|
||||
|
||||
@@ -104,7 +104,10 @@ pub fn auth_types_for_event(
|
||||
}
|
||||
|
||||
if membership == MembershipState::Invite {
|
||||
if let Some(Ok(t_id)) = content.third_party_invite.map(|t| t.deserialize()) {
|
||||
if let Some(Ok(t_id)) = content
|
||||
.third_party_invite
|
||||
.map(|t| t.deserialize())
|
||||
{
|
||||
let key =
|
||||
(StateEventType::RoomThirdPartyInvite, t_id.signed.token.into());
|
||||
if !auth_types.contains(&key) {
|
||||
@@ -564,9 +567,12 @@ fn valid_membership_change(
|
||||
}
|
||||
|
||||
let power_levels_event_id = power_levels_event.as_ref().map(Event::event_id);
|
||||
let sender_membership_event_id = sender_membership_event.as_ref().map(Event::event_id);
|
||||
let target_user_membership_event_id =
|
||||
target_user_membership_event.as_ref().map(Event::event_id);
|
||||
let sender_membership_event_id = sender_membership_event
|
||||
.as_ref()
|
||||
.map(Event::event_id);
|
||||
let target_user_membership_event_id = target_user_membership_event
|
||||
.as_ref()
|
||||
.map(Event::event_id);
|
||||
|
||||
let user_for_join_auth_is_valid = if let Some(user_for_join_auth) = user_for_join_auth {
|
||||
// Is the authorised user allowed to invite users into this room
|
||||
@@ -725,7 +731,9 @@ fn valid_membership_change(
|
||||
allow
|
||||
} else if !sender_is_joined
|
||||
|| target_user_current_membership == MembershipState::Ban
|
||||
&& sender_power.filter(|&p| p < &power_levels.ban).is_some()
|
||||
&& sender_power
|
||||
.filter(|&p| p < &power_levels.ban)
|
||||
.is_some()
|
||||
{
|
||||
warn!(
|
||||
?target_user_membership_event_id,
|
||||
@@ -734,8 +742,9 @@ fn valid_membership_change(
|
||||
);
|
||||
false
|
||||
} else {
|
||||
let allow = sender_power.filter(|&p| p >= &power_levels.kick).is_some()
|
||||
&& target_power < sender_power;
|
||||
let allow = sender_power
|
||||
.filter(|&p| p >= &power_levels.kick)
|
||||
.is_some() && target_power < sender_power;
|
||||
if !allow {
|
||||
warn!(
|
||||
?target_user_membership_event_id,
|
||||
@@ -750,8 +759,9 @@ fn valid_membership_change(
|
||||
warn!(?sender_membership_event_id, "Can't ban user if sender is not joined");
|
||||
false
|
||||
} else {
|
||||
let allow = sender_power.filter(|&p| p >= &power_levels.ban).is_some()
|
||||
&& target_power < sender_power;
|
||||
let allow = sender_power
|
||||
.filter(|&p| p >= &power_levels.ban)
|
||||
.is_some() && target_power < sender_power;
|
||||
if !allow {
|
||||
warn!(
|
||||
?target_user_membership_event_id,
|
||||
@@ -829,7 +839,9 @@ fn can_send_event(event: impl Event, ple: Option<impl Event>, user_level: Int) -
|
||||
return false;
|
||||
}
|
||||
|
||||
if event.state_key().is_some_and(|k| k.starts_with('@'))
|
||||
if event
|
||||
.state_key()
|
||||
.is_some_and(|k| k.starts_with('@'))
|
||||
&& event.state_key() != Some(event.sender().as_str())
|
||||
{
|
||||
return false; // permission required to post in this room
|
||||
@@ -1040,13 +1052,17 @@ fn get_send_level(
|
||||
.and_then(|ple| {
|
||||
from_json_str::<RoomPowerLevelsEventContent>(ple.content().get())
|
||||
.map(|content| {
|
||||
content.events.get(e_type).copied().unwrap_or_else(|| {
|
||||
if state_key.is_some() {
|
||||
content.state_default
|
||||
} else {
|
||||
content.events_default
|
||||
}
|
||||
})
|
||||
content
|
||||
.events
|
||||
.get(e_type)
|
||||
.copied()
|
||||
.unwrap_or_else(|| {
|
||||
if state_key.is_some() {
|
||||
content.state_default
|
||||
} else {
|
||||
content.events_default
|
||||
}
|
||||
})
|
||||
})
|
||||
.ok()
|
||||
})
|
||||
@@ -1135,13 +1151,21 @@ mod tests {
|
||||
#[test]
|
||||
fn test_ban_pass() {
|
||||
let _ = tracing::subscriber::set_default(
|
||||
tracing_subscriber::fmt().with_test_writer().finish(),
|
||||
tracing_subscriber::fmt()
|
||||
.with_test_writer()
|
||||
.finish(),
|
||||
);
|
||||
let events = INITIAL_EVENTS();
|
||||
|
||||
let auth_events = events
|
||||
.values()
|
||||
.map(|ev| (ev.event_type().with_state_key(ev.state_key().unwrap()), ev.clone()))
|
||||
.map(|ev| {
|
||||
(
|
||||
ev.event_type()
|
||||
.with_state_key(ev.state_key().unwrap()),
|
||||
ev.clone(),
|
||||
)
|
||||
})
|
||||
.collect::<StateMap<_>>();
|
||||
|
||||
let requester = to_pdu_event(
|
||||
@@ -1180,13 +1204,21 @@ mod tests {
|
||||
#[test]
|
||||
fn test_join_non_creator() {
|
||||
let _ = tracing::subscriber::set_default(
|
||||
tracing_subscriber::fmt().with_test_writer().finish(),
|
||||
tracing_subscriber::fmt()
|
||||
.with_test_writer()
|
||||
.finish(),
|
||||
);
|
||||
let events = INITIAL_EVENTS_CREATE_ROOM();
|
||||
|
||||
let auth_events = events
|
||||
.values()
|
||||
.map(|ev| (ev.event_type().with_state_key(ev.state_key().unwrap()), ev.clone()))
|
||||
.map(|ev| {
|
||||
(
|
||||
ev.event_type()
|
||||
.with_state_key(ev.state_key().unwrap()),
|
||||
ev.clone(),
|
||||
)
|
||||
})
|
||||
.collect::<StateMap<_>>();
|
||||
|
||||
let requester = to_pdu_event(
|
||||
@@ -1225,13 +1257,21 @@ mod tests {
|
||||
#[test]
|
||||
fn test_join_creator() {
|
||||
let _ = tracing::subscriber::set_default(
|
||||
tracing_subscriber::fmt().with_test_writer().finish(),
|
||||
tracing_subscriber::fmt()
|
||||
.with_test_writer()
|
||||
.finish(),
|
||||
);
|
||||
let events = INITIAL_EVENTS_CREATE_ROOM();
|
||||
|
||||
let auth_events = events
|
||||
.values()
|
||||
.map(|ev| (ev.event_type().with_state_key(ev.state_key().unwrap()), ev.clone()))
|
||||
.map(|ev| {
|
||||
(
|
||||
ev.event_type()
|
||||
.with_state_key(ev.state_key().unwrap()),
|
||||
ev.clone(),
|
||||
)
|
||||
})
|
||||
.collect::<StateMap<_>>();
|
||||
|
||||
let requester = to_pdu_event(
|
||||
@@ -1270,13 +1310,21 @@ mod tests {
|
||||
#[test]
|
||||
fn test_ban_fail() {
|
||||
let _ = tracing::subscriber::set_default(
|
||||
tracing_subscriber::fmt().with_test_writer().finish(),
|
||||
tracing_subscriber::fmt()
|
||||
.with_test_writer()
|
||||
.finish(),
|
||||
);
|
||||
let events = INITIAL_EVENTS();
|
||||
|
||||
let auth_events = events
|
||||
.values()
|
||||
.map(|ev| (ev.event_type().with_state_key(ev.state_key().unwrap()), ev.clone()))
|
||||
.map(|ev| {
|
||||
(
|
||||
ev.event_type()
|
||||
.with_state_key(ev.state_key().unwrap()),
|
||||
ev.clone(),
|
||||
)
|
||||
})
|
||||
.collect::<StateMap<_>>();
|
||||
|
||||
let requester = to_pdu_event(
|
||||
@@ -1315,7 +1363,9 @@ mod tests {
|
||||
#[test]
|
||||
fn test_restricted_join_rule() {
|
||||
let _ = tracing::subscriber::set_default(
|
||||
tracing_subscriber::fmt().with_test_writer().finish(),
|
||||
tracing_subscriber::fmt()
|
||||
.with_test_writer()
|
||||
.finish(),
|
||||
);
|
||||
let mut events = INITIAL_EVENTS();
|
||||
*events.get_mut(&event_id("IJR")).unwrap() = to_pdu_event(
|
||||
@@ -1338,7 +1388,13 @@ mod tests {
|
||||
|
||||
let auth_events = events
|
||||
.values()
|
||||
.map(|ev| (ev.event_type().with_state_key(ev.state_key().unwrap()), ev.clone()))
|
||||
.map(|ev| {
|
||||
(
|
||||
ev.event_type()
|
||||
.with_state_key(ev.state_key().unwrap()),
|
||||
ev.clone(),
|
||||
)
|
||||
})
|
||||
.collect::<StateMap<_>>();
|
||||
|
||||
let requester = to_pdu_event(
|
||||
@@ -1395,7 +1451,9 @@ mod tests {
|
||||
#[test]
|
||||
fn test_knock() {
|
||||
let _ = tracing::subscriber::set_default(
|
||||
tracing_subscriber::fmt().with_test_writer().finish(),
|
||||
tracing_subscriber::fmt()
|
||||
.with_test_writer()
|
||||
.finish(),
|
||||
);
|
||||
let mut events = INITIAL_EVENTS();
|
||||
*events.get_mut(&event_id("IJR")).unwrap() = to_pdu_event(
|
||||
@@ -1410,7 +1468,13 @@ mod tests {
|
||||
|
||||
let auth_events = events
|
||||
.values()
|
||||
.map(|ev| (ev.event_type().with_state_key(ev.state_key().unwrap()), ev.clone()))
|
||||
.map(|ev| {
|
||||
(
|
||||
ev.event_type()
|
||||
.with_state_key(ev.state_key().unwrap()),
|
||||
ev.clone(),
|
||||
)
|
||||
})
|
||||
.collect::<StateMap<_>>();
|
||||
|
||||
let requester = to_pdu_event(
|
||||
|
||||
@@ -429,7 +429,10 @@ where
|
||||
|
||||
reverse_graph.entry(node).or_default();
|
||||
for edge in edges {
|
||||
reverse_graph.entry(edge).or_default().insert(node);
|
||||
reverse_graph
|
||||
.entry(edge)
|
||||
.or_default()
|
||||
.insert(node);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -710,7 +713,9 @@ where
|
||||
.iter()
|
||||
.stream()
|
||||
.broad_filter_map(async |ev_id| {
|
||||
fetch_event(ev_id.clone()).await.map(|event| (event, ev_id))
|
||||
fetch_event(ev_id.clone())
|
||||
.await
|
||||
.map(|event| (event, ev_id))
|
||||
})
|
||||
.broad_filter_map(|(event, ev_id)| {
|
||||
get_mainline_depth(Some(event.clone()), &mainline_map, fetch_event)
|
||||
@@ -782,7 +787,11 @@ async fn add_event_and_auth_chain_to_graph<E, F, Fut>(
|
||||
while let Some(eid) = state.pop() {
|
||||
graph.entry(eid.clone()).or_default();
|
||||
let event = fetch_event(eid.clone()).await;
|
||||
let auth_events = event.as_ref().map(Event::auth_events).into_iter().flatten();
|
||||
let auth_events = event
|
||||
.as_ref()
|
||||
.map(Event::auth_events)
|
||||
.into_iter()
|
||||
.flatten();
|
||||
|
||||
// Prefer the store to event as the store filters dedups the events
|
||||
for aid in auth_events {
|
||||
@@ -792,7 +801,10 @@ async fn add_event_and_auth_chain_to_graph<E, F, Fut>(
|
||||
}
|
||||
|
||||
// We just inserted this at the start of the while loop
|
||||
graph.get_mut(eid.borrow()).unwrap().insert(aid.to_owned());
|
||||
graph
|
||||
.get_mut(eid.borrow())
|
||||
.unwrap()
|
||||
.insert(aid.to_owned());
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -890,13 +902,21 @@ mod tests {
|
||||
use futures::future::ready;
|
||||
|
||||
let _ = tracing::subscriber::set_default(
|
||||
tracing_subscriber::fmt().with_test_writer().finish(),
|
||||
tracing_subscriber::fmt()
|
||||
.with_test_writer()
|
||||
.finish(),
|
||||
);
|
||||
let events = INITIAL_EVENTS();
|
||||
|
||||
let event_map = events
|
||||
.values()
|
||||
.map(|ev| (ev.event_type().with_state_key(ev.state_key().unwrap()), ev.clone()))
|
||||
.map(|ev| {
|
||||
(
|
||||
ev.event_type()
|
||||
.with_state_key(ev.state_key().unwrap()),
|
||||
ev.clone(),
|
||||
)
|
||||
})
|
||||
.collect::<StateMap<_>>();
|
||||
|
||||
let auth_chain: HashSet<OwnedEventId> = HashSet::new();
|
||||
@@ -965,7 +985,9 @@ mod tests {
|
||||
#[tokio::test]
|
||||
async fn ban_vs_power_level() {
|
||||
let _ = tracing::subscriber::set_default(
|
||||
tracing_subscriber::fmt().with_test_writer().finish(),
|
||||
tracing_subscriber::fmt()
|
||||
.with_test_writer()
|
||||
.finish(),
|
||||
);
|
||||
|
||||
let events = &[
|
||||
@@ -1015,7 +1037,9 @@ mod tests {
|
||||
#[tokio::test]
|
||||
async fn topic_basic() {
|
||||
let _ = tracing::subscriber::set_default(
|
||||
tracing_subscriber::fmt().with_test_writer().finish(),
|
||||
tracing_subscriber::fmt()
|
||||
.with_test_writer()
|
||||
.finish(),
|
||||
);
|
||||
|
||||
let events = &[
|
||||
@@ -1080,7 +1104,9 @@ mod tests {
|
||||
#[tokio::test]
|
||||
async fn topic_reset() {
|
||||
let _ = tracing::subscriber::set_default(
|
||||
tracing_subscriber::fmt().with_test_writer().finish(),
|
||||
tracing_subscriber::fmt()
|
||||
.with_test_writer()
|
||||
.finish(),
|
||||
);
|
||||
|
||||
let events = &[
|
||||
@@ -1130,7 +1156,9 @@ mod tests {
|
||||
#[tokio::test]
|
||||
async fn join_rule_evasion() {
|
||||
let _ = tracing::subscriber::set_default(
|
||||
tracing_subscriber::fmt().with_test_writer().finish(),
|
||||
tracing_subscriber::fmt()
|
||||
.with_test_writer()
|
||||
.finish(),
|
||||
);
|
||||
|
||||
let events = &[
|
||||
@@ -1163,7 +1191,9 @@ mod tests {
|
||||
#[tokio::test]
|
||||
async fn offtopic_power_level() {
|
||||
let _ = tracing::subscriber::set_default(
|
||||
tracing_subscriber::fmt().with_test_writer().finish(),
|
||||
tracing_subscriber::fmt()
|
||||
.with_test_writer()
|
||||
.finish(),
|
||||
);
|
||||
|
||||
let events = &[
|
||||
@@ -1199,7 +1229,10 @@ mod tests {
|
||||
.map(|list| list.into_iter().map(event_id).collect::<Vec<_>>())
|
||||
.collect::<Vec<_>>();
|
||||
|
||||
let expected_state_ids = vec!["PC"].into_iter().map(event_id).collect::<Vec<_>>();
|
||||
let expected_state_ids = vec!["PC"]
|
||||
.into_iter()
|
||||
.map(event_id)
|
||||
.collect::<Vec<_>>();
|
||||
|
||||
do_check(events, edges, expected_state_ids).await;
|
||||
}
|
||||
@@ -1207,7 +1240,9 @@ mod tests {
|
||||
#[tokio::test]
|
||||
async fn topic_setting() {
|
||||
let _ = tracing::subscriber::set_default(
|
||||
tracing_subscriber::fmt().with_test_writer().finish(),
|
||||
tracing_subscriber::fmt()
|
||||
.with_test_writer()
|
||||
.finish(),
|
||||
);
|
||||
|
||||
let events = &[
|
||||
@@ -1289,7 +1324,9 @@ mod tests {
|
||||
use futures::future::ready;
|
||||
|
||||
let _ = tracing::subscriber::set_default(
|
||||
tracing_subscriber::fmt().with_test_writer().finish(),
|
||||
tracing_subscriber::fmt()
|
||||
.with_test_writer()
|
||||
.finish(),
|
||||
);
|
||||
|
||||
let mut store = TestStore::<PduEvent>(hashmap! {});
|
||||
@@ -1332,7 +1369,9 @@ mod tests {
|
||||
#[tokio::test]
|
||||
async fn test_lexicographical_sort() {
|
||||
let _ = tracing::subscriber::set_default(
|
||||
tracing_subscriber::fmt().with_test_writer().finish(),
|
||||
tracing_subscriber::fmt()
|
||||
.with_test_writer()
|
||||
.finish(),
|
||||
);
|
||||
|
||||
let graph = hashmap! {
|
||||
@@ -1361,7 +1400,9 @@ mod tests {
|
||||
#[tokio::test]
|
||||
async fn ban_with_auth_chains() {
|
||||
let _ = tracing::subscriber::set_default(
|
||||
tracing_subscriber::fmt().with_test_writer().finish(),
|
||||
tracing_subscriber::fmt()
|
||||
.with_test_writer()
|
||||
.finish(),
|
||||
);
|
||||
let ban = BAN_STATE_SET();
|
||||
|
||||
@@ -1383,7 +1424,9 @@ mod tests {
|
||||
use futures::future::ready;
|
||||
|
||||
let _ = tracing::subscriber::set_default(
|
||||
tracing_subscriber::fmt().with_test_writer().finish(),
|
||||
tracing_subscriber::fmt()
|
||||
.with_test_writer()
|
||||
.finish(),
|
||||
);
|
||||
let init = INITIAL_EVENTS();
|
||||
let ban = BAN_STATE_SET();
|
||||
@@ -1402,7 +1445,13 @@ mod tests {
|
||||
inner.get(&event_id("PA")).unwrap(),
|
||||
]
|
||||
.iter()
|
||||
.map(|ev| (ev.event_type().with_state_key(ev.state_key().unwrap()), ev.event_id.clone()))
|
||||
.map(|ev| {
|
||||
(
|
||||
ev.event_type()
|
||||
.with_state_key(ev.state_key().unwrap()),
|
||||
ev.event_id.clone(),
|
||||
)
|
||||
})
|
||||
.collect::<StateMap<_>>();
|
||||
|
||||
let state_set_b = [
|
||||
@@ -1415,7 +1464,13 @@ mod tests {
|
||||
inner.get(&event_id("PA")).unwrap(),
|
||||
]
|
||||
.iter()
|
||||
.map(|ev| (ev.event_type().with_state_key(ev.state_key().unwrap()), ev.event_id.clone()))
|
||||
.map(|ev| {
|
||||
(
|
||||
ev.event_type()
|
||||
.with_state_key(ev.state_key().unwrap()),
|
||||
ev.event_id.clone(),
|
||||
)
|
||||
})
|
||||
.collect::<StateMap<_>>();
|
||||
|
||||
let ev_map = &store.0;
|
||||
@@ -1479,7 +1534,10 @@ mod tests {
|
||||
.map(|list| list.into_iter().map(event_id).collect::<Vec<_>>())
|
||||
.collect::<Vec<_>>();
|
||||
|
||||
let expected_state_ids = vec!["JR"].into_iter().map(event_id).collect::<Vec<_>>();
|
||||
let expected_state_ids = vec!["JR"]
|
||||
.into_iter()
|
||||
.map(event_id)
|
||||
.collect::<Vec<_>>();
|
||||
|
||||
do_check(&join_rule.values().cloned().collect::<Vec<_>>(), edges, expected_state_ids)
|
||||
.await;
|
||||
|
||||
@@ -206,12 +206,16 @@ pub(crate) async fn do_check(
|
||||
)
|
||||
});
|
||||
|
||||
let key = ev.event_type().with_state_key(ev.state_key().unwrap());
|
||||
let key = ev
|
||||
.event_type()
|
||||
.with_state_key(ev.state_key().unwrap());
|
||||
|
||||
expected_state.insert(key, node);
|
||||
}
|
||||
|
||||
let start_state = state_at_event.get(event_id!("$START:foo")).unwrap();
|
||||
let start_state = state_at_event
|
||||
.get(event_id!("$START:foo"))
|
||||
.unwrap();
|
||||
|
||||
let end_state = state_at_event
|
||||
.get(event_id!("$END:foo"))
|
||||
@@ -340,21 +344,33 @@ impl TestStore<PduEvent> {
|
||||
let state_at_bob = [&create_event, &alice_mem, &join_rules, &bob_mem]
|
||||
.iter()
|
||||
.map(|e| {
|
||||
(e.event_type().with_state_key(e.state_key().unwrap()), e.event_id().to_owned())
|
||||
(
|
||||
e.event_type()
|
||||
.with_state_key(e.state_key().unwrap()),
|
||||
e.event_id().to_owned(),
|
||||
)
|
||||
})
|
||||
.collect::<StateMap<_>>();
|
||||
|
||||
let state_at_charlie = [&create_event, &alice_mem, &join_rules, &charlie_mem]
|
||||
.iter()
|
||||
.map(|e| {
|
||||
(e.event_type().with_state_key(e.state_key().unwrap()), e.event_id().to_owned())
|
||||
(
|
||||
e.event_type()
|
||||
.with_state_key(e.state_key().unwrap()),
|
||||
e.event_id().to_owned(),
|
||||
)
|
||||
})
|
||||
.collect::<StateMap<_>>();
|
||||
|
||||
let expected = [&create_event, &alice_mem, &join_rules, &bob_mem, &charlie_mem]
|
||||
.iter()
|
||||
.map(|e| {
|
||||
(e.event_type().with_state_key(e.state_key().unwrap()), e.event_id().to_owned())
|
||||
(
|
||||
e.event_type()
|
||||
.with_state_key(e.state_key().unwrap()),
|
||||
e.event_id().to_owned(),
|
||||
)
|
||||
})
|
||||
.collect::<StateMap<_>>();
|
||||
|
||||
|
||||
Reference in New Issue
Block a user