fixed net.FindGateway if there's a VPN interface active

This commit is contained in:
evilsocket 2018-05-03 13:03:52 +02:00
commit 5041267be9
No known key found for this signature in database
GPG key ID: 1564D7F30393A456
3 changed files with 18 additions and 56 deletions

View file

@ -1,7 +1,6 @@
package network package network
import ( import (
"net"
"testing" "testing"
) )
@ -14,16 +13,8 @@ func buildExampleLAN() *LAN {
} }
func buildExampleEndpoint() *Endpoint { func buildExampleEndpoint() *Endpoint {
ifaces, _ := net.Interfaces() iface, _ := FindInterface("")
var exampleIface net.Interface return iface
for _, iface := range ifaces {
if iface.HardwareAddr != nil {
exampleIface = iface
break
}
}
foundEndpoint, _ := FindInterface(exampleIface.Name)
return foundEndpoint
} }
func TestNewLAN(t *testing.T) { func TestNewLAN(t *testing.T) {

View file

@ -14,21 +14,24 @@ func FindGateway(iface *Endpoint) (*Endpoint, error) {
return nil, err return nil, err
} }
ifName := iface.Name()
for _, line := range strings.Split(output, "\n") { for _, line := range strings.Split(output, "\n") {
m := IPv4RouteParser.FindStringSubmatch(line) if strings.Contains(line, ifName) {
if len(m) == IPv4RouteTokens { m := IPv4RouteParser.FindStringSubmatch(line)
return IPv4RouteIsGateway(iface.Name(), m, func(gateway string) (*Endpoint, error) { if len(m) == IPv4RouteTokens {
if gateway == iface.IpAddress { return IPv4RouteIsGateway(ifName, m, func(gateway string) (*Endpoint, error) {
return iface, nil if gateway == iface.IpAddress {
} else { return iface, nil
// we have the address, now we need its mac } else {
mac, err := ArpLookup(iface.Name(), gateway, false) // we have the address, now we need its mac
if err != nil { mac, err := ArpLookup(ifName, gateway, false)
return nil, err if err != nil {
return nil, err
}
return NewEndpoint(gateway, mac), nil
} }
return NewEndpoint(gateway, mac), nil })
} }
})
} }
} }

View file

@ -87,38 +87,6 @@ func TestFindInterfaceByName(t *testing.T) {
} }
} }
func TestMatchByAddress(t *testing.T) {
ifaces, err := net.Interfaces()
if err != nil {
t.Error(err)
}
if len(ifaces) <= 0 {
t.Error("Unable to find any network interfaces to run test with.")
}
var exampleIface net.Interface
// emulate libpcap's pcap_lookupdev function to find
// default interface to test with ( maybe could use loopback ? )
for _, iface := range ifaces {
if iface.HardwareAddr != nil {
exampleIface = iface
break
}
}
// check match by mac address
if !matchByAddress(exampleIface, exampleIface.HardwareAddr.String()) {
t.Error("unable to verify a match with a given interface and mac address")
}
addrs, err := exampleIface.Addrs()
if err != nil || len(addrs) <= 0 {
t.Error("Unable to find any ip addresses to run test with interface:", exampleIface.Name)
}
// check match by ip address
if !matchByAddress(exampleIface, addrs[0].String()) {
t.Error("unable to verify a match with a given interface and ip address")
}
}
func TestFindInterface(t *testing.T) { func TestFindInterface(t *testing.T) {
ifaces, err := net.Interfaces() ifaces, err := net.Interfaces()
if err != nil { if err != nil {