From 4970bd7f6552419dddc9c63f20aa1f1da7eabba3 Mon Sep 17 00:00:00 2001 From: Jakob Borg Date: Tue, 31 May 2016 14:42:10 +0000 Subject: [PATCH] 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 --- lib/relay/client/methods.go | 10 +++++++++- lib/relay/client/static.go | 3 +-- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/lib/relay/client/methods.go b/lib/relay/client/methods.go index 3376e1d24..6e4f1213e 100644 --- a/lib/relay/client/methods.go +++ b/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)[:] +} diff --git a/lib/relay/client/static.go b/lib/relay/client/static.go index cebc5f688..123a6339a 100644 --- a/lib/relay/client/static.go +++ b/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