tangle


git clone https://radroots.dev/git/tangle.git
Log | Files | Refs | README | LICENSE

commit 7fa3790c1a1b3efe8e6b7df643247ab410a5206d
parent 2f3c7c12867ee16927574d81b7588e5578eb7b13
Author: triesap <tyson@radroots.org>
Date:   Sun, 14 Jun 2026 04:35:38 -0700

tests: reject all generated group snapshots

- Extend client-submitted relay-generated snapshot rejection coverage across all NIP-29 39000-39004 snapshot kinds.
- Cover both the group write gate and base relay EVENT ingress paths for Tangle and Pocket event representations.
- Keep the rejection message blocked and specific to relay-generated group state submissions.
- Validated with cargo fmt --all -- --check, cargo check --workspace --all-targets, cargo test --workspace, and cargo clippy --workspace --all-targets -- -D warnings.

Diffstat:
Mcrates/tangle_groups/src/write_gate.rs | 37++++++++++++++++++-------------------
Mcrates/tangle_runtime/src/relay/core.rs | 40+++++++++++++++++++++-------------------
2 files changed, 39 insertions(+), 38 deletions(-)

diff --git a/crates/tangle_groups/src/write_gate.rs b/crates/tangle_groups/src/write_gate.rs @@ -124,7 +124,7 @@ mod tests { }; use crate::{ GroupErrorKind, GroupEventClass, GroupLimitsConfig, KIND_GROUP_DELETE_EVENT, - KIND_GROUP_JOIN_REQUEST, KIND_GROUP_METADATA, KIND_GROUP_PUT_USER, + KIND_GROUP_JOIN_REQUEST, KIND_GROUP_PUT_USER, NIP29_RELAY_GENERATED_KIND_VALUES, }; use pocket_types::Event as PocketEvent; use tangle_protocol::{ @@ -134,26 +134,25 @@ mod tests { #[test] fn client_submitted_relay_generated_events_are_rejected() { - let event = event( - KIND_GROUP_METADATA, - vec![Tag::from_parts("d", &["Farm"]).expect("d")], - ); - let error = validate_client_group_event_structure(&event, GroupLimitsConfig::default()) - .expect_err("relay generated"); + for kind in NIP29_RELAY_GENERATED_KIND_VALUES { + let event = event(kind, vec![Tag::from_parts("d", &["Farm"]).expect("d")]); + let error = validate_client_group_event_structure(&event, GroupLimitsConfig::default()) + .expect_err("relay generated"); - assert_eq!(error.kind(), GroupErrorKind::DirectRelayGeneratedSubmission); - assert_eq!( - error.prefixed_message(), - "blocked: relay-generated group state events cannot be submitted by clients" - ); + assert_eq!(error.kind(), GroupErrorKind::DirectRelayGeneratedSubmission); + assert_eq!( + error.prefixed_message(), + "blocked: relay-generated group state events cannot be submitted by clients" + ); - let mut buffer = vec![0; 4096]; - let error = validate_client_group_event_structure( - pocket_event(&event, &mut buffer), - GroupLimitsConfig::default(), - ) - .expect_err("pocket relay generated"); - assert_eq!(error.kind(), GroupErrorKind::DirectRelayGeneratedSubmission); + let mut buffer = vec![0; 4096]; + let error = validate_client_group_event_structure( + pocket_event(&event, &mut buffer), + GroupLimitsConfig::default(), + ) + .expect_err("pocket relay generated"); + assert_eq!(error.kind(), GroupErrorKind::DirectRelayGeneratedSubmission); + } } #[test] diff --git a/crates/tangle_runtime/src/relay/core.rs b/crates/tangle_runtime/src/relay/core.rs @@ -569,8 +569,8 @@ mod tests { GroupId, KIND_GROUP_ADMINS, KIND_GROUP_CREATE_GROUP, KIND_GROUP_CREATE_INVITE, KIND_GROUP_DELETE_EVENT, KIND_GROUP_DELETE_GROUP, KIND_GROUP_EDIT_METADATA, KIND_GROUP_JOIN_REQUEST, KIND_GROUP_LEAVE_REQUEST, KIND_GROUP_MEMBERS, KIND_GROUP_METADATA, - KIND_GROUP_PUT_USER, KIND_GROUP_REMOVE_USER, MemberStatus, StoreOffset, - parse_group_runtime_config_json, + KIND_GROUP_PUT_USER, KIND_GROUP_REMOVE_USER, MemberStatus, + NIP29_RELAY_GENERATED_KIND_VALUES, StoreOffset, parse_group_runtime_config_json, }; use tangle_protocol::{ ClientMessage, Event, EventId, Filter, Kind, PublicKeyHex, RelayMessage, SubscriptionId, @@ -821,23 +821,25 @@ mod tests { #[test] fn base_relay_rejects_client_submitted_relay_generated_group_state() { let mut relay = test_relay("base-relay-generated-group-reject", 4); - let event = signed_public_event( - 7, - 39_000, - vec![Tag::from_parts("d", &["public-group"]).expect("group")], - "", - ); - - assert_eq!( - relay.handle_event(event.clone()).expect("event"), - RelayMessage::Ok { - event_id: event.id().clone(), - accepted: false, - message: - "blocked: relay-generated group state events cannot be submitted by clients" - .to_owned() - } - ); + for kind in NIP29_RELAY_GENERATED_KIND_VALUES { + let event = signed_public_event( + 7, + kind.into(), + vec![Tag::from_parts("d", &["public-group"]).expect("group")], + "", + ); + + assert_eq!( + relay.handle_event(event.clone()).expect("event"), + RelayMessage::Ok { + event_id: event.id().clone(), + accepted: false, + message: + "blocked: relay-generated group state events cannot be submitted by clients" + .to_owned() + } + ); + } } #[test]