The branch, master has been updated via ec8764469157522d3126a69499835c75e0e81a3a (commit) from c80c9f52dcb2b45a2ab9a951695b4c66d9662192 (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- commit ec8764469157522d3126a69499835c75e0e81a3a Author: Oleksandr Shneyder <oleksandr.shneyder@treuchtlingen.de> Date: Tue Nov 22 11:32:26 2011 +0100 QTcpSocket working not correct with some Antiviral software ( for example Avast) under windows. Fixing this by replacing it with Winsocks ----------------------------------------------------------------------- Summary of changes: debian/changelog | 4 + onmainwindow_part2.cpp | 2 +- onmainwindow_part4.cpp | 229 ++++++++++++++++++++++++++++++----------------- sshprocess.cpp | 29 ++++-- 4 files changed, 171 insertions(+), 93 deletions(-) The diff of changes is: diff --git a/debian/changelog b/debian/changelog index a938f1d..0fcd9e8 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,8 +1,12 @@ x2goclient (3.99.0.2-0~x2go1) UNRELEASED; urgency=low + [ Mike Gabriel ] * New upstream version (3.99.0.2): - Continue development... + [ Oleksandr Shneyder ] + * QTcpSocket working not correct with some Antiviral software ( for example Avast) under windows. Fixing this by replacing it with Winsocks + -- Mike Gabriel <mike.gabriel@das-netzwerkteam.de> Thu, 13 Oct 2011 01:59:41 +0200 x2goclient (3.99.0.1-0~x2go1) unstable; urgency=low diff --git a/onmainwindow_part2.cpp b/onmainwindow_part2.cpp index 702c447..ac5ecd4 100644 --- a/onmainwindow_part2.cpp +++ b/onmainwindow_part2.cpp @@ -1569,7 +1569,7 @@ void ONMainWindow::slotRetResumeSess ( bool result, this,SLOT ( slotTunnelOk() ) ); localGraphicPort=resumingSession.grPort; - int iport=localGraphicPort.toInt() +1; + int iport=localGraphicPort.toInt() +1000; while ( iport == resumingSession.sndPort.toInt() || iport == resumingSession.fsPort.toInt() || isServerRunning ( iport ) ) diff --git a/onmainwindow_part4.cpp b/onmainwindow_part4.cpp index a6102d6..76fd224 100644 --- a/onmainwindow_part4.cpp +++ b/onmainwindow_part4.cpp @@ -230,9 +230,72 @@ void ONMainWindow::cleanAskPass() } +#ifdef Q_OS_WIN +#include <windows.h> +#include <winsock2.h> +#include <ws2tcpip.h> +#endif + bool ONMainWindow::isServerRunning ( int port ) { +#ifdef Q_OS_WIN + SOCKET ConnectSocket = INVALID_SOCKET; + struct sockaddr_in saServer; + hostent* localHost; + char* localIP; + int iResult; + WSADATA wsaData; + + struct in_addr addr = { 0 }; + + iResult = WSAStartup(MAKEWORD(2, 2), &wsaData); + if (iResult != 0) + { + x2goDebug<<"WARNING: WSAStartup failed: "<< iResult<<endl; + return false; + } + + addr.s_addr = inet_addr("127.0.0.1"); + if (addr.s_addr == INADDR_NONE) + { + x2goDebug<< "WARNING: The IPv4 address entered must be a legal address\n"; + return false; + } + + + localHost = gethostbyaddr((char*)&addr,4, AF_INET); + if(!localHost) + { + x2goDebug<<"WARNING: gethostbyaddr failed: "<<WSAGetLastError()<<endl; + return false; + } + x2goDebug<<"got localhost"<<endl; + + localIP = inet_ntoa (*(struct in_addr *)*localHost->h_addr_list); + + saServer.sin_family = AF_INET; + saServer.sin_addr.s_addr = inet_addr(localIP); + saServer.sin_port = htons(port); + + ConnectSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); + if (ConnectSocket == INVALID_SOCKET) + { + x2goDebug<<"WARNING: socket failed with error: "<< WSAGetLastError()<<endl; + return false; + } + + iResult = ::connect( ConnectSocket, (SOCKADDR*) &saServer, sizeof(saServer)); + if (iResult == SOCKET_ERROR) + { + closesocket(ConnectSocket); + x2goDebug<<"Port is free: "<<port<<endl; + return false; + } + closesocket(ConnectSocket); + x2goDebug<<"Port already used: "<<port<<endl; + return true; +#endif QTcpSocket tcpSocket ( 0 ); tcpSocket.connectToHost ( "127.0.0.1",port ); @@ -283,16 +346,16 @@ void ONMainWindow::startXOrg () QStringList args; QString exec; - if(internalX==XMING) - exec=appDir+"\\xming\\Xming.exe"; - if(internalX==VCXSRV) - exec=appDir+"\\vcxsrv\\vcxsrv.exe"; + if (internalX==XMING) + exec=appDir+"\\xming\\Xming.exe"; + if (internalX==VCXSRV) + exec=appDir+"\\vcxsrv\\vcxsrv.exe"; winServersReady=false; x2goDebug<<"using internal X: "<<useInternalX; //#ifdef CFGCLIENT if (!useInternalX || internalX!=XMING) { - if(!useInternalX) + if (!useInternalX) exec=xorgExe; QString cmdLine; if (startXorgOnStart) @@ -307,12 +370,12 @@ void ONMainWindow::startXOrg () case SAPP: cmdLine=xorgSAppOptions; break; - case WIN: + case WIN: cmdLine=xorgWinOptions; - x2goDebug<<"WxH:"<<xorgWidth<<"x"<<xorgHeight<<endl; + x2goDebug<<"WxH:"<<xorgWidth<<"x"<<xorgHeight<<endl; cmdLine.replace("%w",xorgWidth); cmdLine.replace("%h",xorgHeight); - x2goDebug<<cmdLine<<endl; + x2goDebug<<cmdLine<<endl; break; } } @@ -328,7 +391,7 @@ void ONMainWindow::startXOrg () xorg=new QProcess ( 0 ); if (useInternalX && (internalX==XMING)) { - + QString workingDir=appDir+"\\xming"; QStringList env=QProcess::systemEnvironment(); env<<"GLWIN_ENABLE_DEBUG=0"; @@ -347,7 +410,7 @@ void ONMainWindow::startXOrg () xorg->setEnvironment ( env ); xorg-> setWorkingDirectory ( workingDir); } - + x2goDebug<<"running"<<exec<<" "<<args.join(" "); xorg->start ( exec, args ); @@ -363,9 +426,9 @@ void ONMainWindow::startXOrg () // #ifdef CFGCLIENT if ( !useInternalX || internalX!= XMING) { - //check connection in slot and launch setWinServerReady - waitingForX=0; - QTimer::singleShot(1000, this, SLOT(slotCheckXOrgConnection())); + //check connection in slot and launch setWinServerReady + waitingForX=0; + QTimer::singleShot(1000, this, SLOT(slotCheckXOrgConnection())); } // #endif } @@ -373,31 +436,31 @@ void ONMainWindow::startXOrg () void ONMainWindow::slotCheckXOrgConnection() { ++waitingForX; - if(isServerRunning(6000+xDisplay)) + if (isServerRunning(6000+xDisplay)) { - x2goDebug<<"X is started"; - slotSetWinServersReady(); + x2goDebug<<"X is started"; + slotSetWinServersReady(); } else { - if(waitingForX > 10) - { - QMessageBox::critical ( - 0,QString::null, - tr ( "Can't start X Server\n" - "Please check your installation" ) ); - close(); - } - else - { - x2goDebug<<"waiting for X"; - QTimer::singleShot(1000, this, SLOT(slotCheckXOrgConnection())); - } + if (waitingForX > 10) + { + QMessageBox::critical ( + 0,QString::null, + tr ( "Can't start X Server\n" + "Please check your installation" ) ); + close(); + } + else + { + x2goDebug<<"waiting for X"; + QTimer::singleShot(1000, this, SLOT(slotCheckXOrgConnection())); + } } } WinServerStarter::WinServerStarter ( daemon server, ONMainWindow * par ) : -QThread ( 0 ) + QThread ( 0 ) { mode=server; parent=par; @@ -714,31 +777,31 @@ void ONMainWindow::xorgSettings() x2goDebug<<"getting xorg settings"<<endl; X2goSettings st ( "settings" ); - + useInternalX=(st.setting()->value("useintx",true).toBool()); - + xorgExe=(st.setting()->value("xexec","C:\\program files\\vcxsrv\\vcxsrv.exe").toString()); xorgOptions=(st.setting()->value("options","-multiwindow -notrayicon -clipboard").toString()); startXorgOnStart=(st.setting()->value("onstart",true).toBool()); xorgWinOptions=(st.setting()->value("optionswin","-screen 0 %wx%h -notrayicon -clipboard").toString()); xorgFSOptions=(st.setting()->value("optionsfs","-fullscreen -notrayicon -clipboard").toString()); xorgSAppOptions=(st.setting()->value("optionssingle","-multiwindow -notrayicon -clipboard").toString()); - - if(QFile::exists(appDir+"\\vcxsrv")) - internalX=VCXSRV; - if(QFile::exists(appDir+"\\xming")) - internalX=XMING; - if(useInternalX) - { - startXorgOnStart=(internalX==XMING); - xorgOptions="-multiwindow -notrayicon -clipboard"; - if(internalX==VCXSRV) - { + + if (QFile::exists(appDir+"\\vcxsrv")) + internalX=VCXSRV; + if (QFile::exists(appDir+"\\xming")) + internalX=XMING; + if (useInternalX) + { + startXorgOnStart=(internalX==XMING); + xorgOptions="-multiwindow -notrayicon -clipboard"; + if (internalX==VCXSRV) + { // xorgWinOptions="-screen 0 %wx%h -notrayicon -clipboard"; - xorgWinOptions="-multiwindow -notrayicon -clipboard"; - xorgFSOptions="-fullscreen -notrayicon -clipboard"; - xorgSAppOptions="-multiwindow -notrayicon -clipboard"; - } + xorgWinOptions="-multiwindow -notrayicon -clipboard"; + xorgFSOptions="-fullscreen -notrayicon -clipboard"; + xorgSAppOptions="-multiwindow -notrayicon -clipboard"; + } } } @@ -955,7 +1018,7 @@ QString ONMainWindow::getCurrentUname() QString ONMainWindow::getCurrentPass() { - return pass->text(); + return pass->text(); } void ONMainWindow::slotDetachProxyWindow() @@ -1385,8 +1448,8 @@ void ONMainWindow::initPassDlg() pass->hide(); passPrompt->hide(); - - + + cbLayout=new QComboBox(passForm); cbLayout->addItems(defaultLayout); cbLayout->setFocusPolicy(Qt::NoFocus); @@ -1398,15 +1461,15 @@ void ONMainWindow::initPassDlg() cbLayoutLay->addWidget(cbLayout); cbLayoutLay->addStretch(); - + ok=new QPushButton ( tr ( "Ok" ),passForm ); setWidgetStyle ( ok ); cancel=new QPushButton ( tr ( "Cancel" ),passForm ); setWidgetStyle ( cancel ); ok->hide(); cancel->hide(); - - + + pal.setColor ( QPalette::Button, QColor ( 255,255,255,0 ) ); pal.setColor ( QPalette::Window, QColor ( 255,255,255,255 ) ); @@ -1414,7 +1477,7 @@ void ONMainWindow::initPassDlg() cbLayout->setPalette ( pal ); ok->setPalette ( pal ); cancel->setPalette ( pal ); - + #ifndef Q_WS_HILDON @@ -1497,12 +1560,12 @@ void ONMainWindow::initPassDlg() wapiWindowRect ( ok->winId(),r ); #endif } - if(defaultLayout.size()>1) + if (defaultLayout.size()>1) { - layoutPrompt->show(); - cbLayout->show(); - slotChangeKbdLayout(cbLayout->currentText()); - connect (cbLayout,SIGNAL(currentIndexChanged(QString)),this,SLOT(slotChangeKbdLayout(QString))); + layoutPrompt->show(); + cbLayout->show(); + slotChangeKbdLayout(cbLayout->currentText()); + connect (cbLayout,SIGNAL(currentIndexChanged(QString)),this,SLOT(slotChangeKbdLayout(QString))); } } @@ -2176,31 +2239,31 @@ void ONMainWindow::slotStartBroker() void ONMainWindow::slotGetBrokerSession(const QString& sinfo) { - //x2goDebug<<"broker session: "<<sinfo; - QStringList lst=sinfo.split("SERVER:",QString::SkipEmptyParts); - int keyStartPos=sinfo.indexOf("-----BEGIN DSA PRIVATE KEY-----"); - QString endStr="-----END DSA PRIVATE KEY-----"; - int keyEndPos=sinfo.indexOf(endStr); - if(keyEndPos == -1 || keyStartPos == -1 || lst.size()==0) - { - //throw error - QMessageBox::critical ( - 0,tr ( "Error" ), - tr ("Invalid reply from broker") +"<br>"+sinfo); - - close(); - return; - } - config.server=(lst[1].split("\n"))[0]; - config.key=sinfo.mid(keyStartPos, keyEndPos+endStr.length()-keyStartPos); + //x2goDebug<<"broker session: "<<sinfo; + QStringList lst=sinfo.split("SERVER:",QString::SkipEmptyParts); + int keyStartPos=sinfo.indexOf("-----BEGIN DSA PRIVATE KEY-----"); + QString endStr="-----END DSA PRIVATE KEY-----"; + int keyEndPos=sinfo.indexOf(endStr); + if (keyEndPos == -1 || keyStartPos == -1 || lst.size()==0) + { + //throw error + QMessageBox::critical ( + 0,tr ( "Error" ), + tr ("Invalid reply from broker") +"<br>"+sinfo); + + close(); + return; + } + config.server=(lst[1].split("\n"))[0]; + config.key=sinfo.mid(keyStartPos, keyEndPos+endStr.length()-keyStartPos); // x2goDebug<<"server: "<<config.server<<endl<<" key: "<<config.key; - if(sinfo.indexOf("SESSION_INFO")!=-1) - { + if (sinfo.indexOf("SESSION_INFO")!=-1) + { QStringList lst=sinfo.split("SESSION_INFO:",QString::SkipEmptyParts); - config.sessiondata=(lst[1].split("\n"))[0]; + config.sessiondata=(lst[1].split("\n"))[0]; // x2goDebug<<"data: "<<config.sessiondata; - } - slotSessEnter(); + } + slotSessEnter(); } void ONMainWindow::slotStartNewBrokerSession ( ) @@ -2249,8 +2312,8 @@ void ONMainWindow::cleanPortable() removeDir ( homeDir +"/.ssh" ); removeDir ( homeDir +"/ssh" ); removeDir ( homeDir+"/.x2go" ); - if(cleanAllFiles) - removeDir(homeDir+"/.x2goclient"); + if (cleanAllFiles) + removeDir(homeDir+"/.x2goclient"); } void ONMainWindow::removeDir ( QString path ) diff --git a/sshprocess.cpp b/sshprocess.cpp index 41d150c..b045fd0 100644 --- a/sshprocess.cpp +++ b/sshprocess.cpp @@ -31,6 +31,7 @@ SshProcess::SshProcess(SshMasterConnection* master, QObject* parent): QObject(parent) { masterCon=master; + serverSocket=0; connect(master,SIGNAL(stdErr(SshProcess*,QByteArray)),this,SLOT(slotStdErr(SshProcess*,QByteArray))); connect(master,SIGNAL(ioErr(SshProcess*,QString,QString)),this,SLOT(slotIOerr(SshProcess*,QString,QString))); tunnel=false; @@ -39,9 +40,19 @@ SshProcess::SshProcess(SshMasterConnection* master, QObject* parent): QObject(pa SshProcess::~SshProcess() { -#ifdef DEBUG +#ifdef DEBUG x2goDebug<<"ssh process destructor"; #endif + if (serverSocket>0) + { +#ifdef Q_OS_WIN + closesocket(serverSocket); + WSACleanup(); + +#else + close(serverSocket); +#endif + } } @@ -59,12 +70,12 @@ void SshProcess::slotCheckNewConnection() if (select(serverSocket+1,&rfds,NULL,NULL,&tv)<=0) return; -#ifdef DEBUG +#ifdef DEBUG x2goDebug<<"new tcp connection\n"; #endif int tcpSocket=accept(serverSocket, (struct sockaddr*)&address,&addrlen); -#ifdef DEBUG +#ifdef DEBUG x2goDebug<<"new socket:"<<tcpSocket<<endl; #endif masterCon->addChannelConnection(this, tcpSocket, forwardHost, forwardPort, localHost, @@ -107,7 +118,7 @@ void SshProcess::tunnelLoop() connect(timer,SIGNAL(timeout()),this,SLOT(slotCheckNewConnection())); timer->start(500); emit sshTunnelOk(); -#ifdef DEBUG +#ifdef DEBUG x2goDebug<<"Direct tunnel: waiting for connections on "<<localHost<<":"<<localPort<<endl; #endif } @@ -151,7 +162,7 @@ void SshProcess::slotStdErr(SshProcess* creator, QByteArray data) { if (creator!=this) return; -#ifdef DEBUG +#ifdef DEBUG x2goDebug<<"new err data:"<<data<<endl; #endif stdErrString+=data; @@ -169,7 +180,7 @@ void SshProcess::slotIOerr(SshProcess* creator, QString message, QString sshSess { if (creator!=this) return; -#ifdef DEBUG +#ifdef DEBUG x2goDebug<<"io error:"<<message<<" - "<<sshSessionErr<<endl; #endif normalExited=false; @@ -212,14 +223,14 @@ void SshProcess::slotChannelClosed(SshProcess* creator) { normalExited=false; output=stdErrString; -#ifdef DEBUG +#ifdef DEBUG x2goDebug<<"have only stderr, something must be wrong"<<endl; #endif - } + } else output=stdOutString; } -#ifdef DEBUG +#ifdef DEBUG x2goDebug<<"ssh finished:"<<normalExited<<" - "<<output<<endl; #endif emit sshFinished(normalExited, output, this); hooks/post-receive -- x2goclient.git (X2go Client) This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "x2goclient.git" (X2go Client).