Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Convert vnclog from by-pass proxy to inline proxy #252

Open
pmhahn opened this issue Feb 13, 2023 · 0 comments
Open

Convert vnclog from by-pass proxy to inline proxy #252

pmhahn opened this issue Feb 13, 2023 · 0 comments

Comments

@pmhahn
Copy link
Collaborator

pmhahn commented Feb 13, 2023

Please include the following information:

vncdotool version
1.1.0-dev

VNC server and version
LibVNCServer-0.9.14

Steps to reproduce

ppmmake '#f70' 640 480 > ./dummy.ppm
/tmp/vncdo/libvncserver-LibVNCServer-0.9.14/examples/pnmshow ./dummy.ppm &
vnclog -v -s localhost:0 ./log.vncdo &
gvncviewer localhost:2

Expected result
vnclog should be able to log the interaction between gvncviewer and pnmshow

Which erroneous result did you get instead

INFO:twisted:unknown encoding received <Encoding.TIGHT: 7>

Additional information
While #243 added NullTransport.loseConnection required for logproxy, it noticed this issue: currently stream handling is wrong in several cases: As neither TCP nor the RFB/VNC protocol defines any framing, all messages passed from client-to-server and server-to-client must be understood and handled.
While testing with gvncviewer as my client connecting LibVNCServer-0.9.14/examples/pnmshow24 as my server via vnclog I noticed, that they negotiated many more pseudo encoding than vnclog understands and can handle:

  • <Encoding.TIGHT: 7>
  • <Encoding.PSEUDO_QEMU_EXTENDED_KEY_EVENT: -258>
  • <Encoding.PSEUDO_QEMU_LED_STATE: -261>
  • <Encoding.PSEUDO_DESKTOP_SIZE: -223>
  • <Encoding.PSEUDO_VMWARE_DISPLAY_MODE_CHANGE: 1464686185>
  • <Encoding.PSEUDO_QEMU_AUDIO: -259>
  • <Encoding.PSEUDO_CURSOR: -239>
  • <Encoding.PSEUDO_X_CURSOR: -240>
  • <Encoding.PSEUDO_QEMU_POINTER_MODTION_CHANGE: -257>
  • <Encoding.ZRLE: 16>
  • <Encoding.HEXTILE: 5>
  • <Encoding.RRE: 2>
  • <Encoding.COPY_RECTANGLE: 1>
  • <Encoding.RAW: 0>

The pnmshow24 server supports many of them, but not all:

rfbProcessClientNormalMessage: ignoring unsupported encoding type Enc(0xFFFFFEFE)
rfbProcessClientNormalMessage: ignoring unsupported encoding type Enc(0xFFFFFEFB)
Enabling NewFBSize protocol extension for client 127.0.0.1
rfbProcessClientNormalMessage: ignoring unsupported encoding type Enc(0x574D5669)
rfbProcessClientNormalMessage: ignoring unsupported encoding type Enc(0xFFFFFEFD)
Enabling full-color cursor updates for client 127.0.0.1
Enabling X-style cursor updates for client 127.0.0.1
rfbProcessClientNormalMessage: ignoring unsupported encoding type Enc(0xFFFFFEFF)
Using tight encoding for client 127.0.0.1

The last one is problematic as this results in a FramebufferUpdate-Message with the Encoding.TIGHT pseudo-encoding, which vncdotool cannot handle:

INFO:twisted:x=3 y=3 width=8 height=7 <Encoding.PSEUDO_CURSOR: -239>
INFO:twisted:x=0 y=0 width=256 height=256 <Encoding.TIGHT: 7>
INFO:twisted:unknown encoding received <Encoding.TIGHT: 7>
INFO:twisted:x=181 y=48643 width=30721 height=60669 '<Encoding.UNKNOWN: 5785c57>'

Afterwards vnclog is out-of-synchronization and starts logging many errors as most following bytes are seen as an unknown Server-to-Client message ID.

To handle this correctly vnclog needs to sit in-between of the client and the server and must rewrite some of those messages to filter out any AuthType, Encoding, … vncdotool does not understand.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

1 participant