From a6abedbe539c190f50eeba18d8972540b6c28656 Mon Sep 17 00:00:00 2001 From: Vasiliy Tolstov Date: Tue, 4 Jul 2017 14:24:41 +0300 Subject: [PATCH] complete aten hermon encoding Signed-off-by: Vasiliy Tolstov --- client.go | 10 +- encoding_atenhermon.go | 94 ++++++++---- handlers.go | 50 ++----- image.go | 3 +- messages.go | 42 ++++-- messages_aten.go | 314 +++++++++++++++++++++++++++++++++++++++++ messagetype_string.go | 42 ++++++ security_aten.go | 4 +- server.go | 10 +- 9 files changed, 476 insertions(+), 93 deletions(-) create mode 100644 messages_aten.go create mode 100644 messagetype_string.go diff --git a/client.go b/client.go index 1a1ff99..277be70 100644 --- a/client.go +++ b/client.go @@ -11,7 +11,7 @@ import ( var ( // DefaultClientHandlers represents default client handlers - DefaultClientHandlers = []ClientHandler{ + DefaultClientHandlers = []Handler{ &DefaultClientVersionHandler{}, &DefaultClientSecurityHandler{}, &DefaultClientClientInitHandler{}, @@ -126,7 +126,7 @@ func (c *ClientConn) PixelFormat() PixelFormat { // SetDesktopName sets desktop name func (c *ClientConn) SetDesktopName(name []byte) { - copy(c.desktopName, name) + c.desktopName = name } // SetPixelFormat sets pixel format @@ -232,7 +232,7 @@ func (*DefaultClientMessageHandler) Handle(c Conn) error { defer c.Close() serverMessages := make(map[ServerMessageType]ServerMessage) - for _, m := range cfg.ServerMessages { + for _, m := range cfg.Messages { serverMessages[m.Type()] = m } @@ -282,7 +282,7 @@ func (*DefaultClientMessageHandler) Handle(c Conn) error { // A ClientConfig structure is used to configure a ClientConn. After // one has been passed to initialize a connection, it must not be modified. type ClientConfig struct { - Handlers []ClientHandler + Handlers []Handler SecurityHandlers []SecurityHandler Encodings []Encoding PixelFormat PixelFormat @@ -290,7 +290,7 @@ type ClientConfig struct { ClientMessageCh chan ClientMessage ServerMessageCh chan ServerMessage Exclusive bool - ServerMessages []ServerMessage + Messages []ServerMessage QuitCh chan struct{} ErrorCh chan error quit chan struct{} diff --git a/encoding_atenhermon.go b/encoding_atenhermon.go index 5051de0..21a62ac 100644 --- a/encoding_atenhermon.go +++ b/encoding_atenhermon.go @@ -5,6 +5,11 @@ import ( "fmt" ) +const ( + EncAtenHermonSubrect EncodingType = 0 + EncAtenHermonRaw EncodingType = 1 +) + type AtenHermon struct { _ [4]byte AtenLength uint32 @@ -15,6 +20,14 @@ type AtenHermon struct { Encodings []Encoding } +type AtenHermonSubrect struct { + A uint16 + B uint16 + Y uint8 + X uint8 + Data []byte +} + func (*AtenHermon) Type() EncodingType { return EncAtenHermon } func (enc *AtenHermon) Read(c Conn, rect *Rectangle) error { @@ -72,40 +85,21 @@ func (enc *AtenHermon) Read(c Conn, rect *Rectangle) error { aten_length -= 10 // skip for aten_length > 0 { - switch aten_type { - case 0: //subrects - var a uint16 - var b uint16 - var x uint8 - var y uint8 - if err := binary.Read(c, binary.BigEndian, &a); err != nil { + switch EncodingType(aten_type) { + case EncAtenHermonSubrect: + encSR := &AtenHermonSubrect{} + if err := encSR.Read(c, rect); err != nil { return err } - if err := binary.Read(c, binary.BigEndian, &b); err != nil { - return err - } - if err := binary.Read(c, binary.BigEndian, &y); err != nil { - return err - } - if err := binary.Read(c, binary.BigEndian, &x); err != nil { - return err - } - data := make([]byte, 16*16*uint32(c.PixelFormat().BPP)) - if err := binary.Read(c, binary.BigEndian, &data); err != nil { - return err - } - - aten_length -= 6 + (16 * 16 * uint32(c.PixelFormat().BPP)) - panic("subrect!") - case 1: //raw - fmt.Printf("raw reader %d %s\n", aten_length, rect) + enc.Encodings = append(enc.Encodings, encSR) + aten_length -= 6 + (16 * 16 * uint32(c.PixelFormat().BPP/8)) + case EncAtenHermonRaw: encRaw := &RawEncoding{} if err := encRaw.Read(c, rect); err != nil { return err } enc.Encodings = append(enc.Encodings, encRaw) - aten_length = 0 - //aten_length -= uint32(rect.Area()) * uint32(c.PixelFormat().BPP) + aten_length -= uint32(rect.Area()) * uint32(c.PixelFormat().BPP/8) default: return fmt.Errorf("unknown aten hermon type %d", aten_type) @@ -115,7 +109,6 @@ func (enc *AtenHermon) Read(c Conn, rect *Rectangle) error { if aten_length < 0 { return fmt.Errorf("aten_len dropped below zero") } - fmt.Printf("aten hermon readed\n") return nil } @@ -152,7 +145,48 @@ func (enc *AtenHermon) Write(c Conn, rect *Rectangle) error { return err } } - - fmt.Printf("aten hermon writed\n") + return nil +} + +func (enc *AtenHermonSubrect) Type() EncodingType { + return EncAtenHermonSubrect +} + +func (enc *AtenHermonSubrect) Read(c Conn, rect *Rectangle) error { + if err := binary.Read(c, binary.BigEndian, &enc.A); err != nil { + return err + } + if err := binary.Read(c, binary.BigEndian, &enc.B); err != nil { + return err + } + if err := binary.Read(c, binary.BigEndian, &enc.Y); err != nil { + return err + } + if err := binary.Read(c, binary.BigEndian, &enc.X); err != nil { + return err + } + enc.Data = make([]byte, 16*16*uint32(c.PixelFormat().BPP/8)) + if err := binary.Read(c, binary.BigEndian, &enc.Data); err != nil { + return err + } + return nil +} + +func (enc *AtenHermonSubrect) Write(c Conn, rect *Rectangle) error { + if err := binary.Write(c, binary.BigEndian, enc.A); err != nil { + return err + } + if err := binary.Write(c, binary.BigEndian, enc.B); err != nil { + return err + } + if err := binary.Write(c, binary.BigEndian, enc.Y); err != nil { + return err + } + if err := binary.Write(c, binary.BigEndian, enc.X); err != nil { + return err + } + if err := binary.Write(c, binary.BigEndian, enc.Data); err != nil { + return err + } return nil } diff --git a/handlers.go b/handlers.go index c7c6ac6..37d4617 100644 --- a/handlers.go +++ b/handlers.go @@ -5,32 +5,11 @@ import ( "fmt" ) -// ClientHandler represents client handler -type ClientHandler interface { +// Handler represents handler of handshake +type Handler interface { Handle(Conn) error } -// ClientMessage is the interface -type ClientMessage interface { - String() string - Type() ClientMessageType - Read(Conn) (ClientMessage, error) - Write(Conn) error -} - -// ServerHandler represents server handler -type ServerHandler interface { - Handle(Conn) error -} - -// ServerMessage is the interface -type ServerMessage interface { - String() string - Type() ServerMessageType - Read(Conn) (ServerMessage, error) - Write(Conn) error -} - // ProtoVersionLength protocol version length const ProtoVersionLength = 12 @@ -256,27 +235,28 @@ type DefaultClientServerInitHandler struct{} // Handle provide default server init handler func (*DefaultClientServerInitHandler) Handle(c Conn) error { + var err error srvInit := ServerInit{} - if err := binary.Read(c, binary.BigEndian, &srvInit.FBWidth); err != nil { + if err = binary.Read(c, binary.BigEndian, &srvInit.FBWidth); err != nil { return err } - if err := binary.Read(c, binary.BigEndian, &srvInit.FBHeight); err != nil { + if err = binary.Read(c, binary.BigEndian, &srvInit.FBHeight); err != nil { return err } - if err := binary.Read(c, binary.BigEndian, &srvInit.PixelFormat); err != nil { + if err = binary.Read(c, binary.BigEndian, &srvInit.PixelFormat); err != nil { return err } - if err := binary.Read(c, binary.BigEndian, &srvInit.NameLength); err != nil { + if err = binary.Read(c, binary.BigEndian, &srvInit.NameLength); err != nil { return err } srvInit.NameText = make([]byte, srvInit.NameLength) - if err := binary.Read(c, binary.BigEndian, &srvInit.NameText); err != nil { + if err = binary.Read(c, binary.BigEndian, &srvInit.NameText); err != nil { return err } c.SetDesktopName(srvInit.NameText) - if c.Protocol() == "aten" { + if c.Protocol() == "aten1" { c.SetWidth(800) c.SetHeight(600) c.SetPixelFormat(NewPixelFormatAten()) @@ -285,7 +265,7 @@ func (*DefaultClientServerInitHandler) Handle(c Conn) error { c.SetHeight(srvInit.FBHeight) c.SetPixelFormat(srvInit.PixelFormat) } - if c.Protocol() == "aten" { + if c.Protocol() == "aten1" { ikvm := struct { _ [8]byte IKVMVideoEnable uint8 @@ -293,9 +273,11 @@ func (*DefaultClientServerInitHandler) Handle(c Conn) error { IKVMKickEnable uint8 VUSBEnable uint8 }{} - if err := binary.Read(c, binary.BigEndian, &ikvm); err != nil { + if err = binary.Read(c, binary.BigEndian, &ikvm); err != nil { return err } + } + /* caps := struct { ServerMessagesNum uint16 ClientMessagesNum uint16 @@ -306,7 +288,7 @@ func (*DefaultClientServerInitHandler) Handle(c Conn) error { return err } - caps.ServerMessagesNum = uint16(2) + caps.ServerMessagesNum = uint16(1) var item [16]byte for i := uint16(0); i < caps.ServerMessagesNum; i++ { if err := binary.Read(c, binary.BigEndian, &item); err != nil { @@ -315,7 +297,6 @@ func (*DefaultClientServerInitHandler) Handle(c Conn) error { fmt.Printf("server message cap %s\n", item) } - /* for i := uint16(0); i < caps.ClientMessagesNum; i++ { if err := binary.Read(c, binary.BigEndian, &item); err != nil { return err @@ -328,12 +309,11 @@ func (*DefaultClientServerInitHandler) Handle(c Conn) error { } fmt.Printf("encoding cap %s\n", item) } - */ // var pad [1]byte // if err := binary.Read(c, binary.BigEndian, &pad); err != nil { // return err // } - } + }*/ return nil } diff --git a/image.go b/image.go index 78115e9..f64d66a 100644 --- a/image.go +++ b/image.go @@ -4,6 +4,7 @@ import ( "encoding/binary" "fmt" "image" + "strings" ) //var _ draw.Drawer = (*ServerConn)(nil) @@ -174,7 +175,7 @@ func (rect *Rectangle) Read(c Conn) error { case EncTightPng: rect.Enc = &TightPngEncoding{} case EncRaw: - if c.Protocol() == "aten" { + if strings.HasPrefix(c.Protocol(), "aten") { rect.Enc = &AtenHermon{} } else { rect.Enc = &RawEncoding{} diff --git a/messages.go b/messages.go index a560e1b..a0e90c0 100644 --- a/messages.go +++ b/messages.go @@ -25,7 +25,7 @@ var ( } ) -// ClientMessageType represents a Client-to-Server RFB message type. +// ClientMessageType represents RFB message type type ClientMessageType uint8 //go:generate stringer -type=ClientMessageType @@ -41,12 +41,10 @@ const ( ClientCutTextMsgType ) -// ServerMessageType represents a Client-to-Server RFB message type. +// ServerMessageType represents RFB message type type ServerMessageType uint8 -//go:generate stringer -type=ServerMessageType - -// Client-to-Server message types. +// Server-to-Client message types const ( FramebufferUpdateMsgType ServerMessageType = iota SetColorMapEntriesMsgType @@ -67,6 +65,20 @@ func (srvInit ServerInit) String() string { return fmt.Sprintf("Width: %d, Height: %d, PixelFormat: %s, NameLength: %d, MameText: %s", srvInit.FBWidth, srvInit.FBHeight, srvInit.PixelFormat, srvInit.NameLength, srvInit.NameText) } +type ClientMessage interface { + String() string + Type() ClientMessageType + Read(Conn) (ClientMessage, error) + Write(Conn) error +} + +type ServerMessage interface { + String() string + Type() ServerMessageType + Read(Conn) (ServerMessage, error) + Write(Conn) error +} + // FramebufferUpdate holds a FramebufferUpdate wire format message. type FramebufferUpdate struct { _ [1]byte // pad @@ -79,7 +91,7 @@ func (msg *FramebufferUpdate) String() string { return fmt.Sprintf("rects %d rectangle[]: { %v }", msg.NumRect, msg.Rects) } -// Type return ServerMessageType +// Type return MessageType func (*FramebufferUpdate) Type() ServerMessageType { return FramebufferUpdateMsgType } @@ -137,7 +149,7 @@ func (msg *ServerCutText) String() string { return fmt.Sprintf("lenght: %d text: %s", msg.Length, msg.Text) } -// Type returns ServerMessageType +// Type returns MessageType func (*ServerCutText) Type() ServerMessageType { return ServerCutTextMsgType } @@ -193,7 +205,7 @@ func (*Bell) String() string { return fmt.Sprintf("bell") } -// Type returns ServerMessageType +// Type returns MessageType func (*Bell) Type() ServerMessageType { return BellMsgType } @@ -224,7 +236,7 @@ func (msg *SetColorMapEntries) String() string { return fmt.Sprintf("first color: %d, numcolors: %d, colors[]: { %v }", msg.FirstColor, msg.ColorsNum, msg.Colors) } -// Type returns ServerMessageType +// Type returns MessageType func (*SetColorMapEntries) Type() ServerMessageType { return SetColorMapEntriesMsgType } @@ -301,7 +313,7 @@ func (msg *SetPixelFormat) String() string { return fmt.Sprintf("%s", msg.PF) } -// Type returns ClientMessageType +// Type returns MessageType func (*SetPixelFormat) Type() ClientMessageType { return SetPixelFormatMsgType } @@ -346,7 +358,7 @@ func (msg *SetEncodings) String() string { return fmt.Sprintf("encnum: %d, encodings[]: { %v }", msg.EncNum, msg.Encodings) } -// Type returns ClientMessageType +// Type returns MessageType func (*SetEncodings) Type() ClientMessageType { return SetEncodingsMsgType } @@ -410,7 +422,7 @@ func (msg *FramebufferUpdateRequest) String() string { return fmt.Sprintf("incremental: %d, x: %d, y: %d, width: %d, height: %d", msg.Inc, msg.X, msg.Y, msg.Width, msg.Height) } -// Type returns ClientMessageType +// Type returns MessageType func (*FramebufferUpdateRequest) Type() ClientMessageType { return FramebufferUpdateRequestMsgType } @@ -447,7 +459,7 @@ func (msg *KeyEvent) String() string { return fmt.Sprintf("down: %d, key: %v", msg.Down, msg.Key) } -// Type returns ClientMessageType +// Type returns MessageType func (*KeyEvent) Type() ClientMessageType { return KeyEventMsgType } @@ -483,7 +495,7 @@ func (msg *PointerEvent) String() string { return fmt.Sprintf("mask %d, x: %d, y: %d", msg.Mask, msg.X, msg.Y) } -// Type returns ClientMessageType +// Type returns MessageType func (*PointerEvent) Type() ClientMessageType { return PointerEventMsgType } @@ -520,7 +532,7 @@ func (msg *ClientCutText) String() string { return fmt.Sprintf("length: %d, text: %s", msg.Length, msg.Text) } -// Type returns ClientMessageType +// Type returns MessageType func (*ClientCutText) Type() ClientMessageType { return ClientCutTextMsgType } diff --git a/messages_aten.go b/messages_aten.go new file mode 100644 index 0000000..93c02ea --- /dev/null +++ b/messages_aten.go @@ -0,0 +1,314 @@ +package vnc + +import ( + "encoding/binary" + "fmt" +) + +// Aten IKVM server message types +const ( + AteniKVMFrontGroundEventMsgType ServerMessageType = 4 + AteniKVMKeepAliveEventMsgType ServerMessageType = 22 + AteniKVMVideoGetInfoMsgType ServerMessageType = 51 + AteniKVMMouseGetInfoMsgType ServerMessageType = 55 + AteniKVMSessionMessageMsgType ServerMessageType = 57 + AteniKVMGetViewerLangMsgType ServerMessageType = 60 +) + +// Aten IKVM client message types +const ( + AteniKVMKeyEventMsgType ClientMessageType = 4 + AteniKVMPointerEventMsgType ClientMessageType = 5 +) + +// AteniKVMKeyEvent holds the wire format message +type AteniKVMKeyEvent struct { + _ [1]byte // padding + Down uint8 // down-flag + _ [2]byte // padding + Key Key // key + _ [9]byte // padding +} + +// AteniKVMPointerEvent holds the wire format message +type AteniKVMPointerEvent struct { + _ [1]byte // padding + Mask uint8 // mask + X uint16 // x + Y uint16 // y + _ [11]byte // padding +} + +func (msg *AteniKVMPointerEvent) String() string { + return fmt.Sprintf("mask: %d, x:%d, y:%d", msg.Mask, msg.X, msg.Y) +} + +func (msg *AteniKVMPointerEvent) Type() ClientMessageType { + return AteniKVMPointerEventMsgType +} + +func (*AteniKVMPointerEvent) Read(c Conn) (ClientMessage, error) { + msg := AteniKVMPointerEvent{} + if err := binary.Read(c, binary.BigEndian, &msg); err != nil { + return nil, err + } + return &msg, nil +} + +func (msg *AteniKVMPointerEvent) Write(c Conn) error { + if err := binary.Write(c, binary.BigEndian, msg.Type()); err != nil { + return err + } + if err := binary.Write(c, binary.BigEndian, msg); err != nil { + return err + } + return c.Flush() +} + +func (msg *AteniKVMKeyEvent) String() string { + return fmt.Sprintf("down:%d, key:%s", msg.Down, msg.Key) +} + +func (msg *AteniKVMKeyEvent) Type() ClientMessageType { + return AteniKVMKeyEventMsgType +} + +func (*AteniKVMKeyEvent) Read(c Conn) (ClientMessage, error) { + msg := AteniKVMKeyEvent{} + if err := binary.Read(c, binary.BigEndian, &msg); err != nil { + return nil, err + } + return &msg, nil +} + +func (msg *AteniKVMKeyEvent) Write(c Conn) error { + if err := binary.Write(c, binary.BigEndian, msg.Type()); err != nil { + return err + } + if err := binary.Write(c, binary.BigEndian, msg); err != nil { + return err + } + return c.Flush() +} + +// AteniKVMFrontGroundEvent unknown aten ikvm message +type AteniKVMFrontGroundEvent struct { + _ [20]byte +} + +// String return string representation +func (msg *AteniKVMFrontGroundEvent) String() string { + return fmt.Sprintf("%s", msg.Type()) +} + +// Type return ServerMessageType +func (*AteniKVMFrontGroundEvent) Type() ServerMessageType { + return AteniKVMFrontGroundEventMsgType +} + +// Read unmarshal message from conn +func (*AteniKVMFrontGroundEvent) Read(c Conn) (ServerMessage, error) { + msg := &AteniKVMFrontGroundEvent{} + var pad [20]byte + if err := binary.Read(c, binary.BigEndian, &pad); err != nil { + return nil, err + } + return msg, nil +} + +// Write marshal message to conn +func (msg *AteniKVMFrontGroundEvent) Write(c Conn) error { + var pad [20]byte + if err := binary.Write(c, binary.BigEndian, msg.Type()); err != nil { + return err + } + if err := binary.Write(c, binary.BigEndian, pad); err != nil { + return err + } + return c.Flush() +} + +// AteniKVMKeepAliveEvent unknown aten ikvm message +type AteniKVMKeepAliveEvent struct { + _ [1]byte +} + +// String return string representation +func (msg *AteniKVMKeepAliveEvent) String() string { + return fmt.Sprintf("%s", msg.Type()) +} + +// Type return ServerMessageType +func (*AteniKVMKeepAliveEvent) Type() ServerMessageType { + return AteniKVMKeepAliveEventMsgType +} + +// Read unmarshal message from conn +func (*AteniKVMKeepAliveEvent) Read(c Conn) (ServerMessage, error) { + msg := &AteniKVMKeepAliveEvent{} + var pad [1]byte + if err := binary.Read(c, binary.BigEndian, &pad); err != nil { + return nil, err + } + return msg, nil +} + +// Write marshal message to conn +func (msg *AteniKVMKeepAliveEvent) Write(c Conn) error { + var pad [1]byte + if err := binary.Write(c, binary.BigEndian, msg.Type()); err != nil { + return err + } + if err := binary.Write(c, binary.BigEndian, pad); err != nil { + return err + } + return c.Flush() +} + +// AteniKVMVideoGetInfo unknown aten ikvm message +type AteniKVMVideoGetInfo struct { + _ [20]byte +} + +// String return string representation +func (msg *AteniKVMVideoGetInfo) String() string { + return fmt.Sprintf("%s", msg.Type()) +} + +// Type return ServerMessageType +func (*AteniKVMVideoGetInfo) Type() ServerMessageType { + return AteniKVMVideoGetInfoMsgType +} + +// Read unmarshal message from conn +func (*AteniKVMVideoGetInfo) Read(c Conn) (ServerMessage, error) { + msg := &AteniKVMVideoGetInfo{} + var pad [40]byte + if err := binary.Read(c, binary.BigEndian, &pad); err != nil { + return nil, err + } + return msg, nil +} + +// Write marshal message to conn +func (msg *AteniKVMVideoGetInfo) Write(c Conn) error { + var pad [4]byte + if err := binary.Write(c, binary.BigEndian, msg.Type()); err != nil { + return err + } + if err := binary.Write(c, binary.BigEndian, pad); err != nil { + return err + } + return c.Flush() +} + +// AteniKVMMouseGetInfo unknown aten ikvm message +type AteniKVMMouseGetInfo struct { + _ [2]byte +} + +// String return string representation +func (msg *AteniKVMMouseGetInfo) String() string { + return fmt.Sprintf("%s", msg.Type()) +} + +// Type return ServerMessageType +func (*AteniKVMMouseGetInfo) Type() ServerMessageType { + return AteniKVMMouseGetInfoMsgType +} + +// Read unmarshal message from conn +func (*AteniKVMMouseGetInfo) Read(c Conn) (ServerMessage, error) { + msg := &AteniKVMFrontGroundEvent{} + var pad [2]byte + if err := binary.Read(c, binary.BigEndian, &pad); err != nil { + return nil, err + } + return msg, nil +} + +// Write marshal message to conn +func (msg *AteniKVMMouseGetInfo) Write(c Conn) error { + var pad [2]byte + if err := binary.Write(c, binary.BigEndian, msg.Type()); err != nil { + return err + } + if err := binary.Write(c, binary.BigEndian, pad); err != nil { + return err + } + return c.Flush() +} + +// AteniKVMSessionMessage unknown aten ikvm message +type AteniKVMSessionMessage struct { + _ [264]byte +} + +// String return string representation +func (msg *AteniKVMSessionMessage) String() string { + return fmt.Sprintf("%s", msg.Type()) +} + +// Type return ServerMessageType +func (*AteniKVMSessionMessage) Type() ServerMessageType { + return AteniKVMSessionMessageMsgType +} + +// Read unmarshal message from conn +func (*AteniKVMSessionMessage) Read(c Conn) (ServerMessage, error) { + msg := &AteniKVMSessionMessage{} + var pad [264]byte + if err := binary.Read(c, binary.BigEndian, &pad); err != nil { + return nil, err + } + return msg, nil +} + +// Write marshal message to conn +func (msg *AteniKVMSessionMessage) Write(c Conn) error { + var pad [264]byte + if err := binary.Write(c, binary.BigEndian, msg.Type()); err != nil { + return err + } + if err := binary.Write(c, binary.BigEndian, pad); err != nil { + return err + } + return nil +} + +// AteniKVMGetViewerLang unknown aten ikvm message +type AteniKVMGetViewerLang struct { + _ [8]byte +} + +// String return string representation +func (msg *AteniKVMGetViewerLang) String() string { + return fmt.Sprintf("%s", msg.Type()) +} + +// Type return ServerMessageType +func (*AteniKVMGetViewerLang) Type() ServerMessageType { + return AteniKVMGetViewerLangMsgType +} + +// Read unmarshal message from conn +func (*AteniKVMGetViewerLang) Read(c Conn) (ServerMessage, error) { + msg := &AteniKVMGetViewerLang{} + var pad [8]byte + if err := binary.Read(c, binary.BigEndian, &pad); err != nil { + return nil, err + } + return msg, nil +} + +// Write marshal message to conn +func (msg *AteniKVMGetViewerLang) Write(c Conn) error { + var pad [8]byte + if err := binary.Write(c, binary.BigEndian, msg.Type()); err != nil { + return err + } + if err := binary.Write(c, binary.BigEndian, pad); err != nil { + return err + } + return c.Flush() +} diff --git a/messagetype_string.go b/messagetype_string.go new file mode 100644 index 0000000..2bc9d70 --- /dev/null +++ b/messagetype_string.go @@ -0,0 +1,42 @@ +// Code generated by "stringer -type=MessageType"; DO NOT EDIT. + +package vnc + +import "fmt" + +const ( + _MessageType_name_0 = "SetPixelFormatMsgTypeSetColorMapEntriesMsgTypeSetEncodingsMsgTypeFramebufferUpdateRequestMsgTypeKeyEventMsgTypePointerEventMsgTypeClientCutTextMsgType" + _MessageType_name_1 = "AteniKVMKeepAliveEventMsgType" + _MessageType_name_2 = "AteniKVMVideoGetInfoMsgType" + _MessageType_name_3 = "AteniKVMMouseGetInfoMsgType" + _MessageType_name_4 = "AteniKVMSessionMessageMsgType" + _MessageType_name_5 = "AteniKVMGetViewerLangMsgType" +) + +var ( + _MessageType_index_0 = [...]uint8{0, 21, 46, 65, 96, 111, 130, 150} + _MessageType_index_1 = [...]uint8{0, 29} + _MessageType_index_2 = [...]uint8{0, 27} + _MessageType_index_3 = [...]uint8{0, 27} + _MessageType_index_4 = [...]uint8{0, 29} + _MessageType_index_5 = [...]uint8{0, 28} +) + +func (i MessageType) String() string { + switch { + case 0 <= i && i <= 6: + return _MessageType_name_0[_MessageType_index_0[i]:_MessageType_index_0[i+1]] + case i == 22: + return _MessageType_name_1 + case i == 51: + return _MessageType_name_2 + case i == 55: + return _MessageType_name_3 + case i == 57: + return _MessageType_name_4 + case i == 60: + return _MessageType_name_5 + default: + return fmt.Sprintf("MessageType(%d)", i) + } +} diff --git a/security_aten.go b/security_aten.go index e491040..341c8fa 100644 --- a/security_aten.go +++ b/security_aten.go @@ -50,10 +50,10 @@ func (auth *ClientAuthATEN) Auth(c Conn) error { } */ if ((nt&0xffff0ff0)>>0 == 0xaff90fb0) || (nt <= 0 || nt > 0x1000000) { - c.SetProtoVersion("aten") + c.SetProtoVersion("aten1") var skip [20]byte binary.Read(c, binary.BigEndian, &skip) - fmt.Printf("skip %v\n", skip) + //fmt.Printf("skip %v\n", skip) } username := make([]byte, definedAuthLen) diff --git a/server.go b/server.go index 468ddc5..dbd958d 100644 --- a/server.go +++ b/server.go @@ -91,7 +91,7 @@ func (c *ServerConn) PixelFormat() PixelFormat { // SetDesktopName sets connection desktop name func (c *ServerConn) SetDesktopName(name []byte) { - copy(c.desktopName, name) + c.desktopName = name } // SetPixelFormat sets pixel format for server conn @@ -168,7 +168,7 @@ type ServerConn struct { var ( // DefaultServerHandlers uses default handlers for hanshake - DefaultServerHandlers = []ServerHandler{ + DefaultServerHandlers = []Handler{ &DefaultServerVersionHandler{}, &DefaultServerSecurityHandler{}, &DefaultServerClientInitHandler{}, @@ -179,14 +179,14 @@ var ( // ServerConfig config struct type ServerConfig struct { - Handlers []ServerHandler + Handlers []Handler SecurityHandlers []SecurityHandler Encodings []Encoding PixelFormat PixelFormat ColorMap ColorMap ClientMessageCh chan ClientMessage ServerMessageCh chan ServerMessage - ClientMessages []ClientMessage + Messages []ClientMessage DesktopName []byte Height uint16 Width uint16 @@ -250,7 +250,7 @@ func (*DefaultServerMessageHandler) Handle(c Conn) error { defer c.Close() clientMessages := make(map[ClientMessageType]ClientMessage) - for _, m := range cfg.ClientMessages { + for _, m := range cfg.Messages { clientMessages[m.Type()] = m } wg.Add(2)