diff --git a/cmd/rdpgw/protocol/server.go b/cmd/rdpgw/protocol/server.go index 15d8f97601d19707a3cd5ccc2ced51563127f48c..852fdd010d31ba1a4710fc2c48a14bc87a1cb418 100644 --- a/cmd/rdpgw/protocol/server.go +++ b/cmd/rdpgw/protocol/server.go @@ -143,7 +143,6 @@ func (s *Server) Process(ctx context.Context) error { go forward(s.Remote, s.Session.TransportOut) s.State = SERVER_STATE_CHANNEL_CREATE case PKT_TYPE_DATA: - log.Printf("Data received") if s.State < SERVER_STATE_CHANNEL_CREATE { log.Printf("Data received while in wrong state %d != %d", s.State, SERVER_STATE_CHANNEL_CREATE) return errors.New("wrong state") @@ -165,9 +164,10 @@ func (s *Server) Process(ctx context.Context) error { log.Printf("Channel closed while in wrong state %d != %d", s.State, SERVER_STATE_OPENED) return errors.New("wrong state") } - log.Printf("Channel closed") - s.Session.TransportIn.Close() - s.Session.TransportOut.Close() + msg := s.channelCloseResponse() + s.Session.TransportOut.WritePacket(msg) + //s.Session.TransportIn.Close() + //s.Session.TransportOut.Close() s.State = SERVER_STATE_CLOSED return nil default: @@ -314,6 +314,25 @@ func (s *Server) channelResponse() []byte { return createPacket(PKT_TYPE_CHANNEL_RESPONSE, buf.Bytes()) } +func (s *Server) channelCloseResponse() []byte { + buf := new(bytes.Buffer) + + binary.Write(buf, binary.LittleEndian, uint32(0)) // error code + binary.Write(buf, binary.LittleEndian, uint16(HTTP_CHANNEL_RESPONSE_FIELD_CHANNELID)) // fields present + binary.Write(buf, binary.LittleEndian, uint16(0)) // reserved + + // channel id is required for Windows clients + binary.Write(buf, binary.LittleEndian, uint32(1)) // channel id + + // optional fields + // channel id uint32 (4) + // udp port uint16 (2) + // udp auth cookie 1 byte for side channel + // length uint16 + + return createPacket(PKT_TYPE_CLOSE_CHANNEL_RESPONSE, buf.Bytes()) +} + func makeRedirectFlags(flags RedirectFlags) int { var redir = 0