void HandleFileDownloadCancelRequest(rfbClientPtr cl, rfbTightClientPtr rtcp) { int n = 0; char *reason = NULL; rfbClientToServerTightMsg msg; memset(&msg, 0, sizeof(rfbClientToServerTightMsg)); if((n = rfbReadExact(cl, ((char *)&msg)+1, sz_rfbFileDownloadCancelMsg-1)) <= 0) { if (n < 0) rfbLog("File [%s]: Method [%s]: Error while reading " "FileDownloadCancelMsg\n", __FILE__, __FUNCTION__); rfbCloseClient(cl); return; } msg.fdc.reasonLen = Swap16IfLE(msg.fdc.reasonLen); if(msg.fdc.reasonLen == 0) { rfbLog("File [%s]: Method [%s]: reason length received is Zero\n", __FILE__, __FUNCTION__); return; } reason = (char*) calloc(msg.fdc.reasonLen + 1, sizeof(char)); if(reason == NULL) { rfbLog("File [%s]: Method [%s]: Fatal Error: Memory alloc failed\n", __FILE__, __FUNCTION__); return; } if((n = rfbReadExact(cl, reason, msg.fdc.reasonLen)) <= 0) { if (n < 0) rfbLog("File [%s]: Method [%s]: Error while reading " "FileDownloadCancelMsg\n", __FILE__, __FUNCTION__); rfbCloseClient(cl); } rfbLog("File [%s]: Method [%s]: File Download Cancel Request received:" " reason <%s>\n", __FILE__, __FUNCTION__, reason); pthread_mutex_lock(&fileDownloadMutex); CloseUndoneFileTransfer(cl, rtcp); pthread_mutex_unlock(&fileDownloadMutex); if(reason != NULL) { free(reason); reason = NULL; } }
void HandleFileCreateDirRequest(rfbClientPtr cl, rfbTightClientPtr rtcp) { int n = 0; char dirName[PATH_MAX]; rfbClientToServerTightMsg msg; memset(dirName, 0, PATH_MAX); memset(&msg, 0, sizeof(rfbClientToServerTightMsg)); if(cl == NULL) { rfbLog("File [%s]: Method [%s]: Unexpected error: rfbClientPtr is null\n", __FILE__, __FUNCTION__); return; } if((n = rfbReadExact(cl, ((char *)&msg)+1, sz_rfbFileCreateDirRequestMsg-1)) <= 0) { if (n < 0) rfbLog("File [%s]: Method [%s]: Error while reading FileCreateDirRequestMsg\n", __FILE__, __FUNCTION__); rfbCloseClient(cl); return; } msg.fcdr.dNameLen = Swap16IfLE(msg.fcdr.dNameLen); /* TODO :: chk if the dNameLen is greater than PATH_MAX */ if((n = rfbReadExact(cl, dirName, msg.fcdr.dNameLen)) <= 0) { if (n < 0) rfbLog("File [%s]: Method [%s]: Error while reading FileUploadFailedMsg\n", __FILE__, __FUNCTION__); rfbCloseClient(cl); return; } if(ConvertPath(dirName) == NULL) { rfbLog("File [%s]: Method [%s]: Unexpected error: path is NULL\n", __FILE__, __FUNCTION__); return; } CreateDirectory(dirName); }
void HandleFileDownloadLengthError(rfbClientPtr cl, short fNameSize) { char *path = NULL; int n = 0; if((path = (char*) calloc(fNameSize, sizeof(char))) == NULL) { rfbLog("File [%s]: Method [%s]: Fatal Error: Alloc failed\n", __FILE__, __FUNCTION__); return; } if((n = rfbReadExact(cl, path, fNameSize)) <= 0) { if (n < 0) rfbLog("File [%s]: Method [%s]: Error while reading dir name\n", __FILE__, __FUNCTION__); rfbCloseClient(cl); if(path != NULL) { free(path); path = NULL; } return; } if(path != NULL) { free(path); path = NULL; } SendFileDownloadLengthErrMsg(cl); }
//! handle request for a bounding sphere update rfbBool VncServer::handleBoundsMessage(rfbClientPtr cl, void *data, const rfbClientToServerMsg *message) { if (message->type != rfbBounds) return FALSE; if (!cl->clientData) { cl->clientData = new ClientData(); } ClientData *cd = static_cast<ClientData *>(cl->clientData); cd->supportsBounds = true; boundsMsg msg; int n = rfbReadExact(cl, ((char *)&msg)+1, sizeof(msg)-1); if (n <= 0) { if (n!= 0) rfbLogPerror("handleBoundsMessage: read"); rfbCloseClient(cl); return TRUE; } if (msg.sendreply) { std::cout << "SENDING BOUNDS" << std::endl; sendBoundsMessage(cl); } return TRUE; }
void rfbProcessClientSecurityType(rfbClientPtr cl) { int n; uint8_t chosenType; rfbSecurityHandler* handler; /* Read the security type. */ n = rfbReadExact(cl, (char *)&chosenType, 1); if (n <= 0) { if (n == 0) rfbLog("rfbProcessClientSecurityType: client gone\n"); else rfbLogPerror("rfbProcessClientSecurityType: read"); rfbCloseClient(cl); return; } /* Make sure it was present in the list sent by the server. */ for (handler = securityHandlers; handler; handler = handler->next) { if (chosenType == handler->type) { rfbLog("rfbProcessClientSecurityType: executing handler for type %d\n", chosenType); handler->handler(cl); return; } } rfbLog("rfbProcessClientSecurityType: wrong security type (%d) requested\n", chosenType); rfbCloseClient(cl); }
//! handle light update message rfbBool VncServer::handleLightsMessage(rfbClientPtr cl, void *data, const rfbClientToServerMsg *message) { if (message->type != rfbLights) return FALSE; lightsMsg msg; int n = rfbReadExact(cl, ((char *)&msg)+1, sizeof(msg)-1); if (n <= 0) { if (n!= 0) rfbLogPerror("handleLightsMessage: read"); rfbCloseClient(cl); return TRUE; } if (!cl->clientData) { cl->clientData = new ClientData(); } ClientData *cd = static_cast<ClientData *>(cl->clientData); cd->supportsLights = true; #define SET_VEC(d, dst, src) \ do { \ for (int k=0; k<d; ++k) { \ (dst)[k] = (src)[k]; \ } \ } while(false) std::vector<Light> newLights; for (int i=0; i<lightsMsg::NumLights; ++i) { const auto &cl = msg.lights[i]; newLights.emplace_back(); auto &l = newLights.back(); SET_VEC(4, l.position, cl.position); SET_VEC(4, l.ambient, cl.ambient); SET_VEC(4, l.diffuse, cl.diffuse); SET_VEC(4, l.specular, cl.specular); SET_VEC(3, l.attenuation, cl.attenuation); SET_VEC(3, l.direction, cl.spot_direction); l.spotCutoff = cl.spot_cutoff; l.spotExponent = cl.spot_exponent; l.enabled = cl.enabled; //std::cerr << "Light " << i << ": ambient: " << l.ambient << std::endl; //std::cerr << "Light " << i << ": diffuse: " << l.diffuse << std::endl; } std::swap(plugin->lights, newLights); if (plugin->lights != newLights) { ++plugin->lightsUpdateCount; std::cerr << "handleLightsMessage: lights changed" << std::endl; } //std::cerr << "handleLightsMessage: " << plugin->lights.size() << " lights received" << std::endl; return TRUE; }
//! handle image tile request by client rfbBool VncServer::handleTileMessage(rfbClientPtr cl, void *data, const rfbClientToServerMsg *message) { if (message->type != rfbTile) return FALSE; if (!cl->clientData) { cl->clientData = new ClientData(); } ClientData *cd = static_cast<ClientData *>(cl->clientData); if (!cd->supportsTile) { ++plugin->m_numRhrClients; std::cerr << "VncServer: RHR client connected (#RHR: " << plugin->m_numClients << ", #total: " << plugin->m_numClients << ")" << std::endl; } cd->supportsTile = true; tileMsg msg; int n = rfbReadExact(cl, ((char *)&msg)+1, sizeof(msg)-1); if (n <= 0) { if (n!= 0) rfbLogPerror("handleTileMessage: read"); rfbCloseClient(cl); return TRUE; } cd->tileCompressions = msg.compression; std::vector<char> buf(msg.size); n = rfbReadExact(cl, &buf[0], msg.size); if (n <= 0) { if (n!= 0) rfbLogPerror("handleTileMessage: read data"); rfbCloseClient(cl); return TRUE; } if (msg.flags & rfbTileRequest) { std::cerr << "VncServer: tile request ignored" << std::endl; // FIXME //sendDepthMessage(cl); } return TRUE; }
void rfbProcessClientAuthType(rfbClientPtr cl) { uint32_t auth_type; int n, i; rfbTightClientPtr rtcp = rfbGetTightClientData(cl); rfbLog("tightvnc-filetransfer/rfbProcessClientAuthType\n"); if(rtcp == NULL) return; /* Read authentication type selected by the client. */ n = rfbReadExact(cl, (char *)&auth_type, sizeof(auth_type)); if (n <= 0) { if (n == 0) rfbLog("rfbProcessClientAuthType: client gone\n"); else rfbLogPerror("rfbProcessClientAuthType: read"); rfbCloseClient(cl); return; } auth_type = Swap32IfLE(auth_type); /* Make sure it was present in the list sent by the server. */ for (i = 0; i < rtcp->nAuthCaps; i++) { if (auth_type == rtcp->authCaps[i]) break; } if (i >= rtcp->nAuthCaps) { rfbLog("rfbProcessClientAuthType: " "wrong authentication type requested\n"); rfbCloseClient(cl); return; } switch (auth_type) { case rfbAuthNone: /* Dispatch client input to rfbProcessClientInitMessage. */ #ifdef USE_SECTYPE_TIGHT_FOR_RFB_3_8 SECTYPE_TIGHT_FOR_RFB_3_8 #endif cl->state = RFB_INITIALISATION; break; case rfbAuthVNC: rfbVncAuthSendChallenge(cl); break; default: rfbLog("rfbProcessClientAuthType: unknown authentication scheme\n"); rfbCloseClient(cl); } }
//! handle matrix update message rfbBool VncServer::handleMatricesMessage(rfbClientPtr cl, void *data, const rfbClientToServerMsg *message) { if (message->type != rfbMatrices) return FALSE; matricesMsg msg; int n = rfbReadExact(cl, ((char *)&msg)+1, sizeof(msg)-1); if (n <= 0) { if (n!= 0) rfbLogPerror("handleMatricesMessage: read"); rfbCloseClient(cl); return TRUE; } size_t viewNum = msg.viewNum >= 0 ? msg.viewNum : 0; if (viewNum >= plugin->m_viewData.size()) { plugin->m_viewData.resize(viewNum+1); } plugin->resize(viewNum, msg.width, msg.height); ViewData &vd = plugin->m_viewData[viewNum]; vd.nparam.matrixTime = msg.time; vd.nparam.requestNumber = msg.requestNumber; for (int i=0; i<16; ++i) { vd.nparam.proj.data()[i] = msg.proj[i]; vd.nparam.view.data()[i] = msg.view[i]; vd.nparam.model.data()[i] = msg.model[i]; } //std::cerr << "handleMatrices: view " << msg.viewNum << ", proj: " << vd.nparam.proj << std::endl; if (msg.last) { for (int i=0; i<plugin->numViews(); ++i) { plugin->m_viewData[i].param = plugin->m_viewData[i].nparam; } } return TRUE; }
void rfbAuthProcessClientMessage(rfbClientPtr cl) { int n; uint8_t response[CHALLENGESIZE]; uint32_t authResult; if ((n = rfbReadExact(cl, (char *)response, CHALLENGESIZE)) <= 0) { if (n != 0) rfbLogPerror("rfbAuthProcessClientMessage: read"); rfbCloseClient(cl); return; } //uptill now, we don't chk the passwd, we do it later --TODO // if(!cl->screen->passwordCheck(cl,(const char*)response,CHALLENGESIZE)) { // rfbErr("rfbAuthProcessClientMessage: password check failed\n"); // authResult = Swap32IfLE(rfbVncAuthFailed); // if (rfbWriteExact(cl, (char *)&authResult, 4) < 0) { // rfbLogPerror("rfbAuthProcessClientMessage: write"); // } // /* support RFB 3.8 clients, they expect a reason *why* it was disconnected */ // if (cl->protocolMinorVersion > 7) { // rfbClientSendString(cl, "password check failed!"); // } // else // rfbCloseClient(cl); // return; // } authResult = Swap32IfLE(rfbVncAuthOK); if (rfbWriteExact(cl, (char *)&authResult, 4) < 0) { rfbLogPerror("rfbAuthProcessClientMessage: write"); rfbCloseClient(cl); return; } cl->state = RFB_INITIALISATION; }
void HandleFileUploadFailedRequest(rfbClientPtr cl, rfbTightClientPtr rtcp) { int n = 0; char* reason = NULL; rfbClientToServerTightMsg msg; memset(&msg, 0, sizeof(rfbClientToServerTightMsg)); if(cl == NULL) { rfbLog("File [%s]: Method [%s]: Unexpected error: rfbClientPtr is null\n", __FILE__, __FUNCTION__); return; } if((n = rfbReadExact(cl, ((char *)&msg)+1, sz_rfbFileUploadFailedMsg-1)) <= 0) { if (n < 0) rfbLog("File [%s]: Method [%s]: Error while reading FileUploadFailedMsg\n", __FILE__, __FUNCTION__); rfbCloseClient(cl); return; } msg.fuf.reasonLen = Swap16IfLE(msg.fuf.reasonLen); if(msg.fuf.reasonLen == 0) { rfbLog("File [%s]: Method [%s]: reason length received is Zero\n", __FILE__, __FUNCTION__); return; } reason = (char*) calloc(msg.fuf.reasonLen + 1, sizeof(char)); if(reason == NULL) { rfbLog("File [%s]: Method [%s]: Memory alloc failed\n", __FILE__, __FUNCTION__); return; } if((n = rfbReadExact(cl, reason, msg.fuf.reasonLen)) <= 0) { if (n < 0) rfbLog("File [%s]: Method [%s]: Error while reading FileUploadFailedMsg\n", __FILE__, __FUNCTION__); rfbCloseClient(cl); if(reason != NULL) { free(reason); reason = NULL; } return; } rfbLog("File [%s]: Method [%s]: File Upload Failed Request received:" " reason <%s>\n", __FILE__, __FUNCTION__, reason); CloseUndoneFileTransfer(cl, rtcp); if(reason != NULL) { free(reason); reason = NULL; } }
void HandleFileUploadDataRequest(rfbClientPtr cl, rfbTightClientPtr rtcp) { int n = 0; char* pBuf = NULL; rfbClientToServerTightMsg msg; memset(&msg, 0, sizeof(rfbClientToServerTightMsg)); if(cl == NULL) { rfbLog("File [%s]: Method [%s]: Unexpected error: rfbClientPtr is null\n", __FILE__, __FUNCTION__); return; } if((n = rfbReadExact(cl, ((char *)&msg)+1, sz_rfbFileUploadDataMsg-1)) <= 0) { if (n < 0) rfbLog("File [%s]: Method [%s]: Error while reading FileUploadRequestMsg\n", __FILE__, __FUNCTION__); rfbCloseClient(cl); return; } msg.fud.realSize = Swap16IfLE(msg.fud.realSize); msg.fud.compressedSize = Swap16IfLE(msg.fud.compressedSize); if((msg.fud.realSize == 0) && (msg.fud.compressedSize == 0)) { if((n = rfbReadExact(cl, (char*)&(rtcp->rcft.rcfu.mTime), sizeof(unsigned long))) <= 0) { if (n < 0) rfbLog("File [%s]: Method [%s]: Error while reading FileUploadRequestMsg\n", __FILE__, __FUNCTION__); rfbCloseClient(cl); return; } FileUpdateComplete(cl, rtcp); return; } pBuf = (char*) calloc(msg.fud.compressedSize, sizeof(char)); if(pBuf == NULL) { rfbLog("File [%s]: Method [%s]: Memory alloc failed\n", __FILE__, __FUNCTION__); return; } if((n = rfbReadExact(cl, pBuf, msg.fud.compressedSize)) <= 0) { if (n < 0) rfbLog("File [%s]: Method [%s]: Error while reading FileUploadRequestMsg\n", __FILE__, __FUNCTION__); rfbCloseClient(cl); if(pBuf != NULL) { free(pBuf); pBuf = NULL; } return; } if(msg.fud.compressedLevel != 0) { FileTransferMsg ftm; memset(&ftm, 0, sizeof(FileTransferMsg)); ftm = GetFileUploadCompressedLevelErrMsg(); if((ftm.data != NULL) && (ftm.length != 0)) { rfbWriteExact(cl, ftm.data, ftm.length); FreeFileTransferMsg(ftm); } CloseUndoneFileTransfer(cl, rtcp); if(pBuf != NULL) { free(pBuf); pBuf = NULL; } return; } rtcp->rcft.rcfu.fSize = msg.fud.compressedSize; HandleFileUploadWrite(cl, rtcp, pBuf); if(pBuf != NULL) { free(pBuf); pBuf = NULL; } }
void HandleFileUploadRequest(rfbClientPtr cl, rfbTightClientPtr rtcp) { int n = 0; char path[PATH_MAX]; /* PATH_MAX has the value 4096 and is defined in limits.h */ rfbClientToServerTightMsg msg; memset(path, 0, PATH_MAX); memset(&msg, 0, sizeof(rfbClientToServerTightMsg)); if(cl == NULL) { rfbLog("File [%s]: Method [%s]: Unexpected error: rfbClientPtr is null\n", __FILE__, __FUNCTION__); return; } if((n = rfbReadExact(cl, ((char *)&msg)+1, sz_rfbFileUploadRequestMsg-1)) <= 0) { if (n < 0) rfbLog("File [%s]: Method [%s]: Error while reading FileUploadRequestMsg\n", __FILE__, __FUNCTION__); rfbCloseClient(cl); return; } msg.fupr.fNameSize = Swap16IfLE(msg.fupr.fNameSize); msg.fupr.position = Swap16IfLE(msg.fupr.position); if ((msg.fupr.fNameSize == 0) || (msg.fupr.fNameSize > (PATH_MAX - 1))) { rfbLog("File [%s]: Method [%s]: error: path length is greater than PATH_MAX\n", __FILE__, __FUNCTION__); HandleFileUploadLengthError(cl, msg.fupr.fNameSize); return; } if((n = rfbReadExact(cl, rtcp->rcft.rcfu.fName, msg.fupr.fNameSize)) <= 0) { if (n < 0) rfbLog("File [%s]: Method [%s]: Error while reading FileUploadRequestMsg\n" __FILE__, __FUNCTION__); rfbCloseClient(cl); return; } rtcp->rcft.rcfu.fName[msg.fupr.fNameSize] = '\0'; if(ConvertPath(rtcp->rcft.rcfu.fName) == NULL) { rfbLog("File [%s]: Method [%s]: Unexpected error: path is NULL\n", __FILE__, __FUNCTION__); /* This may come if the path length exceeds PATH_MAX. So sending path length error to client */ SendFileUploadLengthErrMsg(cl); return; } HandleFileUpload(cl, rtcp); }
/* * HandleFileListRequest method is called when the server receives * FileListRequest. In case of success a file list is sent to the client. * For File List Request there is no failure reason sent.So here in case of any * "unexpected" error no information will be sent. As these conditions should * never come. Lets hope it never arrives :) * In case of dir open failure an empty list will be sent, just the header of * the message filled up. So on console you will get an Empty listing. */ void HandleFileListRequest(rfbClientPtr cl, rfbTightClientRec* data) { rfbClientToServerTightMsg msg; int n = 0; char path[PATH_MAX]; /* PATH_MAX has the value 4096 and is defined in limits.h */ FileTransferMsg fileListMsg; memset(&msg, 0, sizeof(rfbClientToServerTightMsg)); memset(path, 0, PATH_MAX); memset(&fileListMsg, 0, sizeof(FileTransferMsg)); if(cl == NULL) { rfbLog("File [%s]: Method [%s]: Unexpected error: rfbClientPtr is null\n", __FILE__, __FUNCTION__); return; } if((n = rfbReadExact(cl, ((char *)&msg)+1, sz_rfbFileListRequestMsg-1)) <= 0) { if (n < 0) rfbLog("File [%s]: Method [%s]: Socket error while reading dir name" " length\n", __FILE__, __FUNCTION__); rfbCloseClient(cl); return; } msg.flr.dirNameSize = Swap16IfLE(msg.flr.dirNameSize); if ((msg.flr.dirNameSize == 0) || (msg.flr.dirNameSize > (PATH_MAX - 1))) { rfbLog("File [%s]: Method [%s]: Unexpected error:: path length is " "greater that PATH_MAX\n", __FILE__, __FUNCTION__); return; } if((n = rfbReadExact(cl, path, msg.flr.dirNameSize)) <= 0) { if (n < 0) rfbLog("File [%s]: Method [%s]: Socket error while reading dir name\n", __FILE__, __FUNCTION__); rfbCloseClient(cl); return; } if(ConvertPath(path) == NULL) { /* The execution should never reach here */ rfbLog("File [%s]: Method [%s]: Unexpected error: path is NULL", __FILE__, __FUNCTION__); return; } fileListMsg = GetFileListResponseMsg(path, (char) (msg.flr.flags)); if((fileListMsg.data == NULL) || (fileListMsg.length == 0)) { rfbLog("File [%s]: Method [%s]: Unexpected error:: Data to be sent is " "of Zero length\n", __FILE__, __FUNCTION__); return; } rfbWriteExact(cl, fileListMsg.data, fileListMsg.length); FreeFileTransferMsg(fileListMsg); }
//! handle generic application message rfbBool VncServer::handleApplicationMessage(rfbClientPtr cl, void *data, const rfbClientToServerMsg *message) { if (message->type != rfbApplication) return FALSE; if (!cl->clientData) { cl->clientData = new ClientData(); appAnimationTimestep app; app.current = plugin->m_imageParam.timestep; app.total = plugin->m_numTimesteps; sendApplicationMessage(cl, rfbAnimationTimestep, sizeof(app), (char *)&app); } ClientData *cd = static_cast<ClientData *>(cl->clientData); cd->supportsApplication = true; applicationMsg msg; int n = rfbReadExact(cl, ((char *)&msg)+1, sizeof(msg)-1); if (n <= 0) { if (n!= 0) rfbLogPerror("handleApplicationMessage: read"); rfbCloseClient(cl); return TRUE; } std::vector<char> buf(msg.size); n = rfbReadExact(cl, &buf[0], msg.size); if (n <= 0) { if (n!= 0) rfbLogPerror("handleApplicationMessage: read data"); rfbCloseClient(cl); return TRUE; } if (plugin->m_appHandler) { bool handled = plugin->m_appHandler(msg.appType, buf); if (handled) return TRUE; } switch (msg.appType) { case rfbScreenConfig: { appScreenConfig app; memcpy(&app, &buf[0], sizeof(app)); plugin->resize(0, app.width, app.height); plugin->m_screenConfig.hsize = app.hsize; plugin->m_screenConfig.vsize = app.vsize; for (int i=0; i<3; ++i) { plugin->m_screenConfig.pos[i] = app.screenPos[i]; plugin->m_screenConfig.hpr[i] = app.screenRot[i]; } } break; case rfbFeedback: { // not needed: handled via vistle connection } break; case rfbAnimationTimestep: { appAnimationTimestep app; memcpy(&app, &buf[0], sizeof(app)); plugin->m_imageParam.timestep = app.current; } break; } return TRUE; }