Pull request 2018: 6231 filter local addrs
Merge in DNS/adguard-home from 6231-filter-local-addrs to master Updates #6231. Squashed commit of the following: commit 9a60d4e33f25c7dd7eaa4366d8397389196156ac Author: Eugene Burkov <E.Burkov@AdGuard.COM> Date: Thu Sep 28 18:59:51 2023 +0300 dnsforward: imp code commit f0c3452525c227b0ee6e761c4a6b68543900d5b5 Author: Eugene Burkov <E.Burkov@AdGuard.COM> Date: Wed Sep 27 18:12:47 2023 +0300 all: don't match nets commit 572dc0f24e74560adaa4d89ddc921dfd7e1fed02 Author: Eugene Burkov <E.Burkov@AdGuard.COM> Date: Wed Sep 27 13:37:48 2023 +0300 dnsforward: move some code, rm dups commit 3af627ce9c7f6f4d2aa695a7660b8a0027fa241c Author: Eugene Burkov <E.Burkov@AdGuard.COM> Date: Mon Sep 25 19:21:05 2023 +0300 dnsforward: imp naming commit cad1e4e71662836d1dfc79bc2979599b7a29fea1 Author: Eugene Burkov <E.Burkov@AdGuard.COM> Date: Mon Sep 25 19:17:53 2023 +0300 dnsforward: imp code commit 23d69700789d5652bd25cc089f16afb8b38e51f8 Author: Eugene Burkov <E.Burkov@AdGuard.COM> Date: Mon Sep 25 19:08:48 2023 +0300 dnsforward: add upstream matcher commit 5819c594a2a8d8bf2cd42883133e21ca7ed2681a Author: Eugene Burkov <E.Burkov@AdGuard.COM> Date: Fri Sep 22 18:31:37 2023 +0300 all: imp code, docs commit d07ea96bb568161e029e22d69329a368d9eeb729 Author: Eugene Burkov <E.Burkov@AdGuard.COM> Date: Fri Sep 22 18:09:09 2023 +0300 all: imp code commit 38a912a62c63247c4c5bb61b67ccc9bfd255feff Author: Eugene Burkov <E.Burkov@AdGuard.COM> Date: Fri Sep 22 15:48:25 2023 +0300 all: imp code commit 811212fa16bc231a8da990c075d7231c471c7e3b Author: Eugene Burkov <E.Burkov@AdGuard.COM> Date: Thu Sep 21 19:05:07 2023 +0300 all: imp addrs detection
This commit is contained in:
@@ -9,6 +9,7 @@ import (
|
||||
"io"
|
||||
"net"
|
||||
"net/netip"
|
||||
"net/url"
|
||||
"syscall"
|
||||
|
||||
"github.com/AdguardTeam/AdGuardHome/internal/aghos"
|
||||
@@ -263,7 +264,7 @@ func IsAddrInUse(err error) (ok bool) {
|
||||
|
||||
// CollectAllIfacesAddrs returns the slice of all network interfaces IP
|
||||
// addresses without port number.
|
||||
func CollectAllIfacesAddrs() (addrs []string, err error) {
|
||||
func CollectAllIfacesAddrs() (addrs []netip.Addr, err error) {
|
||||
var ifaceAddrs []net.Addr
|
||||
ifaceAddrs, err = netInterfaceAddrs()
|
||||
if err != nil {
|
||||
@@ -271,19 +272,41 @@ func CollectAllIfacesAddrs() (addrs []string, err error) {
|
||||
}
|
||||
|
||||
for _, addr := range ifaceAddrs {
|
||||
cidr := addr.String()
|
||||
var ip net.IP
|
||||
ip, _, err = net.ParseCIDR(cidr)
|
||||
var p netip.Prefix
|
||||
p, err = netip.ParsePrefix(addr.String())
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("parsing cidr: %w", err)
|
||||
// Don't wrap the error since it's informative enough as is.
|
||||
return nil, err
|
||||
}
|
||||
|
||||
addrs = append(addrs, ip.String())
|
||||
addrs = append(addrs, p.Addr())
|
||||
}
|
||||
|
||||
return addrs, nil
|
||||
}
|
||||
|
||||
// ParseAddrPort parses an [netip.AddrPort] from s, which should be either a
|
||||
// valid IP, optionally with port, or a valid URL with plain IP address. The
|
||||
// defaultPort is used if s doesn't contain port number.
|
||||
func ParseAddrPort(s string, defaultPort uint16) (ipp netip.AddrPort, err error) {
|
||||
u, err := url.Parse(s)
|
||||
if err == nil && u.Host != "" {
|
||||
s = u.Host
|
||||
}
|
||||
|
||||
ipp, err = netip.ParseAddrPort(s)
|
||||
if err != nil {
|
||||
ip, parseErr := netip.ParseAddr(s)
|
||||
if parseErr != nil {
|
||||
return ipp, errors.Join(err, parseErr)
|
||||
}
|
||||
|
||||
return netip.AddrPortFrom(ip, defaultPort), nil
|
||||
}
|
||||
|
||||
return ipp, nil
|
||||
}
|
||||
|
||||
// BroadcastFromPref calculates the broadcast IP address for p.
|
||||
func BroadcastFromPref(p netip.Prefix) (bc netip.Addr) {
|
||||
bc = p.Addr().Unmap()
|
||||
|
||||
@@ -230,7 +230,7 @@ func TestCollectAllIfacesAddrs(t *testing.T) {
|
||||
name string
|
||||
wantErrMsg string
|
||||
addrs []net.Addr
|
||||
wantAddrs []string
|
||||
wantAddrs []netip.Addr
|
||||
}{{
|
||||
name: "success",
|
||||
wantErrMsg: ``,
|
||||
@@ -241,10 +241,13 @@ func TestCollectAllIfacesAddrs(t *testing.T) {
|
||||
IP: net.IP{4, 3, 2, 1},
|
||||
Mask: net.CIDRMask(16, netutil.IPv4BitLen),
|
||||
}},
|
||||
wantAddrs: []string{"1.2.3.4", "4.3.2.1"},
|
||||
wantAddrs: []netip.Addr{
|
||||
netip.MustParseAddr("1.2.3.4"),
|
||||
netip.MustParseAddr("4.3.2.1"),
|
||||
},
|
||||
}, {
|
||||
name: "not_cidr",
|
||||
wantErrMsg: `parsing cidr: invalid CIDR address: 1.2.3.4`,
|
||||
wantErrMsg: `netip.ParsePrefix("1.2.3.4"): no '/'`,
|
||||
addrs: []net.Addr{&net.IPAddr{
|
||||
IP: net.IP{1, 2, 3, 4},
|
||||
}},
|
||||
@@ -269,12 +272,11 @@ func TestCollectAllIfacesAddrs(t *testing.T) {
|
||||
|
||||
t.Run("internal_error", func(t *testing.T) {
|
||||
const errAddrs errors.Error = "can't get addresses"
|
||||
const wantErrMsg string = `getting interfaces addresses: ` + string(errAddrs)
|
||||
|
||||
substNetInterfaceAddrs(t, func() ([]net.Addr, error) { return nil, errAddrs })
|
||||
|
||||
_, err := CollectAllIfacesAddrs()
|
||||
testutil.AssertErrorMsg(t, wantErrMsg, err)
|
||||
assert.ErrorIs(t, err, errAddrs)
|
||||
})
|
||||
}
|
||||
|
||||
|
||||
@@ -2,10 +2,15 @@ package aghnet_test
|
||||
|
||||
import (
|
||||
"io/fs"
|
||||
"net/netip"
|
||||
"net/url"
|
||||
"os"
|
||||
"testing"
|
||||
|
||||
"github.com/AdguardTeam/AdGuardHome/internal/aghnet"
|
||||
"github.com/AdguardTeam/golibs/netutil"
|
||||
"github.com/AdguardTeam/golibs/testutil"
|
||||
"github.com/stretchr/testify/assert"
|
||||
)
|
||||
|
||||
func TestMain(m *testing.M) {
|
||||
@@ -14,3 +19,76 @@ func TestMain(m *testing.M) {
|
||||
|
||||
// testdata is the filesystem containing data for testing the package.
|
||||
var testdata fs.FS = os.DirFS("./testdata")
|
||||
|
||||
func TestParseAddrPort(t *testing.T) {
|
||||
const defaultPort = 1
|
||||
|
||||
v4addr := netip.MustParseAddr("1.2.3.4")
|
||||
|
||||
testCases := []struct {
|
||||
name string
|
||||
input string
|
||||
wantErrMsg string
|
||||
want netip.AddrPort
|
||||
}{{
|
||||
name: "success_ip",
|
||||
input: v4addr.String(),
|
||||
wantErrMsg: "",
|
||||
want: netip.AddrPortFrom(v4addr, defaultPort),
|
||||
}, {
|
||||
name: "success_ip_port",
|
||||
input: netutil.JoinHostPort(v4addr.String(), 5),
|
||||
wantErrMsg: "",
|
||||
want: netip.AddrPortFrom(v4addr, 5),
|
||||
}, {
|
||||
name: "success_url",
|
||||
input: (&url.URL{
|
||||
Scheme: "tcp",
|
||||
Host: v4addr.String(),
|
||||
}).String(),
|
||||
wantErrMsg: "",
|
||||
want: netip.AddrPortFrom(v4addr, defaultPort),
|
||||
}, {
|
||||
name: "success_url_port",
|
||||
input: (&url.URL{
|
||||
Scheme: "tcp",
|
||||
Host: netutil.JoinHostPort(v4addr.String(), 5),
|
||||
}).String(),
|
||||
wantErrMsg: "",
|
||||
want: netip.AddrPortFrom(v4addr, 5),
|
||||
}, {
|
||||
name: "error_invalid_ip",
|
||||
input: "256.256.256.256",
|
||||
wantErrMsg: `not an ip:port
|
||||
ParseAddr("256.256.256.256"): IPv4 field has value >255`,
|
||||
want: netip.AddrPort{},
|
||||
}, {
|
||||
name: "error_invalid_port",
|
||||
input: netutil.JoinHostPort(v4addr.String(), -5),
|
||||
wantErrMsg: `invalid port "-5" parsing "1.2.3.4:-5"
|
||||
ParseAddr("1.2.3.4:-5"): unexpected character (at ":-5")`,
|
||||
want: netip.AddrPort{},
|
||||
}, {
|
||||
name: "error_invalid_url",
|
||||
input: "tcp:://1.2.3.4",
|
||||
wantErrMsg: `invalid port "//1.2.3.4" parsing "tcp:://1.2.3.4"
|
||||
ParseAddr("tcp:://1.2.3.4"): each colon-separated field must have at least ` +
|
||||
`one digit (at "tcp:://1.2.3.4")`,
|
||||
want: netip.AddrPort{},
|
||||
}, {
|
||||
name: "empty",
|
||||
input: "",
|
||||
want: netip.AddrPort{},
|
||||
wantErrMsg: `not an ip:port
|
||||
ParseAddr(""): unable to parse IP`,
|
||||
}}
|
||||
|
||||
for _, tc := range testCases {
|
||||
t.Run(tc.name, func(t *testing.T) {
|
||||
ap, err := aghnet.ParseAddrPort(tc.input, defaultPort)
|
||||
testutil.AssertErrorMsg(t, tc.wantErrMsg, err)
|
||||
|
||||
assert.Equal(t, tc.want, ap)
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
@@ -138,7 +138,7 @@ func (sr *systemResolvers) getAddrs() (addrs []string, err error) {
|
||||
|
||||
// Don't close StdoutPipe since Wait do it for us in ¿most? cases.
|
||||
//
|
||||
// See go doc os/exec.Cmd.StdoutPipe.
|
||||
// See [exec.Cmd.StdoutPipe].
|
||||
|
||||
return addrs, nil
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user