Bladeren bron

Completed handshake response packet!

Josh Brickner 7 jaren geleden
bovenliggende
commit
38fda3e227
2 gewijzigde bestanden met toevoegingen van 28 en 21 verwijderingen
  1. 11 13
      binlog/connection.go
  2. 17 8
      binlog/handshake.go

+ 11 - 13
binlog/connection.go

@@ -10,7 +10,6 @@ import (
 	"errors"
 	"fmt"
 	"math"
-	"math/bits"
 	"net"
 	"reflect"
 	"strings"
@@ -22,6 +21,7 @@ const TypeNullTerminatedString = int(0)
 const TypeFixedString = int(1)
 const TypeFixedInt = int(2)
 const TypeLenEncInt = int(3)
+const TypeRestOfPacketString = int(4)
 
 // Integer Maximums
 const MaxUint8 = 1<<8 - 1
@@ -75,7 +75,7 @@ type Conn struct {
 func newBinlogConn(config *Config) Conn {
 	return Conn{
 		Config:     config,
-		sequenceId: 0,
+		sequenceId: 1,
 	}
 }
 
@@ -302,7 +302,7 @@ func (c *Conn) structToBitmask(s interface{}) []byte {
 
 	l := uint64(math.Ceil(float64(fC) / 8.0))
 	b := make([]byte, 8)
-	binary.BigEndian.PutUint64(b, bits.Reverse64(m))
+	binary.LittleEndian.PutUint64(b, m)
 
 	switch {
 	case l > 4: // 64 bits
@@ -326,6 +326,8 @@ func (c *Conn) putString(t int, v string) uint64 {
 		b = c.encFixedString(v)
 	case TypeNullTerminatedString:
 		b = c.encNullTerminatedString(v)
+	case TypeRestOfPacketString:
+		b = c.encRestOfPacketString(v)
 	}
 
 	l, err := c.writeBuf.Write(b)
@@ -344,6 +346,11 @@ func (c *Conn) encFixedString(v string) []byte {
 	return []byte(v)
 }
 
+func (c *Conn) encRestOfPacketString(v string) []byte {
+	s := c.encFixedString(v)
+	return s
+}
+
 func (c *Conn) putInt(t int, v uint64, l uint64) uint64 {
 	c.setupWriteBuffer()
 
@@ -402,7 +409,7 @@ func (c *Conn) Flush() error {
 }
 
 func (c *Conn) addHeader() *bytes.Buffer {
-	pl := uint64(c.writeBuf.Len()) + 4
+	pl := uint64(c.writeBuf.Len())
 	sId := uint64(c.sequenceId)
 	c.sequenceId++
 
@@ -417,12 +424,3 @@ func (c *Conn) setupWriteBuffer() {
 		c.writeBuf = bytes.NewBuffer(nil)
 	}
 }
-
-func Reverse(s string) string {
-	var b strings.Builder
-	b.Grow(len(s))
-	for i := len(s) - 1; i >= 0; i-- {
-		b.WriteByte(s[i])
-	}
-	return b.String()
-}

+ 17 - 8
binlog/handshake.go

@@ -128,18 +128,19 @@ func (c *Conn) writeHandshakeResponse() error {
 	hr := c.NewHandshakeResponse()
 	cf := c.structToBitmask(hr.ClientFlag)
 	c.putBytes(cf)
-	c.putInt(TypeFixedInt, MaxPacketSize, 4)
+	c.putInt(TypeFixedInt, hr.MaxPacketSize, 4)
 	c.putInt(TypeFixedInt, hr.CharacterSet, 1)
 	c.putNullBytes(23)
 	c.putString(TypeNullTerminatedString, hr.Username)
 
 	salt := append(c.Handshake.AuthPluginDataPart1.Bytes(), c.Handshake.AuthPluginDataPart2.Bytes()...)
 	ar := c.cachingSha2Auth(salt, []byte(hr.AuthResponse))
+	hr.AuthResponseLength = uint64(len(ar))
 	if hr.ClientFlag.PluginAuthLenEncClientData {
-		c.putInt(TypeLenEncInt, uint64(len(ar)), 0)
+		c.putInt(TypeLenEncInt, hr.AuthResponseLength, 0)
 		c.putBytes(ar)
 	} else if hr.ClientFlag.SecureConnection {
-		c.putInt(TypeFixedInt, uint64(len(ar)), 1)
+		c.putInt(TypeFixedInt, hr.AuthResponseLength, 1)
 		c.putBytes(ar)
 	} else {
 		c.putString(TypeNullTerminatedString, c.Config.Pass)
@@ -150,9 +151,17 @@ func (c *Conn) writeHandshakeResponse() error {
 		c.putString(TypeNullTerminatedString, hr.Database)
 	}
 
+	// Set type of auth plugin based on if it is at the end of the packet.
+	var t int
+	if hr.KeyValues != nil {
+		t = TypeNullTerminatedString
+	} else {
+		t = TypeRestOfPacketString
+	}
+
 	// Write auth plugin
 	if hr.ClientFlag.PluginAuth {
-		c.putString(TypeNullTerminatedString, hr.ClientPluginName)
+		c.putString(t, hr.ClientPluginName)
 	}
 
 	if c.Flush() != nil {
@@ -180,13 +189,13 @@ func (c *Conn) NewHandshakeResponse() *HandshakeResponse {
 			IgnoreSigpipe:              false,
 			Transactions:               true,
 			LegacyProtocol41:           false,
-			SecureConnection:           false,
+			SecureConnection:           true,
 			MultiStatements:            false,
 			MultiResults:               false,
 			PSMultiResults:             true,
-			PluginAuth:                 false,
+			PluginAuth:                 true,
 			ConnectAttrs:               false,
-			PluginAuthLenEncClientData: true,
+			PluginAuthLenEncClientData: false,
 			CanHandleExpiredPasswords:  false,
 			SessionTrack:               false,
 			DeprecateEOF:               false,
@@ -197,7 +206,7 @@ func (c *Conn) NewHandshakeResponse() *HandshakeResponse {
 		MaxPacketSize:      MaxPacketSize,
 		CharacterSet:       45,
 		Username:           c.Config.User,
-		AuthResponseLength: uint64(len(c.Config.Pass)),
+		AuthResponseLength: 0,
 		AuthResponse:       c.Config.Pass,
 		Database:           c.Config.Database,
 		ClientPluginName:   c.Handshake.AuthPluginName,