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:
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]