80 lines
1.9 KiB
Go
80 lines
1.9 KiB
Go
package cluster
|
|
|
|
import (
|
|
"log/slog"
|
|
|
|
dmnet "git.clan.lol/clan/data-mesher/pkg/net"
|
|
"github.com/libp2p/go-libp2p/core/control"
|
|
"github.com/libp2p/go-libp2p/core/network"
|
|
"github.com/libp2p/go-libp2p/core/peer"
|
|
"github.com/multiformats/go-multiaddr"
|
|
)
|
|
|
|
type ConnectionGater struct {
|
|
interfaces []string
|
|
resolver dmnet.InterfaceResolver
|
|
}
|
|
|
|
func NewConnectionGater(interfaces []string, resolver dmnet.InterfaceResolver) *ConnectionGater {
|
|
if resolver == nil {
|
|
resolver = dmnet.DefaultResolver{}
|
|
}
|
|
|
|
return &ConnectionGater{
|
|
interfaces: interfaces,
|
|
resolver: resolver,
|
|
}
|
|
}
|
|
|
|
func (c *ConnectionGater) InterceptPeerDial(peer.ID) bool {
|
|
return true
|
|
}
|
|
|
|
func (c *ConnectionGater) InterceptAddrDial(id peer.ID, multiaddr multiaddr.Multiaddr) bool {
|
|
ok, err := c.resolver.IsReachable(multiaddr, c.interfaces)
|
|
if err != nil {
|
|
slog.Error(
|
|
"failed to check if multiaddr is reachable",
|
|
slog.String("peer", id.String()),
|
|
slog.String("addr", multiaddr.String()),
|
|
slog.Any("err", err),
|
|
)
|
|
}
|
|
|
|
slog.Debug(
|
|
"addr dial interception result",
|
|
slog.String("addr", multiaddr.String()),
|
|
slog.Bool("allowed", ok),
|
|
)
|
|
|
|
return ok
|
|
}
|
|
|
|
func (c *ConnectionGater) InterceptAccept(multiaddrs network.ConnMultiaddrs) bool {
|
|
// enforce this connection is being accepted over one of the provided interfaces
|
|
ok, err := c.resolver.IsReachable(multiaddrs.RemoteMultiaddr(), c.interfaces)
|
|
if err != nil {
|
|
slog.Error(
|
|
"failed to check if remote multiaddr is reachable",
|
|
slog.String("addr", multiaddrs.RemoteMultiaddr().String()),
|
|
slog.Any("err", err),
|
|
)
|
|
}
|
|
|
|
slog.Debug(
|
|
"accept interception result",
|
|
slog.String("addr", multiaddrs.RemoteMultiaddr().String()),
|
|
slog.Bool("allowed", ok),
|
|
)
|
|
|
|
return ok
|
|
}
|
|
|
|
func (c *ConnectionGater) InterceptSecured(_ network.Direction, _ peer.ID, _ network.ConnMultiaddrs) bool {
|
|
return true
|
|
}
|
|
|
|
func (c *ConnectionGater) InterceptUpgraded(_ network.Conn) (bool, control.DisconnectReason) {
|
|
return true, 0
|
|
}
|