fix for oldeer vnc protocols

Signed-off-by: Vasiliy Tolstov <v.tolstov@selfip.ru>
This commit is contained in:
Василий Толстов 2017-07-11 02:37:02 +03:00
parent faf8458fa3
commit cc43ee4e06

View File

@ -20,6 +20,8 @@ const (
ProtoVersion33 = "RFB 003.003\n" ProtoVersion33 = "RFB 003.003\n"
// ProtoVersion38 sets if proto 003.008 // ProtoVersion38 sets if proto 003.008
ProtoVersion38 = "RFB 003.008\n" ProtoVersion38 = "RFB 003.008\n"
// ProtoVersion37 sets if proto 003.007
ProtoVersion37 = "RFB 003.007\n"
) )
// ParseProtoVersion parse protocol version // ParseProtoVersion parse protocol version
@ -175,6 +177,8 @@ type DefaultServerSecurityHandler struct{}
// Handle provide server side security handler // Handle provide server side security handler
func (*DefaultServerSecurityHandler) Handle(c Conn) error { func (*DefaultServerSecurityHandler) Handle(c Conn) error {
cfg := c.Config().(*ServerConfig) cfg := c.Config().(*ServerConfig)
var secType SecurityType
if c.Protocol() == ProtoVersion37 || c.Protocol() == ProtoVersion38 {
if err := binary.Write(c, binary.BigEndian, uint8(len(cfg.SecurityHandlers))); err != nil { if err := binary.Write(c, binary.BigEndian, uint8(len(cfg.SecurityHandlers))); err != nil {
return err return err
} }
@ -184,16 +188,27 @@ func (*DefaultServerSecurityHandler) Handle(c Conn) error {
return err return err
} }
} }
} else {
st := uint32(0)
for _, sectype := range cfg.SecurityHandlers {
if uint32(sectype.Type()) > st {
st = uint32(sectype.Type())
secType = sectype.Type()
}
}
if err := binary.Write(c, binary.BigEndian, st); err != nil {
return err
}
}
if err := c.Flush(); err != nil { if err := c.Flush(); err != nil {
return err return err
} }
var secType SecurityType if c.Protocol() == ProtoVersion38 {
if err := binary.Read(c, binary.BigEndian, &secType); err != nil { if err := binary.Read(c, binary.BigEndian, &secType); err != nil {
return err return err
} }
}
secTypes := make(map[SecurityType]SecurityHandler) secTypes := make(map[SecurityType]SecurityHandler)
for _, sType := range cfg.SecurityHandlers { for _, sType := range cfg.SecurityHandlers {
secTypes[sType.Type()] = sType secTypes[sType.Type()] = sType
@ -209,6 +224,7 @@ func (*DefaultServerSecurityHandler) Handle(c Conn) error {
if authErr != nil { if authErr != nil {
authCode = uint32(1) authCode = uint32(1)
} }
if err := binary.Write(c, binary.BigEndian, authCode); err != nil { if err := binary.Write(c, binary.BigEndian, authCode); err != nil {
return err return err
} }
@ -220,6 +236,8 @@ func (*DefaultServerSecurityHandler) Handle(c Conn) error {
c.SetSecurityHandler(sType) c.SetSecurityHandler(sType)
return nil return nil
} }
if c.Protocol() == ProtoVersion38 {
if err := binary.Write(c, binary.BigEndian, uint32(len(authErr.Error()))); err != nil { if err := binary.Write(c, binary.BigEndian, uint32(len(authErr.Error()))); err != nil {
return err return err
} }
@ -229,6 +247,7 @@ func (*DefaultServerSecurityHandler) Handle(c Conn) error {
if err := c.Flush(); err != nil { if err := c.Flush(); err != nil {
return err return err
} }
}
return authErr return authErr
} }