Archived
protocol: Add "Hello" message at connection start, also for unauthed peers
This commit is contained in:
1 parent
1d17891286
commit
b4f9a55e6e
9 files changed
+267
-139
No files matched your search
@@ -130,14 +130,14 @@
|
||||
</div>
|
||||
<div class="panel-body">
|
||||
<p>
|
||||
<span translate translate-value-device="{{ device }}" translate-value-address="{{ event.data.address }}">
|
||||
Device {%device%} ({%address%}) wants to connect. Add new device?
|
||||
<span translate translate-value-device="{{ device }}" translate-value-address="{{ event.data.address }}" translate-value-name="{{ event.data.name }}">
|
||||
Device "{%name%}" ({%device%} at {%address%}) wants to connect. Add new device?
|
||||
</span>
|
||||
</p>
|
||||
</div>
|
||||
<div class="panel-footer clearfix">
|
||||
<div class="pull-right">
|
||||
<button type="button" class="btn btn-sm btn-success" ng-click="addDevice(device)">
|
||||
<button type="button" class="btn btn-sm btn-success" ng-click="addDevice(device, event.data.name)">
|
||||
<span class="fa fa-plus"></span> <span translate>Add Device</span>
|
||||
</button>
|
||||
<button type="button" class="btn btn-sm btn-danger" ng-click="ignoreRejectedDevice(device)">
|
||||
|
||||
@@ -977,13 +977,14 @@ angular.module('syncthing.core')
|
||||
$('#idqr').modal('show');
|
||||
};
|
||||
|
||||
$scope.addDevice = function (deviceID) {
|
||||
$scope.addDevice = function (deviceID, name) {
|
||||
return $http.get(urlbase + '/system/discovery')
|
||||
.success(function (registry) {
|
||||
$scope.discovery = registry;
|
||||
})
|
||||
.then(function () {
|
||||
$scope.currentDevice = {
|
||||
name: name,
|
||||
deviceID: deviceID,
|
||||
_addressesStr: 'dynamic',
|
||||
compression: 'metadata',
|
||||
|
||||
@@ -5,7 +5,7 @@ import (
|
||||
)
|
||||
|
||||
const (
|
||||
AssetsBuildDate = "Fri, 25 Mar 2016 16:55:58 GMT"
|
||||
AssetsBuildDate = "Fri, 25 Mar 2016 20:29:12 GMT"
|
||||
)
|
||||
|
||||
func Assets() map[string][]byte {
|
||||
@@ -57,7 +57,7 @@ func Assets() map[string][]byte {
|
||||
assets["default/assets/lang/lang-zh-TW.json"], _ = base64.StdEncoding.DecodeString("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 truncated
|
||||
assets["default/assets/lang/prettyprint.js"], _ = base64.StdEncoding.DecodeString("H4sIAAAJbogA/1ySX27bMAzG33cKIU8uMF9gwIDN6Z9tGbLATdtnNWZtzjIVUFKCZNhxdpJdbKTktd2ezO/3USb9yQfLxlnqNwwxnvaMFM1782Px2C/eLZrkestoafF2sbMCljZaN8sPB+uAdviKm+p+ZnShPUGtM+wGEZ32XVrCkBWIugGe8svAqWKAUQWJuKLelU6g+qZ5Iaa6I4zQmRVS3/lJ54DOud3/fTeE+ur2hZhKCswLPaHga6S58YlVsixcVL38+AxMtbRkO5uPnQQ/QIjAZK4ZQ0lkSII/JXqOCDsBn6nzBHMLRiWSTZHfNYMvVvaCAKJHX69aQSvPoOnlp050eu4rxiHJJ+Sj9Chk7fkIvQDT+HH6/cupodldppi/geifrvWJPAcNda9dGz9nuo9102bAMfVJljFVw/aM7qK4m+1/bqlt9tnX7TfxWz/l7Uw1V9nUUNoU5gDCQS/iCF0ZHDXxbeKxyDSKvBtZrqe0H/SC7hEi2alEdB7q5Vp/owEpb6JFniTO9uG1s7V41B/v55s/AAAA//8BAAD//5xBm9LVAgAA")
|
||||
assets["default/assets/lang/valid-langs.js"], _ = base64.StdEncoding.DecodeString("H4sIAAAJbogA/yTNQa6CMBSF4flbBen43SWYKMQ40KhBEgfGQaEVKk0hbWmiq/eeMvn+QpPTJH2RpDXqJF0fik3xEG0v/kUnM1u+064z+SswCielGW2By9ChREOG9jfuywCfoWqHfphhYYwCkXljbpzoWHMt/rgWYNthe8ZpjlTWa68N109UX1CMhcREPLSMTMK734Gq89rmLp5/PwAAAP//AQAA//9XuqUn5gAAAA==")
|
||||
assets["default/index.html"], _ = base64.StdEncoding.DecodeString("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 truncated
|
||||
assets["default/index.html"], _ = base64.StdEncoding.DecodeString("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 truncated
|
||||
assets["default/modal.html"], _ = base64.StdEncoding.DecodeString("H4sIAAAJbogA/3RST0/cPhC9/z7F/HLogkQ2gDjRXaoWqVIlKiHBpceJPUlcHDuyJ9BtlO/eibNNYbUcEv97783Mm9lo8wzKYozbrPUaLVSoKQPG0jhNv7ZZfpGBq3NkDrlGxrxE9aSD77bZMAjVR4JPwKEnuIZVZGSjVjCOB6wn2pUeg06sL95bQneS2KcT+OY/gM3/eS5LUcCt73bB1A3Dye0pXJ5fXMFjQ/Cwc4ob42r43HPjQ1wn+Mx5bEyEB98HRcLXBF99aEHuYl/+JMXAHlhEmEIbwVfp8N3/NtYi3PelNWoWujOKXKQzeF7D5fp8Dd8qQFCS0sK6v4MXjOA8gzaRgyl7Jg0vhhsBSMzKWDqb5X74HhQ68CWjkcURIEPD3F0XRTvHX/tQF6JaSLxiKirPkyGHzcm1QevrZO3+fljNL7ZeXYPFUNNs5jG28o7J8f79GKIh6X4AtBR4/ufDMPW0j+O48ITZXL0lsmFLrwACiZ1ULYmaapsZCZ39ZVQoQya60+Wkuikm6GvuMCS9cfwXsGiulrQLyfv9Gkqvd8khDuiisr2m95n7/NIgZm91Ku9lVl4XLV1m74B3HW2z+bBwSnYgX66pwt5y2sc2gzT8MiStWZSP2PTGGTYtxcWWD66M3ccZliqyyHRzOyV8aNymmJM6Uu6y3W/2yx8AAAD//wEAAP//qvxG6f8DAAA=")
|
||||
assets["default/syncthing/app.js"], _ = base64.StdEncoding.DecodeString("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")
|
||||
assets["default/syncthing/core/aboutModalDirective.js"], _ = base64.StdEncoding.DecodeString("H4sIAAAJbogA/1SOMQ7CMAxF954im1upSnc6cQBG2ENqWktOglwHhFDvTgpSgT/+/yw/F8fMTmxIQ2asYX5ErxPF0fokCE1lSuxAgl7pVgB3TlkPaXAMrbnkQlOKpm7M842uEdQs8af4lLMKed0Z2EP7NymGKzvFo3BZN4NuNei+/06EdztpYNiul75amr56AQAA//8BAAD//xLf4CHFAAAA")
|
||||
@@ -87,7 +87,7 @@ func Assets() map[string][]byte {
|
||||
assets["default/syncthing/core/selectOnClickDirective.js"], _ = base64.StdEncoding.DecodeString("H4sIAAAJbogA/3SQQWvEIBCF7/srPBRiIEjPXXooe2+hPZYeRKeprJkpo2YpJf+9atLdJWzeSZ/z+Z5q7JPXrAayyYNswg+a+OWwV4YYmnYnspR1DCa6sQyAz8sXPHhnjk0nPlMGHKGQdyeHlk6t+K1QEUNMjFdGkXd4fLjigqFv6ES+dwCMndAxcmhXUNEyoQhlY1bx8hZQNGoWc+cS9iiWlqqH+PZvy3a/yXL+IcicJZNqumHQEV6LvcVVRs2pz2ThQBgzGuTygvf7jw3y3FQxDDTCk/c1KWxFXQBt7Vyqpt8Yn1bedN5N+105/AMAAP//AQAA//+SF+4JDAIAAA==")
|
||||
assets["default/syncthing/core/shutdownDialogDirective.js"], _ = base64.StdEncoding.DecodeString("H4sIAAAJbogA/1SOwQqDQAxE737F3qIg672eCv2F9r6sqQZitsRspRT/vdqC1DnOTDIvSJ85qB9TlxlLmF4SbSDpfUyKUBVule9IMRo9t8KQrUuzXChw6qF297xeUBJXVu79rW9StKzyZ/zMyZSinRycoT5EhuODg+FVeU13imajaI6bN8LZDzYy7B+WtliqtvgAAAD//wEAAP//3qFOo80AAAA=")
|
||||
assets["default/syncthing/core/shutdownDialogView.html"], _ = base64.StdEncoding.DecodeString("H4sIAAAJbogA/0TOTaqDMBAH8PXzFMNsXL16gZhNj+AJ0jjWQJwJzgQp1ru3lkK3P/h/uEXGkCGNPepcbZSNEdSCVX1LjZFUEVIU7rHIRuu/TBOCJcvU4763wzcFV1lKJqMWnmBrYM3B6DjQN3+u/MQPD442J77DHBRuRAznMpwlF9cV37juc8o3LwAAAP//AQAA//99X8KxnQAAAA==")
|
||||
assets["default/syncthing/core/syncthingController.js"], _ = base64.StdEncoding.DecodeString("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 truncated
|
||||
assets["default/syncthing/core/syncthingController.js"], _ = base64.StdEncoding.DecodeString("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 truncated
|
||||
assets["default/syncthing/core/tooltipDirective.js"], _ = base64.StdEncoding.DecodeString("H4sIAAAJbogA/2SOQc6DIBCF956CxZ8ACeEAuvqPYnGqpDiYYWjSNN690JpG67fjvY8HPY459GTnOOQASqYHOp48jtZFAqkbUbCDJ3Ds70XgGAP7RRpxzUX1EYXS4vn2KgScCXfBJ0xM3nEr5L80hyp4vLW7reTiAkZAgBmQjei53LxkhqR/Rit/ahO13T6mzlJl4jmU15kyyJOw6u6Qrd/T2jW1fAEAAP//AQAA//8HeGTKJgEAAA==")
|
||||
assets["default/syncthing/core/uniqueFolderDirective.js"], _ = base64.StdEncoding.DecodeString("H4sIAAAJbogA/7SSwW4yMQyE7zyFD7+0IK3CHc5/b1V74h5tvKzVkIDtQFHFuzdhUaGwtJWqzgVp4vkYW2vDMnnLZhVd8jiuZB8a7SgsTRMZq8kIsowjxkZpmwdSoE3Ch+gdclVDm/I8xQDjCbwdh4sYNXG4MHpzkzJnBlVYPkaHvqo/vXsKL7MLoDRxjTWgX9VgVVlqaJT95ApbVHzzb21ZkMWkIB21Oj6jtoS7hfUJh8JF1J7+z6Ajzev/fyUpv/cCRdMp7BCki8m7UClsrSdnFe8G+pqCuiiTpPubcyrnjvNBwCFfQvCiaXsMiemsPO3CM2ePM/K86zfdtUPoGYBlWwHrGa3b/6J/a3PHrxf4aScS6OF/dM5B9/ThftzwNnu44p05h/moPL4DAAD//wEAAP//r65WJ1IDAAA=")
|
||||
assets["default/syncthing/core/upgradingDialogDirective.js"], _ = base64.StdEncoding.DecodeString("H4sIAAAJbogA/1yOwQrCMBBE7/2K3LaFkt7tSfAX9B7SNV3YJmW7UUT676YKRZ3jzNudcTFkdmKnNGTGGpZH9DpSDNYnQWgqU2QHEvRKtwLkOYgbCnAixylAa665nFCKpm7M881vEtQs8cv4mIsKeT0YOEL7EylOMzvFs3BJ9xndNqP7K70Q3u2oE8P+Yu2rtemrFwAAAP//AQAA//99zQ2GzwAAAA==")
|
||||
|
||||
@@ -8,6 +8,7 @@ package connections
|
||||
|
||||
import (
|
||||
"crypto/tls"
|
||||
"encoding/binary"
|
||||
"fmt"
|
||||
"io"
|
||||
"net"
|
||||
@@ -18,7 +19,6 @@ import (
|
||||
"github.com/juju/ratelimit"
|
||||
"github.com/syncthing/syncthing/lib/config"
|
||||
"github.com/syncthing/syncthing/lib/discover"
|
||||
"github.com/syncthing/syncthing/lib/events"
|
||||
"github.com/syncthing/syncthing/lib/model"
|
||||
"github.com/syncthing/syncthing/lib/protocol"
|
||||
"github.com/syncthing/syncthing/lib/relay"
|
||||
@@ -39,9 +39,11 @@ var (
|
||||
|
||||
type Model interface {
|
||||
protocol.Model
|
||||
AddConnection(conn model.Connection)
|
||||
AddConnection(conn model.Connection, hello protocol.HelloMessage)
|
||||
ConnectedTo(remoteID protocol.DeviceID) bool
|
||||
IsPaused(remoteID protocol.DeviceID) bool
|
||||
OnHello(protocol.DeviceID, net.Addr, protocol.HelloMessage)
|
||||
GetHello(protocol.DeviceID) protocol.HelloMessage
|
||||
}
|
||||
|
||||
// Service listens on TLS and dials configured unconnected devices. Successful
|
||||
@@ -144,14 +146,14 @@ func NewConnectionService(cfg *config.Wrapper, myID protocol.DeviceID, mdl Model
|
||||
func (s *Service) handle() {
|
||||
next:
|
||||
for c := range s.conns {
|
||||
cs := c.Conn.ConnectionState()
|
||||
cs := c.ConnectionState()
|
||||
|
||||
// We should have negotiated the next level protocol "bep/1.0" as part
|
||||
// of the TLS handshake. Unfortunately this can't be a hard error,
|
||||
// because there are implementations out there that don't support
|
||||
// protocol negotiation (iOS for one...).
|
||||
if !cs.NegotiatedProtocolIsMutual || cs.NegotiatedProtocol != s.bepProtocolName {
|
||||
l.Infof("Peer %s did not negotiate bep/1.0", c.Conn.RemoteAddr())
|
||||
l.Infof("Peer %s did not negotiate bep/1.0", c.RemoteAddr())
|
||||
}
|
||||
|
||||
// We should have received exactly one certificate from the other
|
||||
@@ -159,8 +161,8 @@ next:
|
||||
// connection.
|
||||
certs := cs.PeerCertificates
|
||||
if cl := len(certs); cl != 1 {
|
||||
l.Infof("Got peer certificate list of length %d != 1 from %s; protocol error", cl, c.Conn.RemoteAddr())
|
||||
c.Conn.Close()
|
||||
l.Infof("Got peer certificate list of length %d != 1 from %s; protocol error", cl, c.RemoteAddr())
|
||||
c.Close()
|
||||
continue
|
||||
}
|
||||
remoteCert := certs[0]
|
||||
@@ -171,10 +173,19 @@ next:
|
||||
// clients between the same NAT gateway, and global discovery.
|
||||
if remoteID == s.myID {
|
||||
l.Infof("Connected to myself (%s) - should not happen", remoteID)
|
||||
c.Conn.Close()
|
||||
c.Close()
|
||||
continue
|
||||
}
|
||||
|
||||
hello, err := exchangeHello(c, s.model.GetHello(remoteID))
|
||||
if err != nil {
|
||||
l.Infof("Failed to exchange Hello messages with %s (%s): %s", remoteID, c.RemoteAddr(), err)
|
||||
c.Close()
|
||||
continue next
|
||||
}
|
||||
|
||||
s.model.OnHello(remoteID, c.RemoteAddr(), hello)
|
||||
|
||||
// If we have a relay connection, and the new incoming connection is
|
||||
// not a relay connection, we should drop that, and prefer the this one.
|
||||
s.mut.RLock()
|
||||
@@ -191,11 +202,11 @@ next:
|
||||
// in parallel we don't want to do that or we end up with no
|
||||
// connections still established...
|
||||
l.Infof("Connected to already connected device (%s)", remoteID)
|
||||
c.Conn.Close()
|
||||
c.Close()
|
||||
continue
|
||||
} else if s.model.IsPaused(remoteID) {
|
||||
l.Infof("Connection from paused device (%s)", remoteID)
|
||||
c.Conn.Close()
|
||||
c.Close()
|
||||
continue
|
||||
}
|
||||
|
||||
@@ -213,15 +224,15 @@ next:
|
||||
// Incorrect certificate name is something the user most
|
||||
// likely wants to know about, since it's an advanced
|
||||
// config. Warn instead of Info.
|
||||
l.Warnf("Bad certificate from %s (%v): %v", remoteID, c.Conn.RemoteAddr(), err)
|
||||
c.Conn.Close()
|
||||
l.Warnf("Bad certificate from %s (%v): %v", remoteID, c.RemoteAddr(), err)
|
||||
c.Close()
|
||||
continue next
|
||||
}
|
||||
|
||||
// If rate limiting is set, and based on the address we should
|
||||
// limit the connection, then we wrap it in a limiter.
|
||||
|
||||
limit := s.shouldLimit(c.Conn.RemoteAddr())
|
||||
limit := s.shouldLimit(c.RemoteAddr())
|
||||
|
||||
wr := io.Writer(c.Conn)
|
||||
if limit && s.writeRateLimit != nil {
|
||||
@@ -233,17 +244,17 @@ next:
|
||||
rd = NewReadLimiter(c.Conn, s.readRateLimit)
|
||||
}
|
||||
|
||||
name := fmt.Sprintf("%s-%s (%s)", c.Conn.LocalAddr(), c.Conn.RemoteAddr(), c.Type)
|
||||
name := fmt.Sprintf("%s-%s (%s)", c.LocalAddr(), c.RemoteAddr(), c.Type)
|
||||
protoConn := protocol.NewConnection(remoteID, rd, wr, s.model, name, deviceCfg.Compression)
|
||||
|
||||
l.Infof("Established secure connection to %s at %s", remoteID, name)
|
||||
l.Debugf("cipher suite: %04X in lan: %t", c.Conn.ConnectionState().CipherSuite, !limit)
|
||||
l.Debugf("cipher suite: %04X in lan: %t", c.ConnectionState().CipherSuite, !limit)
|
||||
|
||||
s.model.AddConnection(model.Connection{
|
||||
c.Conn,
|
||||
c,
|
||||
protoConn,
|
||||
c.Type,
|
||||
})
|
||||
}, hello)
|
||||
s.mut.Lock()
|
||||
s.connType[remoteID] = c.Type
|
||||
s.mut.Unlock()
|
||||
@@ -251,15 +262,8 @@ next:
|
||||
}
|
||||
}
|
||||
|
||||
if !s.cfg.IgnoredDevice(remoteID) {
|
||||
events.Default.Log(events.DeviceRejected, map[string]string{
|
||||
"device": remoteID.String(),
|
||||
"address": c.Conn.RemoteAddr().String(),
|
||||
})
|
||||
}
|
||||
|
||||
l.Infof("Connection from %s (%s) with ignored device ID %s", c.Conn.RemoteAddr(), c.Type, remoteID)
|
||||
c.Conn.Close()
|
||||
l.Infof("Connection from %s (%s) with ignored device ID %s", c.RemoteAddr(), c.Type, remoteID)
|
||||
c.Close()
|
||||
}
|
||||
}
|
||||
|
||||
@@ -568,6 +572,54 @@ func isPublicIPv6(ip net.IP) bool {
|
||||
return ip.IsGlobalUnicast()
|
||||
}
|
||||
|
||||
func exchangeHello(c net.Conn, h protocol.HelloMessage) (protocol.HelloMessage, error) {
|
||||
if err := c.SetDeadline(time.Now().Add(2 * time.Second)); err != nil {
|
||||
return protocol.HelloMessage{}, err
|
||||
}
|
||||
defer c.SetDeadline(time.Time{})
|
||||
|
||||
header := make([]byte, 8)
|
||||
msg := h.MustMarshalXDR()
|
||||
|
||||
binary.BigEndian.PutUint32(header[:4], protocol.HelloMessageMagic)
|
||||
binary.BigEndian.PutUint32(header[4:], uint32(len(msg)))
|
||||
|
||||
if _, err := c.Write(header); err != nil {
|
||||
return protocol.HelloMessage{}, err
|
||||
}
|
||||
|
||||
if _, err := c.Write(msg); err != nil {
|
||||
return protocol.HelloMessage{}, err
|
||||
}
|
||||
|
||||
if _, err := io.ReadFull(c, header); err != nil {
|
||||
return protocol.HelloMessage{}, err
|
||||
}
|
||||
|
||||
if binary.BigEndian.Uint32(header[:4]) != protocol.HelloMessageMagic {
|
||||
return protocol.HelloMessage{}, fmt.Errorf("incorrect magic")
|
||||
}
|
||||
|
||||
msgSize := binary.BigEndian.Uint32(header[4:])
|
||||
if msgSize > 1024 {
|
||||
return protocol.HelloMessage{}, fmt.Errorf("hello message too big")
|
||||
}
|
||||
|
||||
buf := make([]byte, msgSize)
|
||||
|
||||
var hello protocol.HelloMessage
|
||||
|
||||
if _, err := io.ReadFull(c, buf); err != nil {
|
||||
return protocol.HelloMessage{}, err
|
||||
}
|
||||
|
||||
if err := hello.UnmarshalXDR(buf); err != nil {
|
||||
return protocol.HelloMessage{}, err
|
||||
}
|
||||
|
||||
return hello, nil
|
||||
}
|
||||
|
||||
// serviceFunc wraps a function to create a suture.Service without stop
|
||||
// functionality.
|
||||
type serviceFunc func()
|
||||
|
||||
+71
-48
@@ -87,10 +87,10 @@ type Model struct {
|
||||
folderStatRefs map[string]*stats.FolderStatisticsReference // folder -> statsRef
|
||||
fmut sync.RWMutex // protects the above
|
||||
|
||||
conn map[protocol.DeviceID]Connection
|
||||
deviceVer map[protocol.DeviceID]string
|
||||
devicePaused map[protocol.DeviceID]bool
|
||||
pmut sync.RWMutex // protects the above
|
||||
conn map[protocol.DeviceID]Connection
|
||||
helloMessages map[protocol.DeviceID]protocol.HelloMessage
|
||||
devicePaused map[protocol.DeviceID]bool
|
||||
pmut sync.RWMutex // protects the above
|
||||
}
|
||||
|
||||
var (
|
||||
@@ -128,7 +128,7 @@ func NewModel(cfg *config.Wrapper, id protocol.DeviceID, deviceName, clientName,
|
||||
folderRunnerTokens: make(map[string][]suture.ServiceToken),
|
||||
folderStatRefs: make(map[string]*stats.FolderStatisticsReference),
|
||||
conn: make(map[protocol.DeviceID]Connection),
|
||||
deviceVer: make(map[protocol.DeviceID]string),
|
||||
helloMessages: make(map[protocol.DeviceID]protocol.HelloMessage),
|
||||
devicePaused: make(map[protocol.DeviceID]bool),
|
||||
|
||||
fmut: sync.NewRWMutex(),
|
||||
@@ -315,8 +315,13 @@ func (m *Model) ConnectionStats() map[string]interface{} {
|
||||
devs := m.cfg.Devices()
|
||||
conns := make(map[string]ConnectionInfo, len(devs))
|
||||
for device := range devs {
|
||||
hello := m.helloMessages[device]
|
||||
versionString := hello.ClientVersion
|
||||
if hello.ClientName != "syncthing" {
|
||||
versionString = hello.ClientName + " " + hello.ClientVersion
|
||||
}
|
||||
ci := ConnectionInfo{
|
||||
ClientVersion: m.deviceVer[device],
|
||||
ClientVersion: versionString,
|
||||
Paused: m.devicePaused[device],
|
||||
}
|
||||
if conn, ok := m.conn[device]; ok {
|
||||
@@ -606,30 +611,6 @@ func (m *Model) folderSharedWithUnlocked(folder string, deviceID protocol.Device
|
||||
}
|
||||
|
||||
func (m *Model) ClusterConfig(deviceID protocol.DeviceID, cm protocol.ClusterConfigMessage) {
|
||||
m.pmut.Lock()
|
||||
if cm.ClientName == "syncthing" {
|
||||
m.deviceVer[deviceID] = cm.ClientVersion
|
||||
} else {
|
||||
m.deviceVer[deviceID] = cm.ClientName + " " + cm.ClientVersion
|
||||
}
|
||||
|
||||
event := map[string]string{
|
||||
"id": deviceID.String(),
|
||||
"deviceName": cm.DeviceName,
|
||||
"clientName": cm.ClientName,
|
||||
"clientVersion": cm.ClientVersion,
|
||||
}
|
||||
|
||||
if conn, ok := m.conn[deviceID]; ok {
|
||||
event["type"] = conn.Type.String()
|
||||
addr := conn.RemoteAddr()
|
||||
if addr != nil {
|
||||
event["addr"] = addr.String()
|
||||
}
|
||||
}
|
||||
|
||||
m.pmut.Unlock()
|
||||
|
||||
// Check the peer device's announced folders against our own. Emits events
|
||||
// for folders that we don't expect (unknown or not shared).
|
||||
|
||||
@@ -661,19 +642,8 @@ nextFolder:
|
||||
}
|
||||
m.fmut.Unlock()
|
||||
|
||||
events.Default.Log(events.DeviceConnected, event)
|
||||
|
||||
l.Infof(`Device %s client is "%s %s" named "%s"`, deviceID, cm.ClientName, cm.ClientVersion, cm.DeviceName)
|
||||
|
||||
var changed bool
|
||||
|
||||
device, ok := m.cfg.Devices()[deviceID]
|
||||
if ok && device.Name == "" {
|
||||
device.Name = cm.DeviceName
|
||||
m.cfg.SetDevice(device)
|
||||
changed = true
|
||||
}
|
||||
|
||||
if m.cfg.Devices()[deviceID].Introducer {
|
||||
// This device is an introducer. Go through the announced lists of folders
|
||||
// and devices and add what we are missing.
|
||||
@@ -773,7 +743,7 @@ func (m *Model) Close(device protocol.DeviceID, err error) {
|
||||
closeRawConn(conn)
|
||||
}
|
||||
delete(m.conn, device)
|
||||
delete(m.deviceVer, device)
|
||||
delete(m.helloMessages, device)
|
||||
m.pmut.Unlock()
|
||||
}
|
||||
|
||||
@@ -978,10 +948,41 @@ func (m *Model) SetIgnores(folder string, content []string) error {
|
||||
return m.ScanFolder(folder)
|
||||
}
|
||||
|
||||
// OnHello is called when an device connects to us.
|
||||
// This allows us to extract some information from the Hello message
|
||||
// and add it to a list of known devices ahead of any checks.
|
||||
func (m *Model) OnHello(remoteID protocol.DeviceID, addr net.Addr, hello protocol.HelloMessage) {
|
||||
for deviceID := range m.cfg.Devices() {
|
||||
if deviceID == remoteID {
|
||||
// Existing device, we will get the hello message in AddConnection
|
||||
// hence do not persist any state here, as the connection might
|
||||
// get killed before AddConnection
|
||||
return
|
||||
}
|
||||
}
|
||||
|
||||
if !m.cfg.IgnoredDevice(remoteID) {
|
||||
events.Default.Log(events.DeviceRejected, map[string]string{
|
||||
"name": hello.DeviceName,
|
||||
"device": remoteID.String(),
|
||||
"address": addr.String(),
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
// GetHello is called when we are about to connect to some remote device.
|
||||
func (m *Model) GetHello(protocol.DeviceID) protocol.HelloMessage {
|
||||
return protocol.HelloMessage{
|
||||
DeviceName: m.deviceName,
|
||||
ClientName: m.clientName,
|
||||
ClientVersion: m.clientVersion,
|
||||
}
|
||||
}
|
||||
|
||||
// AddConnection adds a new peer connection to the model. An initial index will
|
||||
// be sent to the connected peer, thereafter index updates whenever the local
|
||||
// folder changes.
|
||||
func (m *Model) AddConnection(conn Connection) {
|
||||
func (m *Model) AddConnection(conn Connection, hello protocol.HelloMessage) {
|
||||
deviceID := conn.ID()
|
||||
|
||||
m.pmut.Lock()
|
||||
@@ -990,6 +991,32 @@ func (m *Model) AddConnection(conn Connection) {
|
||||
}
|
||||
m.conn[deviceID] = conn
|
||||
|
||||
m.helloMessages[deviceID] = hello
|
||||
|
||||
event := map[string]string{
|
||||
"id": deviceID.String(),
|
||||
"deviceName": hello.DeviceName,
|
||||
"clientName": hello.ClientName,
|
||||
"clientVersion": hello.ClientVersion,
|
||||
"type": conn.Type.String(),
|
||||
}
|
||||
|
||||
addr := conn.RemoteAddr()
|
||||
if addr != nil {
|
||||
event["addr"] = addr.String()
|
||||
}
|
||||
|
||||
events.Default.Log(events.DeviceConnected, event)
|
||||
|
||||
l.Infof(`Device %s client is "%s %s" named "%s"`, deviceID, hello.ClientName, hello.ClientVersion, hello.DeviceName)
|
||||
|
||||
device, ok := m.cfg.Devices()[deviceID]
|
||||
if ok && device.Name == "" {
|
||||
device.Name = hello.DeviceName
|
||||
m.cfg.SetDevice(device)
|
||||
m.cfg.Save()
|
||||
}
|
||||
|
||||
conn.Start()
|
||||
|
||||
cm := m.generateClusterConfig(deviceID)
|
||||
@@ -1510,11 +1537,7 @@ func (m *Model) numHashers(folder string) int {
|
||||
// generateClusterConfig returns a ClusterConfigMessage that is correct for
|
||||
// the given peer device
|
||||
func (m *Model) generateClusterConfig(device protocol.DeviceID) protocol.ClusterConfigMessage {
|
||||
message := protocol.ClusterConfigMessage{
|
||||
DeviceName: m.deviceName,
|
||||
ClientName: m.clientName,
|
||||
ClientVersion: m.clientVersion,
|
||||
}
|
||||
var message protocol.ClusterConfigMessage
|
||||
|
||||
m.fmut.RLock()
|
||||
for _, folder := range m.deviceFolders[device] {
|
||||
|
||||
+20
-17
@@ -279,7 +279,7 @@ func BenchmarkRequest(b *testing.B) {
|
||||
&net.TCPConn{},
|
||||
fc,
|
||||
ConnectionTypeDirectAccept,
|
||||
})
|
||||
}, protocol.HelloMessage{})
|
||||
m.Index(device1, "default", files, 0, nil)
|
||||
|
||||
b.ResetTimer()
|
||||
@@ -295,11 +295,10 @@ func BenchmarkRequest(b *testing.B) {
|
||||
}
|
||||
|
||||
func TestDeviceRename(t *testing.T) {
|
||||
ccm := protocol.ClusterConfigMessage{
|
||||
hello := protocol.HelloMessage{
|
||||
ClientName: "syncthing",
|
||||
ClientVersion: "v0.9.4",
|
||||
}
|
||||
|
||||
defer os.Remove("tmpconfig.xml")
|
||||
|
||||
rawCfg := config.New(device1)
|
||||
@@ -313,35 +312,39 @@ func TestDeviceRename(t *testing.T) {
|
||||
db := db.OpenMemory()
|
||||
m := NewModel(cfg, protocol.LocalDeviceID, "device", "syncthing", "dev", db, nil)
|
||||
|
||||
fc := FakeConnection{
|
||||
id: device1,
|
||||
requestData: []byte("some data to return"),
|
||||
if cfg.Devices()[device1].Name != "" {
|
||||
t.Errorf("Device already has a name")
|
||||
}
|
||||
|
||||
m.AddConnection(Connection{
|
||||
conn := Connection{
|
||||
&net.TCPConn{},
|
||||
fc,
|
||||
FakeConnection{
|
||||
id: device1,
|
||||
requestData: []byte("some data to return"),
|
||||
},
|
||||
ConnectionTypeDirectAccept,
|
||||
})
|
||||
}
|
||||
|
||||
m.AddConnection(conn, hello)
|
||||
|
||||
m.ServeBackground()
|
||||
|
||||
if cfg.Devices()[device1].Name != "" {
|
||||
t.Errorf("Device already has a name")
|
||||
}
|
||||
|
||||
m.ClusterConfig(device1, ccm)
|
||||
if cfg.Devices()[device1].Name != "" {
|
||||
t.Errorf("Device already has a name")
|
||||
}
|
||||
m.Close(device1, protocol.ErrTimeout)
|
||||
hello.DeviceName = "tester"
|
||||
m.AddConnection(conn, hello)
|
||||
|
||||
ccm.DeviceName = "tester"
|
||||
m.ClusterConfig(device1, ccm)
|
||||
if cfg.Devices()[device1].Name != "tester" {
|
||||
t.Errorf("Device did not get a name")
|
||||
}
|
||||
|
||||
ccm.DeviceName = "tester2"
|
||||
m.ClusterConfig(device1, ccm)
|
||||
m.Close(device1, protocol.ErrTimeout)
|
||||
hello.DeviceName = "tester2"
|
||||
m.AddConnection(conn, hello)
|
||||
|
||||
if cfg.Devices()[device1].Name != "tester" {
|
||||
t.Errorf("Device name got overwritten")
|
||||
}
|
||||
|
||||
+12
-6
@@ -11,7 +11,16 @@ import (
|
||||
"fmt"
|
||||
)
|
||||
|
||||
var sha256OfEmptyBlock = sha256.Sum256(make([]byte, BlockSize))
|
||||
var (
|
||||
sha256OfEmptyBlock = sha256.Sum256(make([]byte, BlockSize))
|
||||
HelloMessageMagic uint32 = 0x9F79BC40
|
||||
)
|
||||
|
||||
type HelloMessage struct {
|
||||
DeviceName string // max:64
|
||||
ClientName string // max:64
|
||||
ClientVersion string // max:64
|
||||
}
|
||||
|
||||
type IndexMessage struct {
|
||||
Folder string // max:256
|
||||
@@ -125,11 +134,8 @@ type ResponseMessage struct {
|
||||
}
|
||||
|
||||
type ClusterConfigMessage struct {
|
||||
DeviceName string // max:64
|
||||
ClientName string // max:64
|
||||
ClientVersion string // max:64
|
||||
Folders []Folder // max:1000000
|
||||
Options []Option // max:64
|
||||
Folders []Folder // max:1000000
|
||||
Options []Option // max:64
|
||||
}
|
||||
|
||||
func (o *ClusterConfigMessage) GetOption(key string) string {
|
||||
|
||||
+77
-34
@@ -10,6 +10,82 @@ import (
|
||||
|
||||
/*
|
||||
|
||||
HelloMessage Structure:
|
||||
|
||||
0 1 2 3
|
||||
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
/ /
|
||||
\ Device Name (length + padded data) \
|
||||
/ /
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
/ /
|
||||
\ Client Name (length + padded data) \
|
||||
/ /
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
/ /
|
||||
\ Client Version (length + padded data) \
|
||||
/ /
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
|
||||
|
||||
struct HelloMessage {
|
||||
string DeviceName<64>;
|
||||
string ClientName<64>;
|
||||
string ClientVersion<64>;
|
||||
}
|
||||
|
||||
*/
|
||||
|
||||
func (o HelloMessage) XDRSize() int {
|
||||
return 4 + len(o.DeviceName) + xdr.Padding(len(o.DeviceName)) +
|
||||
4 + len(o.ClientName) + xdr.Padding(len(o.ClientName)) +
|
||||
4 + len(o.ClientVersion) + xdr.Padding(len(o.ClientVersion))
|
||||
}
|
||||
|
||||
func (o HelloMessage) MarshalXDR() ([]byte, error) {
|
||||
buf := make([]byte, o.XDRSize())
|
||||
m := &xdr.Marshaller{Data: buf}
|
||||
return buf, o.MarshalXDRInto(m)
|
||||
}
|
||||
|
||||
func (o HelloMessage) MustMarshalXDR() []byte {
|
||||
bs, err := o.MarshalXDR()
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
return bs
|
||||
}
|
||||
|
||||
func (o HelloMessage) MarshalXDRInto(m *xdr.Marshaller) error {
|
||||
if l := len(o.DeviceName); l > 64 {
|
||||
return xdr.ElementSizeExceeded("DeviceName", l, 64)
|
||||
}
|
||||
m.MarshalString(o.DeviceName)
|
||||
if l := len(o.ClientName); l > 64 {
|
||||
return xdr.ElementSizeExceeded("ClientName", l, 64)
|
||||
}
|
||||
m.MarshalString(o.ClientName)
|
||||
if l := len(o.ClientVersion); l > 64 {
|
||||
return xdr.ElementSizeExceeded("ClientVersion", l, 64)
|
||||
}
|
||||
m.MarshalString(o.ClientVersion)
|
||||
return m.Error
|
||||
}
|
||||
|
||||
func (o *HelloMessage) UnmarshalXDR(bs []byte) error {
|
||||
u := &xdr.Unmarshaller{Data: bs}
|
||||
return o.UnmarshalXDRFrom(u)
|
||||
}
|
||||
func (o *HelloMessage) UnmarshalXDRFrom(u *xdr.Unmarshaller) error {
|
||||
o.DeviceName = u.UnmarshalStringMax(64)
|
||||
o.ClientName = u.UnmarshalStringMax(64)
|
||||
o.ClientVersion = u.UnmarshalStringMax(64)
|
||||
return u.Error
|
||||
}
|
||||
|
||||
/*
|
||||
|
||||
IndexMessage Structure:
|
||||
|
||||
0 1 2 3
|
||||
@@ -506,18 +582,6 @@ ClusterConfigMessage Structure:
|
||||
0 1 2 3
|
||||
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
/ /
|
||||
\ Device Name (length + padded data) \
|
||||
/ /
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
/ /
|
||||
\ Client Name (length + padded data) \
|
||||
/ /
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
/ /
|
||||
\ Client Version (length + padded data) \
|
||||
/ /
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
| Number of Folders |
|
||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
/ /
|
||||
@@ -533,9 +597,6 @@ ClusterConfigMessage Structure:
|
||||
|
||||
|
||||
struct ClusterConfigMessage {
|
||||
string DeviceName<64>;
|
||||
string ClientName<64>;
|
||||
string ClientVersion<64>;
|
||||
Folder Folders<1000000>;
|
||||
Option Options<64>;
|
||||
}
|
||||
@@ -543,10 +604,7 @@ struct ClusterConfigMessage {
|
||||
*/
|
||||
|
||||
func (o ClusterConfigMessage) XDRSize() int {
|
||||
return 4 + len(o.DeviceName) + xdr.Padding(len(o.DeviceName)) +
|
||||
4 + len(o.ClientName) + xdr.Padding(len(o.ClientName)) +
|
||||
4 + len(o.ClientVersion) + xdr.Padding(len(o.ClientVersion)) +
|
||||
4 + xdr.SizeOfSlice(o.Folders) +
|
||||
return 4 + xdr.SizeOfSlice(o.Folders) +
|
||||
4 + xdr.SizeOfSlice(o.Options)
|
||||
}
|
||||
|
||||
@@ -565,18 +623,6 @@ func (o ClusterConfigMessage) MustMarshalXDR() []byte {
|
||||
}
|
||||
|
||||
func (o ClusterConfigMessage) MarshalXDRInto(m *xdr.Marshaller) error {
|
||||
if l := len(o.DeviceName); l > 64 {
|
||||
return xdr.ElementSizeExceeded("DeviceName", l, 64)
|
||||
}
|
||||
m.MarshalString(o.DeviceName)
|
||||
if l := len(o.ClientName); l > 64 {
|
||||
return xdr.ElementSizeExceeded("ClientName", l, 64)
|
||||
}
|
||||
m.MarshalString(o.ClientName)
|
||||
if l := len(o.ClientVersion); l > 64 {
|
||||
return xdr.ElementSizeExceeded("ClientVersion", l, 64)
|
||||
}
|
||||
m.MarshalString(o.ClientVersion)
|
||||
if l := len(o.Folders); l > 1000000 {
|
||||
return xdr.ElementSizeExceeded("Folders", l, 1000000)
|
||||
}
|
||||
@@ -603,9 +649,6 @@ func (o *ClusterConfigMessage) UnmarshalXDR(bs []byte) error {
|
||||
return o.UnmarshalXDRFrom(u)
|
||||
}
|
||||
func (o *ClusterConfigMessage) UnmarshalXDRFrom(u *xdr.Unmarshaller) error {
|
||||
o.DeviceName = u.UnmarshalStringMax(64)
|
||||
o.ClientName = u.UnmarshalStringMax(64)
|
||||
o.ClientVersion = u.UnmarshalStringMax(64)
|
||||
_FoldersSize := int(u.UnmarshalUint32())
|
||||
if _FoldersSize < 0 {
|
||||
return xdr.ElementSizeExceeded("Folders", _FoldersSize, 1000000)
|
||||
|
||||
@@ -189,12 +189,12 @@ func TestClose(t *testing.T) {
|
||||
}
|
||||
|
||||
func TestElementSizeExceededNested(t *testing.T) {
|
||||
m := ClusterConfigMessage{
|
||||
m := HelloMessage{
|
||||
ClientName: "longstringlongstringlongstringinglongstringlongstringlonlongstringlongstringlon",
|
||||
}
|
||||
_, err := m.MarshalXDR()
|
||||
if err == nil {
|
||||
t.Errorf("ID length %d > max 64, but no error", len(m.Folders[0].ID))
|
||||
t.Errorf("ID length %d > max 64, but no error", len(m.ClientName))
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in new issue
Block a user