use a ConnectionManager for filtering addresses
Marten Seemann committed
Jul 24, 2021 at 12:57 UTC
b2b8f3866b388fd4bdf930de820906741cc5803a
2 files changed
+39
-3
core/node/libp2p/addrs.go
+3
-3
@@ -4,7 +4,7 @@ import (
4
"fmt"
5
6
"github.com/libp2p/go-libp2p"
7
- host "github.com/libp2p/go-libp2p-core/host"
7
+ "github.com/libp2p/go-libp2p-core/host"
8
p2pbhost "github.com/libp2p/go-libp2p/p2p/host/basic"
9
ma "github.com/multiformats/go-multiaddr"
10
mamask "github.com/whyrusleeping/multiaddr-filter"
@@ -13,13 +13,13 @@ import (
13
func AddrFilters(filters []string) func() (*ma.Filters, Libp2pOpts, error) {
14
return func() (filter *ma.Filters, opts Libp2pOpts, err error) {
15
filter = ma.NewFilters()
16
- opts.Opts = append(opts.Opts, libp2p.Filters(filter)) //nolint
16
+ opts.Opts = append(opts.Opts, libp2p.ConnectionGater((*filtersConnectionGater)(filter)))
17
for _, s := range filters {
18
f, err := mamask.NewMask(s)
19
if err != nil {
20
return filter, opts, fmt.Errorf("incorrectly formatted address filter in config: %s", s)
21
}
22
- opts.Opts = append(opts.Opts, libp2p.FilterAddresses(f)) //nolint
22
+ filter.AddFilter(*f, ma.ActionDeny)
23
}
24
return filter, opts, nil
25
}
core/node/libp2p/filters.go
new
+36
@@ -0,0 +1,36 @@
1
+package libp2p
2
+
3
+import (
4
+ "github.com/libp2p/go-libp2p-core/connmgr"
5
+ "github.com/libp2p/go-libp2p-core/control"
6
+ "github.com/libp2p/go-libp2p-core/network"
7
+ "github.com/libp2p/go-libp2p-core/peer"
8
+
9
+ ma "github.com/multiformats/go-multiaddr"
10
+)
11
+
12
+// filtersConnectionGater is an adapter that turns multiaddr.Filter into a
13
+// connmgr.ConnectionGater.
14
+type filtersConnectionGater ma.Filters
15
+
16
+var _ connmgr.ConnectionGater = (*filtersConnectionGater)(nil)
17
+
18
+func (f *filtersConnectionGater) InterceptAddrDial(_ peer.ID, addr ma.Multiaddr) (allow bool) {
19
+ return !(*ma.Filters)(f).AddrBlocked(addr)
20
+}
21
+
22
+func (f *filtersConnectionGater) InterceptPeerDial(p peer.ID) (allow bool) {
23
+ return true
24
+}
25
+
26
+func (f *filtersConnectionGater) InterceptAccept(connAddr network.ConnMultiaddrs) (allow bool) {
27
+ return !(*ma.Filters)(f).AddrBlocked(connAddr.RemoteMultiaddr())
28
+}
29
+
30
+func (f *filtersConnectionGater) InterceptSecured(_ network.Direction, _ peer.ID, connAddr network.ConnMultiaddrs) (allow bool) {
31
+ return !(*ma.Filters)(f).AddrBlocked(connAddr.RemoteMultiaddr())
32
+}
33
+
34
+func (f *filtersConnectionGater) InterceptUpgraded(_ network.Conn) (allow bool, reason control.DisconnectReason) {
35
+ return true, 0
36
+}