commit e429592e588e0e57721b66c66f7df0898c092023
parent d05f5d169c85a0207db6faaae0065d0f6d0ad52c
Author: triesap <tyson@radroots.org>
Date: Sun, 14 Jun 2026 18:20:03 -0700
runtime: prove count privacy refusals
Diffstat:
1 file changed, 39 insertions(+), 0 deletions(-)
diff --git a/crates/tangle_runtime/tests/phase2_acceptance_targets.rs b/crates/tangle_runtime/tests/phase2_acceptance_targets.rs
@@ -863,6 +863,13 @@ async fn websocket_private_and_hidden_groups_do_not_leak_through_query_count_or_
1,
)
.await;
+ assert_count_closed(
+ &mut observer,
+ "private-public-broad-count",
+ json!({"kinds":[1], "#h":["PrivateSocket"], "limit":500}),
+ "restricted: count filters are too broad or expensive",
+ )
+ .await;
assert_empty_req(
&mut observer,
"private-public-query",
@@ -975,6 +982,13 @@ async fn websocket_private_and_hidden_groups_do_not_leak_through_query_count_or_
1,
)
.await;
+ assert_count_closed(
+ &mut observer,
+ "hidden-public-broad-count",
+ json!({"kinds":[1], "#h":["HiddenSocket"], "limit":500}),
+ "restricted: count filters are too broad or expensive",
+ )
+ .await;
assert_empty_req(
&mut observer,
"hidden-public-query",
@@ -989,6 +1003,18 @@ async fn websocket_private_and_hidden_groups_do_not_leak_through_query_count_or_
)
.await;
+ let metrics = wait_for_http_ok(address, "/metricsz", None).await;
+ for private_value in [
+ "PrivateSocket",
+ "HiddenSocket",
+ "private harvest",
+ "hidden harvest",
+ "private-public-broad-count",
+ "hidden-public-broad-count",
+ ] {
+ assert!(!metrics.contains(private_value));
+ }
+
shutdown.request_shutdown();
read_websocket_close(&mut owner_writer).await;
read_websocket_close(&mut owner_reader).await;
@@ -1994,6 +2020,19 @@ async fn assert_count_message(
);
}
+async fn assert_count_closed(
+ socket: &mut TestWebSocket,
+ subscription_id: &str,
+ filter: Value,
+ message: &str,
+) {
+ send_client_value(socket, json!(["COUNT", subscription_id, filter])).await;
+ assert_eq!(
+ read_relay_value(socket).await,
+ json!(["CLOSED", subscription_id, message])
+ );
+}
+
async fn assert_empty_req(socket: &mut TestWebSocket, subscription_id: &str, filter: Value) {
send_client_value(socket, json!(["REQ", subscription_id, filter])).await;
assert_eq!(