lib/protocol: Remove support for v0.13 hello messages (#5461)
This commit is contained in:
parent
c2cc1dadea
commit
76af0cf07b
@ -17,8 +17,9 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
SyntheticDirectorySize = 128
|
SyntheticDirectorySize = 128
|
||||||
HelloMessageMagic = uint32(0x2EA7D90B)
|
HelloMessageMagic uint32 = 0x2EA7D90B
|
||||||
|
Version13HelloMagic uint32 = 0x9F79BC40 // old
|
||||||
)
|
)
|
||||||
|
|
||||||
func (m Hello) Magic() uint32 {
|
func (m Hello) Magic() uint32 {
|
||||||
|
|||||||
@ -26,12 +26,9 @@ type HelloResult struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
var (
|
var (
|
||||||
// ErrTooOldVersion12 is returned by ExchangeHello when the other side
|
// ErrTooOldVersion is returned by ExchangeHello when the other side
|
||||||
// speaks the older, incompatible version 0.12 of the protocol.
|
// speaks an older, incompatible version of the protocol.
|
||||||
ErrTooOldVersion12 = errors.New("the remote device speaks an older version of the protocol (v0.12) not compatible with this version")
|
ErrTooOldVersion = errors.New("the remote device speaks an older version of the protocol not compatible with this version")
|
||||||
// ErrTooOldVersion13 is returned by ExchangeHello when the other side
|
|
||||||
// speaks the older, incompatible version 0.12 of the protocol.
|
|
||||||
ErrTooOldVersion13 = errors.New("the remote device speaks an older version of the protocol (v0.13) not compatible with this version")
|
|
||||||
// ErrUnknownMagic is returned by ExchangeHellow when the other side
|
// ErrUnknownMagic is returned by ExchangeHellow when the other side
|
||||||
// speaks something entirely unknown.
|
// speaks something entirely unknown.
|
||||||
ErrUnknownMagic = errors.New("the remote device speaks an unknown (newer?) version of the protocol")
|
ErrUnknownMagic = errors.New("the remote device speaks an unknown (newer?) version of the protocol")
|
||||||
@ -48,7 +45,7 @@ func ExchangeHello(c io.ReadWriter, h HelloIntf) (HelloResult, error) {
|
|||||||
// version mismatch that we might want to alert the user about.
|
// version mismatch that we might want to alert the user about.
|
||||||
func IsVersionMismatch(err error) bool {
|
func IsVersionMismatch(err error) bool {
|
||||||
switch err {
|
switch err {
|
||||||
case ErrTooOldVersion12, ErrTooOldVersion13, ErrUnknownMagic:
|
case ErrTooOldVersion, ErrUnknownMagic:
|
||||||
return true
|
return true
|
||||||
default:
|
default:
|
||||||
return false
|
return false
|
||||||
@ -87,31 +84,11 @@ func readHello(c io.Reader) (HelloResult, error) {
|
|||||||
}
|
}
|
||||||
return res, nil
|
return res, nil
|
||||||
|
|
||||||
case Version13HelloMagic:
|
case 0x00010001, 0x00010000, Version13HelloMagic:
|
||||||
// This is a v0.13 Hello message in XDR format
|
// This is the first word of an older cluster config message or an
|
||||||
if _, err := io.ReadFull(c, header[:4]); err != nil {
|
// old magic number. (Version 0, message ID 1, message type 0,
|
||||||
return HelloResult{}, err
|
// compression enabled or disabled)
|
||||||
}
|
return HelloResult{}, ErrTooOldVersion
|
||||||
msgSize := binary.BigEndian.Uint32(header[:4])
|
|
||||||
if msgSize > 1024 {
|
|
||||||
return HelloResult{}, fmt.Errorf("hello message too big")
|
|
||||||
}
|
|
||||||
buf := make([]byte, msgSize)
|
|
||||||
if _, err := io.ReadFull(c, buf); err != nil {
|
|
||||||
return HelloResult{}, err
|
|
||||||
}
|
|
||||||
|
|
||||||
var hello Version13HelloMessage
|
|
||||||
if err := hello.UnmarshalXDR(buf); err != nil {
|
|
||||||
return HelloResult{}, err
|
|
||||||
}
|
|
||||||
res := HelloResult(hello)
|
|
||||||
return res, ErrTooOldVersion13
|
|
||||||
|
|
||||||
case 0x00010001, 0x00010000:
|
|
||||||
// This is the first word of a v0.12 cluster config message.
|
|
||||||
// (Version 0, message ID 1, message type 0, compression enabled or disabled)
|
|
||||||
return HelloResult{}, ErrTooOldVersion12
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return HelloResult{}, ErrUnknownMagic
|
return HelloResult{}, ErrUnknownMagic
|
||||||
|
|||||||
@ -60,126 +60,39 @@ func TestVersion14Hello(t *testing.T) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestVersion13Hello(t *testing.T) {
|
func TestOldHelloMsgs(t *testing.T) {
|
||||||
// Tests that we can send and receive a version 0.13 hello message.
|
// Tests that we can correctly identify old/missing/unknown hello
|
||||||
|
// messages.
|
||||||
|
|
||||||
expected := Version13HelloMessage{
|
cases := []struct {
|
||||||
DeviceName: "test device",
|
msg string
|
||||||
ClientName: "syncthing",
|
err error
|
||||||
ClientVersion: "v0.13.5",
|
}{
|
||||||
}
|
{"00010001", ErrTooOldVersion}, // v12
|
||||||
msgBuf := expected.MustMarshalXDR()
|
{"9F79BC40", ErrTooOldVersion}, // v13
|
||||||
|
{"12345678", ErrUnknownMagic},
|
||||||
hdrBuf := make([]byte, 8)
|
|
||||||
binary.BigEndian.PutUint32(hdrBuf, Version13HelloMagic)
|
|
||||||
binary.BigEndian.PutUint32(hdrBuf[4:], uint32(len(msgBuf)))
|
|
||||||
|
|
||||||
outBuf := new(bytes.Buffer)
|
|
||||||
outBuf.Write(hdrBuf)
|
|
||||||
outBuf.Write(msgBuf)
|
|
||||||
|
|
||||||
inBuf := new(bytes.Buffer)
|
|
||||||
|
|
||||||
conn := &readWriter{outBuf, inBuf}
|
|
||||||
|
|
||||||
send := Version13HelloMessage{
|
|
||||||
DeviceName: "this device",
|
|
||||||
ClientName: "other client",
|
|
||||||
ClientVersion: "v0.13.6",
|
|
||||||
}
|
}
|
||||||
|
|
||||||
res, err := ExchangeHello(conn, send)
|
for _, tc := range cases {
|
||||||
if err != ErrTooOldVersion13 {
|
msg, _ := hex.DecodeString(tc.msg)
|
||||||
t.Errorf("unexpected error %v != ErrTooOldVersion13", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
if res.ClientName != expected.ClientName {
|
outBuf := new(bytes.Buffer)
|
||||||
t.Errorf("incorrect ClientName %q != expected %q", res.ClientName, expected.ClientName)
|
outBuf.Write(msg)
|
||||||
}
|
|
||||||
if res.ClientVersion != expected.ClientVersion {
|
|
||||||
t.Errorf("incorrect ClientVersion %q != expected %q", res.ClientVersion, expected.ClientVersion)
|
|
||||||
}
|
|
||||||
if res.DeviceName != expected.DeviceName {
|
|
||||||
t.Errorf("incorrect DeviceName %q != expected %q", res.DeviceName, expected.DeviceName)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestVersion12Hello(t *testing.T) {
|
inBuf := new(bytes.Buffer)
|
||||||
// Tests that we can correctly interpret the lack of a hello message
|
|
||||||
// from a v0.12 client.
|
|
||||||
|
|
||||||
// This is the typical v0.12 connection start - our message header for a
|
conn := &readWriter{outBuf, inBuf}
|
||||||
// ClusterConfig message and then the cluster config message data. Taken
|
|
||||||
// from a protocol dump of a recent v0.12 client.
|
|
||||||
msg, _ := hex.DecodeString(spaceRe.ReplaceAllString(`
|
|
||||||
00010001
|
|
||||||
0000014a
|
|
||||||
7802000070000000027332000100a00973796e637468696e670e00b000000876
|
|
||||||
302e31322e32352400b00000000764656661756c741e00f01603000000204794
|
|
||||||
03ffdef496b5f5e5bc9c0a15221e70073164509fa30761af63094f6f945c3800
|
|
||||||
2073312f00f20b0001000000157463703a2f2f3132372e302e302e313a323230
|
|
||||||
301f00012400080500003000001000f1122064516fb94d24e7b637d20d9846eb
|
|
||||||
aeffb09556ef3968c8276fefc3fe24c144c2640002c0000034000f640002021f
|
|
||||||
00004f00090400003000001100f11220dff67945f05bdab4270acd6057f1eacf
|
|
||||||
a3ac93cade07ce6a89384c181ad6b80e640010332b000fc80007021f00012400
|
|
||||||
080500046400041400f21f2dc2af5c5f28e38384295f2fc2af2052c3a46b736d
|
|
||||||
c3b67267c3a57320e58aa8e4bd9c20d090d0b4d180d0b5d18136001f026c01b8
|
|
||||||
90000000000000000000`, ``))
|
|
||||||
|
|
||||||
outBuf := new(bytes.Buffer)
|
send := &Hello{
|
||||||
outBuf.Write(msg)
|
DeviceName: "this device",
|
||||||
|
ClientName: "other client",
|
||||||
|
ClientVersion: "v1.0.0",
|
||||||
|
}
|
||||||
|
|
||||||
inBuf := new(bytes.Buffer)
|
_, err := ExchangeHello(conn, send)
|
||||||
|
if err != tc.err {
|
||||||
conn := &readWriter{outBuf, inBuf}
|
t.Errorf("unexpected error %v != %v", err, tc.err)
|
||||||
|
}
|
||||||
send := Version13HelloMessage{
|
|
||||||
DeviceName: "this device",
|
|
||||||
ClientName: "other client",
|
|
||||||
ClientVersion: "v0.13.6",
|
|
||||||
}
|
|
||||||
|
|
||||||
_, err := ExchangeHello(conn, send)
|
|
||||||
if err != ErrTooOldVersion12 {
|
|
||||||
t.Errorf("unexpected error %v != ErrTooOldVersion12", err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestUnknownHello(t *testing.T) {
|
|
||||||
// Tests that we react correctly to a completely unknown magic number.
|
|
||||||
|
|
||||||
// This is an unknown magic follow byte some message data.
|
|
||||||
msg, _ := hex.DecodeString(spaceRe.ReplaceAllString(`
|
|
||||||
12345678
|
|
||||||
0000014a
|
|
||||||
7802000070000000027332000100a00973796e637468696e670e00b000000876
|
|
||||||
302e31322e32352400b00000000764656661756c741e00f01603000000204794
|
|
||||||
03ffdef496b5f5e5bc9c0a15221e70073164509fa30761af63094f6f945c3800
|
|
||||||
2073312f00f20b0001000000157463703a2f2f3132372e302e302e313a323230
|
|
||||||
301f00012400080500003000001000f1122064516fb94d24e7b637d20d9846eb
|
|
||||||
aeffb09556ef3968c8276fefc3fe24c144c2640002c0000034000f640002021f
|
|
||||||
00004f00090400003000001100f11220dff67945f05bdab4270acd6057f1eacf
|
|
||||||
a3ac93cade07ce6a89384c181ad6b80e640010332b000fc80007021f00012400
|
|
||||||
080500046400041400f21f2dc2af5c5f28e38384295f2fc2af2052c3a46b736d
|
|
||||||
c3b67267c3a57320e58aa8e4bd9c20d090d0b4d180d0b5d18136001f026c01b8
|
|
||||||
90000000000000000000`, ``))
|
|
||||||
|
|
||||||
outBuf := new(bytes.Buffer)
|
|
||||||
outBuf.Write(msg)
|
|
||||||
|
|
||||||
inBuf := new(bytes.Buffer)
|
|
||||||
|
|
||||||
conn := &readWriter{outBuf, inBuf}
|
|
||||||
|
|
||||||
send := Version13HelloMessage{
|
|
||||||
DeviceName: "this device",
|
|
||||||
ClientName: "other client",
|
|
||||||
ClientVersion: "v0.13.6",
|
|
||||||
}
|
|
||||||
|
|
||||||
_, err := ExchangeHello(conn, send)
|
|
||||||
if err != ErrUnknownMagic {
|
|
||||||
t.Errorf("unexpected error %v != ErrUnknownMagic", err)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -1,24 +0,0 @@
|
|||||||
// Copyright (C) 2016 The Protocol Authors.
|
|
||||||
|
|
||||||
//go:generate -command genxdr go run ../../repos/xdr/cmd/genxdr/main.go
|
|
||||||
//go:generate genxdr -o hello_v0.13_xdr.go hello_v0.13.go
|
|
||||||
|
|
||||||
package protocol
|
|
||||||
|
|
||||||
var (
|
|
||||||
Version13HelloMagic uint32 = 0x9F79BC40
|
|
||||||
)
|
|
||||||
|
|
||||||
type Version13HelloMessage struct {
|
|
||||||
DeviceName string // max:64
|
|
||||||
ClientName string // max:64
|
|
||||||
ClientVersion string // max:64
|
|
||||||
}
|
|
||||||
|
|
||||||
func (m Version13HelloMessage) Magic() uint32 {
|
|
||||||
return Version13HelloMagic
|
|
||||||
}
|
|
||||||
|
|
||||||
func (m Version13HelloMessage) Marshal() ([]byte, error) {
|
|
||||||
return m.MarshalXDR()
|
|
||||||
}
|
|
||||||
@ -1,85 +0,0 @@
|
|||||||
// ************************************************************
|
|
||||||
// This file is automatically generated by genxdr. Do not edit.
|
|
||||||
// ************************************************************
|
|
||||||
|
|
||||||
package protocol
|
|
||||||
|
|
||||||
import (
|
|
||||||
"github.com/calmh/xdr"
|
|
||||||
)
|
|
||||||
|
|
||||||
/*
|
|
||||||
|
|
||||||
Version13HelloMessage 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 Version13HelloMessage {
|
|
||||||
string DeviceName<64>;
|
|
||||||
string ClientName<64>;
|
|
||||||
string ClientVersion<64>;
|
|
||||||
}
|
|
||||||
|
|
||||||
*/
|
|
||||||
|
|
||||||
func (o Version13HelloMessage) 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 Version13HelloMessage) MarshalXDR() ([]byte, error) {
|
|
||||||
buf := make([]byte, o.XDRSize())
|
|
||||||
m := &xdr.Marshaller{Data: buf}
|
|
||||||
return buf, o.MarshalXDRInto(m)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (o Version13HelloMessage) MustMarshalXDR() []byte {
|
|
||||||
bs, err := o.MarshalXDR()
|
|
||||||
if err != nil {
|
|
||||||
panic(err)
|
|
||||||
}
|
|
||||||
return bs
|
|
||||||
}
|
|
||||||
|
|
||||||
func (o Version13HelloMessage) 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 *Version13HelloMessage) UnmarshalXDR(bs []byte) error {
|
|
||||||
u := &xdr.Unmarshaller{Data: bs}
|
|
||||||
return o.UnmarshalXDRFrom(u)
|
|
||||||
}
|
|
||||||
func (o *Version13HelloMessage) UnmarshalXDRFrom(u *xdr.Unmarshaller) error {
|
|
||||||
o.DeviceName = u.UnmarshalStringMax(64)
|
|
||||||
o.ClientName = u.UnmarshalStringMax(64)
|
|
||||||
o.ClientVersion = u.UnmarshalStringMax(64)
|
|
||||||
return u.Error
|
|
||||||
}
|
|
||||||
Loading…
x
Reference in New Issue
Block a user