瀏覽代碼

lib/relay: Correctly get IP from remote addr via proxy (fixes #3223)

Correctly handles addresses, and fixes one more panicing place.

GitHub-Pull-Request: https://github.com/syncthing/syncthing/pull/3230
Jakob Borg 9 年之前
父節點
當前提交
4970bd7f65
共有 2 個文件被更改,包括 10 次插入3 次删除
  1. 9 1
      lib/relay/client/methods.go
  2. 1 2
      lib/relay/client/static.go

+ 9 - 1
lib/relay/client/methods.go

@@ -55,7 +55,7 @@ func GetInvitationFromRelay(uri *url.URL, id syncthingprotocol.DeviceID, certs [
 		l.Debugln("Received invitation", msg, "via", conn.LocalAddr())
 		ip := net.IP(msg.Address)
 		if len(ip) == 0 || ip.IsUnspecified() {
-			msg.Address = conn.RemoteAddr().(*net.TCPAddr).IP[:]
+			msg.Address = remoteIPBytes(conn)
 		}
 		return msg, nil
 	default:
@@ -144,3 +144,11 @@ func configForCerts(certs []tls.Certificate) *tls.Config {
 		},
 	}
 }
+
+func remoteIPBytes(conn net.Conn) []byte {
+	addr := conn.RemoteAddr().String()
+	if host, _, err := net.SplitHostPort(addr); err == nil {
+		addr = host
+	}
+	return net.ParseIP(addr)[:]
+}

+ 1 - 2
lib/relay/client/static.go

@@ -122,8 +122,7 @@ func (c *staticClient) Serve() {
 			case protocol.SessionInvitation:
 				ip := net.IP(msg.Address)
 				if len(ip) == 0 || ip.IsUnspecified() {
-					ip := net.ParseIP(c.conn.RemoteAddr().String())
-					msg.Address = ip[:]
+					msg.Address = remoteIPBytes(c.conn)
 				}
 				c.invitations <- msg