فهرست منبع

Added packet listener and AuthMoreData packet

Josh Brickner 7 سال پیش
والد
کامیت
c86edeb49f
2فایلهای تغییر یافته به همراه87 افزوده شده و 0 حذف شده
  1. 31 0
      binlog/authentication.go
  2. 56 0
      binlog/connection.go

+ 31 - 0
binlog/authentication.go

@@ -6,6 +6,37 @@ import (
 	"crypto/sha256"
 )
 
+const SHA2_REQUEST_PUBLIC_KEY = 0x02
+const SHA2_FAST_AUTH_SUCCESS = 0x03
+const SHA2_PERFORM_FULL_AUTHENTICATION = 0x04
+
+type AuthMoreDataPacket struct {
+	PacketHeader
+	Data string
+}
+
+func (c *Conn) decodeAuthMoreDataResponsePacket(ph PacketHeader) (*AuthMoreDataPacket, error) {
+	md := AuthMoreDataPacket{}
+	md.PacketHeader = ph
+	flag := c.getInt(TypeFixedInt, 1)
+
+	switch flag {
+	case SHA2_FAST_AUTH_SUCCESS:
+		md.Data = "SHA2_FAST_AUTH_SUCCESS"
+	case SHA2_REQUEST_PUBLIC_KEY:
+		md.Data = "SHA2_REQUEST_PUBLIC_KEY"
+	case SHA2_PERFORM_FULL_AUTHENTICATION:
+		md.Data = "SHA2_PERFORM_FULL_AUTHENTICATION"
+	}
+
+	err := c.scanner.Err()
+	if err != nil {
+		return nil, err
+	}
+
+	return &md, nil
+}
+
 type AuthResponsePacket struct {
 	PacketLength   uint64
 	SequenceID     uint64

+ 56 - 0
binlog/connection.go

@@ -132,9 +132,65 @@ func (d Driver) Open(dsn string) (driver.Conn, error) {
 		return nil, err
 	}
 
+	err = c.listen()
+
 	return c, err
 }
 
+func (c *Conn) listen() error {
+	ph, err := c.getPacketHeader()
+	if err != nil {
+		return err
+	}
+
+	switch ph.Status {
+	case 0x01:
+		p, err := c.decodeAuthMoreDataResponsePacket(ph)
+		if err != nil {
+			return err
+		}
+		fmt.Printf("%+v", p)
+	case 0x00:
+		fmt.Println("OK")
+	case 0xFE:
+		fmt.Println("EOF")
+	case 0xFF:
+		fmt.Println("ERROR")
+	}
+
+	err = c.scanner.Err()
+	if err != nil {
+		return err
+	}
+
+	err = c.listen() // Listen forever until we get an error.
+	if err != nil {
+		return err
+	}
+
+	return nil
+}
+
+type PacketHeader struct {
+	Length     uint64
+	SequenceID uint64
+	Status     uint64
+}
+
+func (c *Conn) getPacketHeader() (PacketHeader, error) {
+	ph := PacketHeader{}
+	ph.Length = c.getInt(TypeFixedInt, 3)
+	ph.SequenceID = c.getInt(TypeFixedInt, 1)
+	ph.Status = c.getInt(TypeFixedInt, 1)
+
+	err := c.scanner.Err()
+	if err != nil {
+		return ph, err
+	}
+
+	return ph, nil
+}
+
 func init() {
 	sql.Register("mysql-binlog", &Driver{})
 }