aboutsummaryrefslogtreecommitdiffstats
path: root/src/swarm
diff options
context:
space:
mode:
authortv <tv@krebsco.de>2026-11-07 22:35:22 +0100
committertv <tv@krebsco.de>2026-11-07 22:35:22 +0100
commitd322e7d4aa41d94232113cb7680cec1d65a11b0c (patch)
tree874e03dbf7acebc51a144498c89c43b335641bf7 /src/swarm
parenta99bacc0c90ca7a7f879cec8a8fb33f4aa14e84f (diff)
access: members refused as a whole
With signatures required, a member whose own change broke a rule is refused as a whole: sent nothing, shown in /peers (refused), in stats (sync.refusedPeers) and on the dashboard, until a change of its is taken again or the epoch changes. Auth plan M6 (diverged standing).
Diffstat (limited to 'src/swarm')
-rw-r--r--src/swarm/sync.rs8
1 files changed, 8 insertions, 0 deletions
diff --git a/src/swarm/sync.rs b/src/swarm/sync.rs
index f5d6bfb..9f928ad 100644
--- a/src/swarm/sync.rs
+++ b/src/swarm/sync.rs
@@ -36,6 +36,14 @@ async fn deliver_sync_to_peer(state: &AppState, peer: &str) -> Result<()> {
trace!("Peer was forgotten; skipping sync");
return Ok(());
};
+ {
+ use crate::locks::MutexExt;
+ if state.screening.lock_or_recover().refusing(peer).is_some() {
+ // All it commits builds on what we refused (`access::screen`).
+ trace!("Refusing the peer as a whole; not syncing with it");
+ return Ok(());
+ }
+ }
let we_ready = state.is_ready().await;