Explorar o código

Add common.GetRoutableInterfaceIPAddresses

- Attempt to find and use any Internet network
  interface, instead of hard-coding "eth0" and
  "en0".
Rod Hynes %!s(int64=6) %!d(string=hai) anos
pai
achega
40baeb4d0c

+ 20 - 1
psiphon/common/networkInterface.go

@@ -69,5 +69,24 @@ func GetInterfaceIPAddresses(interfaceName string) (net.IP, net.IP, error) {
 		return IPv4Address, IPv6Address, nil
 	}
 
-	return nil, nil, errors.Tracef("Could not find any IP address for interface %s", interfaceName)
+	return nil, nil, errors.Tracef("could not find any IP address for interface %s", interfaceName)
+}
+
+// GetRoutableInterfaceIPAddresses returns GetInterfaceIPAddresses values for
+// the first non-loopback, non-point-to-point network interface on the host.
+func GetRoutableInterfaceIPAddresses() (net.IP, net.IP, error) {
+
+	interfaces, err := net.Interfaces()
+	if err != nil {
+		return nil, nil, errors.Trace(err)
+	}
+
+	for _, in := range interfaces {
+		if (in.Flags&net.FlagUp == 0) ||
+			(in.Flags&(net.FlagLoopback|net.FlagPointToPoint)) != 0 {
+			continue
+		}
+		return GetInterfaceIPAddresses(in.Name)
+	}
+	return nil, nil, errors.TraceNew("no candidate interfaces found")
 }

+ 7 - 13
psiphon/remoteServerList_test.go

@@ -68,22 +68,16 @@ func testObfuscatedRemoteServerLists(t *testing.T, omitMD5Sums bool) {
 	// create a server
 	//
 
-	serverIPAddress := ""
-	for _, interfaceName := range []string{"eth0", "en0"} {
-		var serverIPv4Address, serverIPv6Address net.IP
-		serverIPv4Address, serverIPv6Address, err = common.GetInterfaceIPAddresses(interfaceName)
-		if err == nil {
-			if serverIPv4Address != nil {
-				serverIPAddress = serverIPv4Address.String()
-			} else {
-				serverIPAddress = serverIPv6Address.String()
-			}
-			break
-		}
-	}
+	serverIPv4Address, serverIPv6Address, err := common.GetRoutableInterfaceIPAddresses()
 	if err != nil {
 		t.Fatalf("error getting server IP address: %s", err)
 	}
+	serverIPAddress := ""
+	if serverIPv4Address != nil {
+		serverIPAddress = serverIPv4Address.String()
+	} else {
+		serverIPAddress = serverIPv6Address.String()
+	}
 
 	serverConfigJSON, _, _, _, encodedServerEntry, err := server.GenerateConfig(
 		&server.GenerateConfigParams{

+ 6 - 13
psiphon/server/server_test.go

@@ -57,23 +57,16 @@ var mockWebServerPort = 8080
 func TestMain(m *testing.M) {
 	flag.Parse()
 
-	var err error
-	for _, interfaceName := range []string{"eth0", "en0"} {
-		var serverIPv4Address, serverIPv6Address net.IP
-		serverIPv4Address, serverIPv6Address, err = common.GetInterfaceIPAddresses(interfaceName)
-		if err == nil {
-			if serverIPv4Address != nil {
-				serverIPAddress = serverIPv4Address.String()
-			} else {
-				serverIPAddress = serverIPv6Address.String()
-			}
-			break
-		}
-	}
+	serverIPv4Address, serverIPv6Address, err := common.GetRoutableInterfaceIPAddresses()
 	if err != nil {
 		fmt.Printf("error getting server IP address: %s\n", err)
 		os.Exit(1)
 	}
+	if serverIPv4Address != nil {
+		serverIPAddress = serverIPv4Address.String()
+	} else {
+		serverIPAddress = serverIPv6Address.String()
+	}
 
 	testDataDirName, err = ioutil.TempDir("", "psiphon-server-test")
 	if err != nil {

+ 8 - 15
psiphon/userAgent_test.go

@@ -23,7 +23,6 @@ import (
 	"context"
 	"fmt"
 	"io/ioutil"
-	"net"
 	"net/http"
 	"os"
 	"sync"
@@ -160,26 +159,20 @@ func attemptConnectionsWithUserAgent(
 
 	// create a server entry
 
-	serverIPaddress := ""
-	for _, interfaceName := range []string{"eth0", "en0"} {
-		var serverIPv4Address, serverIPv6Address net.IP
-		serverIPv4Address, serverIPv6Address, err = common.GetInterfaceIPAddresses(interfaceName)
-		if err == nil {
-			if serverIPv4Address != nil {
-				serverIPaddress = serverIPv4Address.String()
-			} else {
-				serverIPaddress = serverIPv6Address.String()
-			}
-			break
-		}
-	}
+	serverIPv4Address, serverIPv6Address, err := common.GetRoutableInterfaceIPAddresses()
 	if err != nil {
 		t.Fatalf("error getting server IP address: %s", err)
 	}
+	serverIPAddress := ""
+	if serverIPv4Address != nil {
+		serverIPAddress = serverIPv4Address.String()
+	} else {
+		serverIPAddress = serverIPv6Address.String()
+	}
 
 	_, _, _, _, encodedServerEntry, err := server.GenerateConfig(
 		&server.GenerateConfigParams{
-			ServerIPAddress:      serverIPaddress,
+			ServerIPAddress:      serverIPAddress,
 			EnableSSHAPIRequests: true,
 			WebServerPort:        8000,
 			TunnelProtocolPorts:  map[string]int{tunnelProtocol: 4000},