mirror of https://github.com/libp2p/go-libp2p.git
vyzo
4 years ago
1 changed files with 158 additions and 0 deletions
@ -0,0 +1,158 @@ |
|||
package conngater |
|||
|
|||
import ( |
|||
"net" |
|||
"sync" |
|||
|
|||
"github.com/libp2p/go-libp2p-core/connmgr" |
|||
"github.com/libp2p/go-libp2p-core/control" |
|||
"github.com/libp2p/go-libp2p-core/network" |
|||
"github.com/libp2p/go-libp2p-core/peer" |
|||
|
|||
ma "github.com/multiformats/go-multiaddr" |
|||
manet "github.com/multiformats/go-multiaddr/net" |
|||
|
|||
logging "github.com/ipfs/go-log" |
|||
) |
|||
|
|||
type BasicConnectionGater struct { |
|||
sync.Mutex |
|||
|
|||
blockedPeers map[peer.ID]struct{} |
|||
blockedAddrs map[string]struct{} |
|||
blockedSubnets map[string]*net.IPNet |
|||
} |
|||
|
|||
var log = logging.Logger("net/conngater") |
|||
|
|||
func NewBasicConnectionGater() *BasicConnectionGater { |
|||
// XXX
|
|||
return nil |
|||
} |
|||
|
|||
// BlockPeer adds a peer to the set of blocked peers
|
|||
func (cg *BasicConnectionGater) BlockPeer(p peer.ID) { |
|||
cg.Lock() |
|||
defer cg.Unlock() |
|||
|
|||
cg.blockedPeers[p] = struct{}{} |
|||
} |
|||
|
|||
// UnblockPeer removes a peer from the set of blocked peers
|
|||
func (cg *BasicConnectionGater) UnblockPeer(p peer.ID) { |
|||
cg.Lock() |
|||
defer cg.Unlock() |
|||
|
|||
delete(cg.blockedPeers, p) |
|||
} |
|||
|
|||
// BlockAddr adds an IP address to the set of blocked addresses
|
|||
func (cg *BasicConnectionGater) BlockAddr(ip net.IP) { |
|||
cg.Lock() |
|||
defer cg.Unlock() |
|||
|
|||
cg.blockedAddrs[ip.String()] = struct{}{} |
|||
} |
|||
|
|||
// UnblockAddr removes an IP address from the set of blocked addresses
|
|||
func (cg *BasicConnectionGater) UnblockAddr(ip net.IP) { |
|||
cg.Lock() |
|||
defer cg.Unlock() |
|||
|
|||
delete(cg.blockedAddrs, ip.String()) |
|||
} |
|||
|
|||
// BlockSubnet adds an IP subnet to the set of blocked addresses
|
|||
func (cg *BasicConnectionGater) BlockSubnet(ipnet *net.IPNet) { |
|||
cg.Lock() |
|||
defer cg.Unlock() |
|||
|
|||
cg.blockedSubnets[ipnet.String()] = ipnet |
|||
} |
|||
|
|||
// UnblockSubnet removes an IP address from the set of blocked addresses
|
|||
func (cg *BasicConnectionGater) UnblockSubnet(ipnet *net.IPNet) { |
|||
cg.Lock() |
|||
defer cg.Unlock() |
|||
|
|||
delete(cg.blockedSubnets, ipnet.String()) |
|||
} |
|||
|
|||
// ConnectionGater interface
|
|||
var _ connmgr.ConnectionGater = (*BasicConnectionGater)(nil) |
|||
|
|||
func (cg *BasicConnectionGater) InterceptPeerDial(p peer.ID) (allow bool) { |
|||
cg.Lock() |
|||
defer cg.Unlock() |
|||
|
|||
_, block := cg.blockedPeers[p] |
|||
return !block |
|||
} |
|||
|
|||
func (cg *BasicConnectionGater) InterceptAddrDial(p peer.ID, a ma.Multiaddr) (allow bool) { |
|||
cg.Lock() |
|||
defer cg.Unlock() |
|||
|
|||
ip, err := manet.ToIP(a) |
|||
if err != nil { |
|||
log.Warnf("error converting multiaddr to IP addr: %s", err) |
|||
return true |
|||
} |
|||
|
|||
_, block := cg.blockedAddrs[ip.String()] |
|||
if block { |
|||
return false |
|||
} |
|||
|
|||
for _, ipnet := range cg.blockedSubnets { |
|||
if ipnet.Contains(ip) { |
|||
return false |
|||
} |
|||
} |
|||
|
|||
return true |
|||
} |
|||
|
|||
func (cg *BasicConnectionGater) InterceptAccept(cma network.ConnMultiaddrs) (allow bool) { |
|||
cg.Lock() |
|||
defer cg.Unlock() |
|||
|
|||
a := cma.RemoteMultiaddr() |
|||
|
|||
ip, err := manet.ToIP(a) |
|||
if err != nil { |
|||
log.Warnf("error converting multiaddr to IP addr: %s", err) |
|||
return true |
|||
} |
|||
|
|||
_, block := cg.blockedAddrs[ip.String()] |
|||
if block { |
|||
return false |
|||
} |
|||
|
|||
for _, ipnet := range cg.blockedSubnets { |
|||
if ipnet.Contains(ip) { |
|||
return false |
|||
} |
|||
} |
|||
|
|||
return true |
|||
} |
|||
|
|||
func (cg *BasicConnectionGater) InterceptSecured(dir network.Direction, p peer.ID, cma network.ConnMultiaddrs) (allow bool) { |
|||
if dir == network.DirOutbound { |
|||
// we have already filtered those in InterceptPeerDial/InterceptAddrDial
|
|||
return true |
|||
} |
|||
|
|||
// we have already filtered addrs in InterceptAccept, so we just check the peer ID
|
|||
cg.Lock() |
|||
defer cg.Unlock() |
|||
|
|||
_, block := cg.blockedPeers[p] |
|||
return !block |
|||
} |
|||
|
|||
func (cg *BasicConnectionGater) InterceptUpgraded(network.Conn) (allow bool, reason control.DisconnectReason) { |
|||
return true, 0 |
|||
} |
Loading…
Reference in new issue