Package: ssvnc Severity: wishlist Tags: upstream patch I've implemented scprompt "auth" request, used by ultravnc when passing -sc_exit or -sc_prompt The relevant code is: http://ultravnc.svn.sourceforge.net/viewvc/ultravnc/UltraVNC%20Project%20Root/UltraVNC/winvnc/winvnc/vncclient.cpp?revision=753&view=markup
I'm not sure about the use of Swap32IfBE(), but since the ultravnc code is le I think it should be correct to use this function. Regards -- System Information: Debian Release: wheezy/sid APT prefers unstable APT policy: (500, 'unstable') Architecture: amd64 (x86_64) Kernel: Linux 2.6.32-5-xen-amd64 (SMP w/8 CPU cores) Locale: LANG=C, LC_CTYPE=C (charmap=ANSI_X3.4-1968) Shell: /bin/sh linked to /bin/bash Versions of packages ssvnc depends on: ii bind9-host [host] 1:9.8.4.dfsg-1 ii libc6 2.13-37 ii libice6 2:1.0.8-2 ii libjpeg8 8d-1 ii libsm6 2:1.2.1-2 ii libssl1.0.0 1.0.1c-4 ii libx11-6 2:1.5.0-1 ii libxaw7 2:1.0.10-2 ii libxext6 2:1.3.1-2 ii libxmu6 2:1.1.1-1 ii libxpm4 1:3.5.10-1 ii libxt6 1:1.1.3-1 ii openssh-client 1:6.0p1-3 ii openssl 1.0.1c-4 ii procps 1:3.3.4-2 ii psmisc 22.20-1 pn stunnel4 <none> pn tk <none> ii xterm 278-4 ii zlib1g 1:1.2.7.dfsg-13 Versions of packages ssvnc recommends: pn default-jre | java5-runtime <none> ssvnc suggests no packages.
--- ssvnc-1.0.29.orig/vnc_unixsrc/vncviewer/rfbproto.c +++ ssvnc-1.0.29/vnc_unixsrc/vncviewer/rfbproto.c @@ -46,6 +46,7 @@ static int SelectSecurityType(void); static Bool PerformAuthenticationTight(void); static Bool AuthenticateVNC(void); static Bool AuthenticateUltraVNC(void); +static Bool AuthenticateSCPrompt(void); static Bool AuthenticateUnixLogin(void); static Bool ReadInteractionCaps(void); static Bool ReadCapabilityList(CapsContainer *caps, int count); @@ -935,6 +936,11 @@ InitialiseRFBConnection(void) return False; } break; + case rfbUltraVNC_SCPrompt: + if (!AuthenticateSCPrompt()) { + return False; + } + break; default: /* should never happen */ sprintf(msgbuf, "Internal error: Invalid security type: %d\n", secType); wmsg(msgbuf, 1); @@ -1075,7 +1081,7 @@ static int SelectSecurityType(void) { CARD8 nSecTypes; - CARD8 knownSecTypes[] = {rfbSecTypeNone, rfbSecTypeVncAuth, rfbSecTypeUltra}; + CARD8 knownSecTypes[] = {rfbSecTypeNone, rfbSecTypeVncAuth, rfbSecTypeUltra, rfbUltraVNC_SCPrompt}; int nKnownSecTypes = sizeof(knownSecTypes); CARD8 *secTypes; CARD8 secType = rfbSecTypeInvalid; @@ -1083,6 +1089,7 @@ SelectSecurityType(void) int have_none = 0; int have_vncauth = 0; int have_ultra = 0; + int have_scprompt = 0; fprintf(stderr, "\nSelectSecurityType:\n"); @@ -1110,6 +1117,8 @@ SelectSecurityType(void) have_vncauth = 1; } else if (rfbSecTypeUltra == secTypes[j]) { have_ultra = 1; + } else if (rfbUltraVNC_SCPrompt == secTypes[j]) { + have_scprompt = 1; } } @@ -1135,10 +1144,11 @@ SelectSecurityType(void) } if (have_ultra) { - if(have_none || have_vncauth) { - knownSecTypes[0] = rfbSecTypeUltra; - knownSecTypes[1] = rfbSecTypeNone; - knownSecTypes[2] = rfbSecTypeVncAuth; + if(have_none || have_vncauth || have_scprompt) { + knownSecTypes[0] = rfbUltraVNC_SCPrompt; + knownSecTypes[1] = rfbSecTypeUltra; + knownSecTypes[2] = rfbSecTypeNone; + knownSecTypes[3] = rfbSecTypeVncAuth; } else { fprintf(stderr, "Info: UltraVNC server not offering security types 'None' or 'VncAuth'.\n"); } @@ -1843,6 +1853,38 @@ AuthenticateUltraVNC(void) return False; } +static Bool +AuthenticateSCPrompt(void) +{ + char message[1025]; + CARD32 size, accepted = Swap32IfBE(1); + + if (!ReadFromRFBServer((char *)&size, 4)) { + return False; + } + + size = Swap32IfBE(size); + + if ((size < 0) || (size > 1024)) { + fprintf(stderr, "UltraVNC SCPrompt invalid message size %d\n", size); + if (size < 0) size = 0; + if (size > 1024) size = 1024; + } + + if (!ReadFromRFBServer((char *)&message, size)) { + return False; + } + + message[size] = 0; + fprintf(stderr, "UltraVNC SCPrompt message:\n%s", message); + + if (!WriteExact(rfbsock, (char *)&accepted, 4)) { + return False; + } + + return AuthenticateUltraVNC(); +} + /* * Unix login-style authentication. */