diff options
| author | tv <tv@krebsco.de> | 2026-11-07 22:35:21 +0100 |
|---|---|---|
| committer | tv <tv@krebsco.de> | 2026-11-07 22:35:21 +0100 |
| commit | 22d3e8148d30887041a030b93b3e6de3f749a6cd (patch) | |
| tree | 27ed95306d078d70e1fd6cf90bbd4482aced1a4a /src/swarm/peer | |
| parent | e12bf8355d4b8318f70dbc964f2c1d3b57b4a038 (diff) | |
access: bans
_continuum/banned/<node ID>: every node refuses the banned node's
changes from then on (judged as the ban stood) and leaves its
handshakes unanswered.
Auth plan M6.
Diffstat (limited to 'src/swarm/peer')
| -rw-r--r-- | src/swarm/peer/inbound.rs | 20 |
1 files changed, 20 insertions, 0 deletions
diff --git a/src/swarm/peer/inbound.rs b/src/swarm/peer/inbound.rs index e261702..9b5db8f 100644 --- a/src/swarm/peer/inbound.rs +++ b/src/swarm/peer/inbound.rs @@ -75,6 +75,26 @@ pub(crate) async fn handle_message( if !admit(state, &peer, &message).await { return Ok(()); } + // A banned node's handshake goes unanswered, and what we had with it ends + // (`access::bans`). + if matches!( + message, + ParsedMessage::Hello(_) | ParsedMessage::HelloReply(_) + ) && crate::access::bans::banned(&state.doc.read().await.doc, &peer) + { + if let Some(peer_state) = state.get_peer_state(&peer).await { + let mut peer_state = peer_state.lock().await; + if peer_state.standing.is_admitted() { + tracing::warn!(peer = %peer, "Banned peer: no longer synced with"); + } + crate::swarm::topology::change_peer(state, &mut peer_state, |p| { + p.standing = crate::state::Standing::Stranger + }); + peer_state.hello_state = crate::state::HelloState::NotSent; + peer_state.reset_sync(); + } + return Ok(()); + } remember_peer(state, &peer).await; |
