From b2b8f3866b388fd4bdf930de820906741cc5803a Mon Sep 17 00:00:00 2001 From: Marten Seemann Date: Sat, 24 Jul 2021 12:57:13 +0200 Subject: [PATCH] use a ConnectionManager for filtering addresses --- core/node/libp2p/addrs.go | 6 +++--- core/node/libp2p/filters.go | 36 ++++++++++++++++++++++++++++++++++++ 2 files changed, 39 insertions(+), 3 deletions(-) create mode 100644 core/node/libp2p/filters.go diff --git a/core/node/libp2p/addrs.go b/core/node/libp2p/addrs.go index f64947130..818385194 100644 --- a/core/node/libp2p/addrs.go +++ b/core/node/libp2p/addrs.go @@ -4,7 +4,7 @@ import ( "fmt" "github.com/libp2p/go-libp2p" - host "github.com/libp2p/go-libp2p-core/host" + "github.com/libp2p/go-libp2p-core/host" p2pbhost "github.com/libp2p/go-libp2p/p2p/host/basic" ma "github.com/multiformats/go-multiaddr" mamask "github.com/whyrusleeping/multiaddr-filter" @@ -13,13 +13,13 @@ import ( func AddrFilters(filters []string) func() (*ma.Filters, Libp2pOpts, error) { return func() (filter *ma.Filters, opts Libp2pOpts, err error) { filter = ma.NewFilters() - opts.Opts = append(opts.Opts, libp2p.Filters(filter)) //nolint + opts.Opts = append(opts.Opts, libp2p.ConnectionGater((*filtersConnectionGater)(filter))) for _, s := range filters { f, err := mamask.NewMask(s) if err != nil { return filter, opts, fmt.Errorf("incorrectly formatted address filter in config: %s", s) } - opts.Opts = append(opts.Opts, libp2p.FilterAddresses(f)) //nolint + filter.AddFilter(*f, ma.ActionDeny) } return filter, opts, nil } diff --git a/core/node/libp2p/filters.go b/core/node/libp2p/filters.go new file mode 100644 index 000000000..c6b8175d8 --- /dev/null +++ b/core/node/libp2p/filters.go @@ -0,0 +1,36 @@ +package libp2p + +import ( + "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" +) + +// filtersConnectionGater is an adapter that turns multiaddr.Filter into a +// connmgr.ConnectionGater. +type filtersConnectionGater ma.Filters + +var _ connmgr.ConnectionGater = (*filtersConnectionGater)(nil) + +func (f *filtersConnectionGater) InterceptAddrDial(_ peer.ID, addr ma.Multiaddr) (allow bool) { + return !(*ma.Filters)(f).AddrBlocked(addr) +} + +func (f *filtersConnectionGater) InterceptPeerDial(p peer.ID) (allow bool) { + return true +} + +func (f *filtersConnectionGater) InterceptAccept(connAddr network.ConnMultiaddrs) (allow bool) { + return !(*ma.Filters)(f).AddrBlocked(connAddr.RemoteMultiaddr()) +} + +func (f *filtersConnectionGater) InterceptSecured(_ network.Direction, _ peer.ID, connAddr network.ConnMultiaddrs) (allow bool) { + return !(*ma.Filters)(f).AddrBlocked(connAddr.RemoteMultiaddr()) +} + +func (f *filtersConnectionGater) InterceptUpgraded(_ network.Conn) (allow bool, reason control.DisconnectReason) { + return true, 0 +}