diff --git a/cmd/rdpgw/protocol/errors.go b/cmd/rdpgw/protocol/errors.go index e7c8eed7207d6aa68cca79891875e23177e7d661..cf724a282dd5c8e66a78433a632c9bf51296e29f 100644 --- a/cmd/rdpgw/protocol/errors.go +++ b/cmd/rdpgw/protocol/errors.go @@ -1,5 +1,6 @@ package protocol +/* const ( ERROR_NO = 0x0000000 ERROR_CLIENT_DISCONNECT = 0x0000001 @@ -122,3 +123,33 @@ const ( ERROR_AZURE_TRIAL = 0x300004F ERROR_AZURE_EXPIRED = 0x3000050 ) +*/ + +/* Common Error Code */ +const ( + ERROR_SUCCESS = 0x00000000 + ERROR_ACCESS_DENIED = 0x00000005 + E_PROXY_INTERNALERROR = 0x800759D8 + E_PROXY_RAP_ACCESSDENIED = 0x800759DA + E_PROXY_NAP_ACCESSDENIED = 0x800759DB + E_PROXY_ALREADYDISCONNECTED = 0x800759DF + E_PROXY_QUARANTINE_ACCESSDENIED = 0x800759ED + E_PROXY_NOCERTAVAILABLE = 0x800759EE + E_PROXY_COOKIE_BADPACKET = 0x800759F7 + E_PROXY_COOKIE_AUTHENTICATION_ACCESS_DENIED = 0x800759F8 + E_PROXY_UNSUPPORTED_AUTHENTICATION_METHOD = 0x800759F9 + E_PROXY_CAPABILITYMISMATCH = 0x800759E9 + E_PROXY_TS_CONNECTFAILED = 0x000059DD + E_PROXY_MAXCONNECTIONSREACHED = 0x000059E6 + // E_PROXY_INTERNALERROR = 0x000059D8 + ERROR_GRACEFUL_DISCONNECT = 0x000004CA + E_PROXY_NOTSUPPORTED = 0x000059E8 + SEC_E_LOGON_DENIED = 0x8009030C + E_PROXY_SESSIONTIMEOUT = 0x000059F6 + E_PROXY_REAUTH_AUTHN_FAILED = 0x000059FA + E_PROXY_REAUTH_CAP_FAILED = 0x000059FB + E_PROXY_REAUTH_RAP_FAILED = 0x000059FC + E_PROXY_SDR_NOT_SUPPORTED_BY_TS = 0x000059FD + E_PROXY_REAUTH_NAP_FAILED = 0x00005A00 + E_PROXY_CONNECTIONABORTED = 0x000004D4 +) diff --git a/cmd/rdpgw/protocol/server.go b/cmd/rdpgw/protocol/server.go index 7f7a70f3c2cca227cd776657be20d0d4efe0cefc..0a7fe8fd2c407aff5fffb34f1e87491a32b21dc1 100644 --- a/cmd/rdpgw/protocol/server.go +++ b/cmd/rdpgw/protocol/server.go @@ -74,12 +74,12 @@ func (s *Server) Process(ctx context.Context) error { log.Printf("Client handshakeRequest from %s", common.GetClientIp(ctx)) if s.State != SERVER_STATE_INITIALIZED { log.Printf("Handshake attempted while in wrong state %d != %d", s.State, SERVER_STATE_INITIALIZED) - msg := s.handshakeResponse(0x0, 0x0, ERROR_GENERIC) + msg := s.handshakeResponse(0x0, 0x0, E_PROXY_INTERNALERROR) s.Session.TransportOut.WritePacket(msg) - return fmt.Errorf("%x: wrong state", ERROR_GENERIC) + return fmt.Errorf("%x: wrong state", E_PROXY_INTERNALERROR) } major, minor, _, _ := s.handshakeRequest(pkt) // todo check if auth matches what the handler can do - msg := s.handshakeResponse(major, minor, ERROR_NO) + msg := s.handshakeResponse(major, minor, ERROR_SUCCESS) s.Session.TransportOut.WritePacket(msg) s.State = SERVER_STATE_HANDSHAKE case PKT_TYPE_TUNNEL_CREATE: @@ -87,20 +87,20 @@ func (s *Server) Process(ctx context.Context) error { if s.State != SERVER_STATE_HANDSHAKE { log.Printf("Tunnel create attempted while in wrong state %d != %d", s.State, SERVER_STATE_HANDSHAKE) - msg := s.tunnelResponse(ERROR_SECURITY_GATEWAY_COOKIE_REJECTED) + msg := s.tunnelResponse(E_PROXY_INTERNALERROR) s.Session.TransportOut.WritePacket(msg) - return fmt.Errorf("%x: PAA cookie rejected, wrong state", ERROR_SECURITY_GATEWAY_COOKIE_REJECTED) + return fmt.Errorf("%x: PAA cookie rejected, wrong state", E_PROXY_INTERNALERROR) } _, cookie := s.tunnelRequest(pkt) if s.VerifyTunnelCreate != nil { if ok, _ := s.VerifyTunnelCreate(ctx, cookie); !ok { log.Printf("Invalid PAA cookie received from client %s", common.GetClientIp(ctx)) - msg := s.tunnelResponse(ERROR_SECURITY_GATEWAY_COOKIE_INVALID) + msg := s.tunnelResponse(E_PROXY_COOKIE_AUTHENTICATION_ACCESS_DENIED) s.Session.TransportOut.WritePacket(msg) - return fmt.Errorf("%x: invalid PAA cookie", ERROR_SECURITY_GATEWAY_COOKIE_INVALID) + return fmt.Errorf("%x: invalid PAA cookie", E_PROXY_COOKIE_AUTHENTICATION_ACCESS_DENIED) } } - msg := s.tunnelResponse(ERROR_NO) + msg := s.tunnelResponse(ERROR_SUCCESS) s.Session.TransportOut.WritePacket(msg) s.State = SERVER_STATE_TUNNEL_CREATE case PKT_TYPE_TUNNEL_AUTH: @@ -108,20 +108,20 @@ func (s *Server) Process(ctx context.Context) error { if s.State != SERVER_STATE_TUNNEL_CREATE { log.Printf("Tunnel auth attempted while in wrong state %d != %d", s.State, SERVER_STATE_TUNNEL_CREATE) - msg := s.tunnelAuthResponse(ERROR_GENERIC) + msg := s.tunnelAuthResponse(E_PROXY_INTERNALERROR) s.Session.TransportOut.WritePacket(msg) - return fmt.Errorf("%x: Tunnel auth rejected, wrong state", ERROR_GENERIC) + return fmt.Errorf("%x: Tunnel auth rejected, wrong state", E_PROXY_INTERNALERROR) } client := s.tunnelAuthRequest(pkt) if s.VerifyTunnelAuthFunc != nil { if ok, _ := s.VerifyTunnelAuthFunc(ctx, client); !ok { log.Printf("Invalid client name: %s", client) - msg := s.tunnelAuthResponse(ERROR_SECURITY) + msg := s.tunnelAuthResponse(ERROR_ACCESS_DENIED) s.Session.TransportOut.WritePacket(msg) - return fmt.Errorf("%x: Tunnel auth rejected, invalid client name", ERROR_SECURITY) + return fmt.Errorf("%x: Tunnel auth rejected, invalid client name", ERROR_ACCESS_DENIED) } } - msg := s.tunnelAuthResponse(ERROR_NO) + msg := s.tunnelAuthResponse(ERROR_SUCCESS) s.Session.TransportOut.WritePacket(msg) s.State = SERVER_STATE_TUNNEL_AUTHORIZE case PKT_TYPE_CHANNEL_CREATE: @@ -129,30 +129,30 @@ func (s *Server) Process(ctx context.Context) error { if s.State != SERVER_STATE_TUNNEL_AUTHORIZE { log.Printf("Channel create attempted while in wrong state %d != %d", s.State, SERVER_STATE_TUNNEL_AUTHORIZE) - msg := s.channelResponse(ERROR_GENERIC) + msg := s.channelResponse(E_PROXY_INTERNALERROR) s.Session.TransportOut.WritePacket(msg) - return fmt.Errorf("%x: Channel create rejected, wrong state", ERROR_GENERIC) + return fmt.Errorf("%x: Channel create rejected, wrong state", E_PROXY_INTERNALERROR) } server, port := s.channelRequest(pkt) host := net.JoinHostPort(server, strconv.Itoa(int(port))) if s.VerifyServerFunc != nil { if ok, _ := s.VerifyServerFunc(ctx, host); !ok { log.Printf("Not allowed to connect to %s by policy handler", host) - msg := s.channelResponse(ERROR_SECURITY_GATEWAY_POLICY) + msg := s.channelResponse(E_PROXY_RAP_ACCESSDENIED) s.Session.TransportOut.WritePacket(msg) - return fmt.Errorf("%x: denied by security policy", ERROR_SECURITY_GATEWAY_POLICY) + return fmt.Errorf("%x: denied by security policy", E_PROXY_RAP_ACCESSDENIED) } } log.Printf("Establishing connection to RDP server: %s", host) s.Remote, err = net.DialTimeout("tcp", host, time.Second*15) if err != nil { log.Printf("Error connecting to %s, %s", host, err) - msg := s.channelResponse(ERROR_GENERIC) + msg := s.channelResponse(E_PROXY_INTERNALERROR) s.Session.TransportOut.WritePacket(msg) return err } log.Printf("Connection established") - msg := s.channelResponse(ERROR_NO) + msg := s.channelResponse(E_PROXY_INTERNALERROR) s.Session.TransportOut.WritePacket(msg) // Make sure to start the flow from the RDP server first otherwise connections @@ -181,7 +181,7 @@ 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") } - msg := s.channelCloseResponse(ERROR_NO) + msg := s.channelCloseResponse(ERROR_SUCCESS) s.Session.TransportOut.WritePacket(msg) //s.Session.TransportIn.Close() //s.Session.TransportOut.Close()