mirror of
https://github.com/fluencelabs/rust-libp2p
synced 2025-07-03 11:41:34 +00:00
fix(allowblocklist): correctly remove Peer
from sets
Previously, we reinserted the `Peer` in the "undo" function which is obviously wrong. This patch fixes the behaviour to be correct and adds two regression tests. Pull-Request: #3789.
This commit is contained in:
@ -105,7 +105,7 @@ impl Behaviour<AllowedPeers> {
|
||||
///
|
||||
/// All active connections to this peer will be closed immediately.
|
||||
pub fn disallow_peer(&mut self, peer: PeerId) {
|
||||
self.state.peers.insert(peer);
|
||||
self.state.peers.remove(&peer);
|
||||
self.close_connections.push_back(peer);
|
||||
if let Some(waker) = self.waker.take() {
|
||||
waker.wake()
|
||||
@ -127,7 +127,7 @@ impl Behaviour<BlockedPeers> {
|
||||
|
||||
/// Unblock connections to a given peer.
|
||||
pub fn unblock_peer(&mut self, peer: PeerId) {
|
||||
self.state.peers.insert(peer);
|
||||
self.state.peers.remove(&peer);
|
||||
if let Some(waker) = self.waker.take() {
|
||||
waker.wake()
|
||||
}
|
||||
@ -297,6 +297,24 @@ mod tests {
|
||||
assert!(cause.downcast::<Blocked>().is_ok());
|
||||
}
|
||||
|
||||
#[async_std::test]
|
||||
async fn can_dial_unblocked_peer() {
|
||||
let mut dialer = Swarm::new_ephemeral(|_| Behaviour::<BlockedPeers>::new());
|
||||
let mut listener = Swarm::new_ephemeral(|_| Behaviour::<BlockedPeers>::new());
|
||||
listener.listen().await;
|
||||
|
||||
dialer
|
||||
.behaviour_mut()
|
||||
.list
|
||||
.block_peer(*listener.local_peer_id());
|
||||
dialer
|
||||
.behaviour_mut()
|
||||
.list
|
||||
.unblock_peer(*listener.local_peer_id());
|
||||
|
||||
dial(&mut dialer, &listener).unwrap();
|
||||
}
|
||||
|
||||
#[async_std::test]
|
||||
async fn blocked_peer_cannot_dial_us() {
|
||||
let mut dialer = Swarm::new_ephemeral(|_| Behaviour::<BlockedPeers>::new());
|
||||
@ -362,6 +380,27 @@ mod tests {
|
||||
assert!(dial(&mut dialer, &listener).is_ok());
|
||||
}
|
||||
|
||||
#[async_std::test]
|
||||
async fn cannot_dial_disallowed_peer() {
|
||||
let mut dialer = Swarm::new_ephemeral(|_| Behaviour::<AllowedPeers>::new());
|
||||
let mut listener = Swarm::new_ephemeral(|_| Behaviour::<AllowedPeers>::new());
|
||||
listener.listen().await;
|
||||
|
||||
dialer
|
||||
.behaviour_mut()
|
||||
.list
|
||||
.allow_peer(*listener.local_peer_id());
|
||||
dialer
|
||||
.behaviour_mut()
|
||||
.list
|
||||
.disallow_peer(*listener.local_peer_id());
|
||||
|
||||
let DialError::Denied { cause } = dial(&mut dialer, &listener).unwrap_err() else {
|
||||
panic!("unexpected dial error")
|
||||
};
|
||||
assert!(cause.downcast::<NotAllowed>().is_ok());
|
||||
}
|
||||
|
||||
#[async_std::test]
|
||||
async fn not_allowed_peer_cannot_dial_us() {
|
||||
let mut dialer = Swarm::new_ephemeral(|_| Behaviour::<AllowedPeers>::new());
|
||||
|
Reference in New Issue
Block a user