void rfbAuthNewClient(rfbClientPtr cl) { int32_t securityType = rfbSecTypeInvalid; if (!cl->screen->authPasswdData || cl->reverseConnection) { /* chk if this condition is valid or not. */ securityType = rfbSecTypeNone; } else if (cl->screen->authPasswdData) { securityType = rfbSecTypeVncAuth; } if (cl->protocolMajorVersion==3 && cl->protocolMinorVersion < 7) { /* Make sure we use only RFB 3.3 compatible security types. */ if (securityType == rfbSecTypeInvalid) { rfbLog("VNC authentication disabled - RFB 3.3 client rejected\n"); rfbClientConnFailed(cl, "Your viewer cannot handle required " "authentication methods"); return; } rfbSendSecurityType(cl, securityType); } else { /* Here it's ok when securityType is set to rfbSecTypeInvalid. */ rfbSendSecurityTypeList(cl, securityType); } }
static void rfbProcessClientProtocolVersion(rfbClientPtr cl) { rfbProtocolVersionMsg pv; int n, major, minor; char failureReason[256]; if ((n = ReadExact(cl, pv, sz_rfbProtocolVersionMsg)) <= 0) { if (n == 0) debug_printf("rfbProcessClientProtocolVersion: client gone\n"); else debug_printf("rfbProcessClientProtocolVersion: read"); rfbCloseClient(cl); return; } pv[sz_rfbProtocolVersionMsg] = 0; if (sscanf(pv,rfbProtocolVersionFormat,&major,&minor) != 2) { debug_printf("rfbProcessClientProtocolVersion: not a valid RFB client\n"); rfbCloseClient(cl); return; } debug_printf("Protocol version %d.%d\n", major, minor); if (major != rfbProtocolMajorVersion) { /* Major version mismatch - send a ConnFailed message */ debug_printf("Major version mismatch\n"); sprintf(failureReason, "RFB protocol version mismatch - server %d.%d, client %d.%d", rfbProtocolMajorVersion,rfbProtocolMinorVersion,major,minor); rfbClientConnFailed(cl, failureReason); return; } if (minor != rfbProtocolMinorVersion) { /* Minor version mismatch - warn but try to continue */ debug_printf("Ignoring minor version mismatch\n"); } //每个客户端都会发送自己的proto cl->protocolMajorVersion=major; cl->protocolMinorVersion=minor; rfbAuthNewClient(cl); }