[X2go-Commits] x2goclient.git - master (branch) updated: 3.99.2.2-63-gef8c948

X2Go dev team git-admin at x2go.org
Mon Oct 1 16:07:23 CEST 2012


The branch, master has been updated
       via  ef8c9486314e87bf6aeb748b46b1c35f1b975213 (commit)
      from  f2b6a54b89c6b8811bb85bedd376ac74621bc97b (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 ef8c9486314e87bf6aeb748b46b1c35f1b975213
Author: Oleksandr Shneyder <oleksandr.shneyder at obviously-nice.de>
Date:   Mon Oct 1 16:07:15 2012 +0200

    SshProcess is only usable over SshMasterConnection

-----------------------------------------------------------------------

Summary of changes:
 debian/changelog        |    1 +
 httpbrokerclient.cpp    |   42 ++---
 httpbrokerclient.h      |    8 +-
 onmainwindow.cpp        |  388 +++++++++++++++--------------------------------
 onmainwindow.h          |   43 +++---
 onmainwindow_privat.h   |    1 -
 sshmasterconnection.cpp |  122 +++++++++++----
 sshmasterconnection.h   |   14 +-
 sshprocess.cpp          |   33 ++--
 sshprocess.h            |   20 +--
 10 files changed, 286 insertions(+), 386 deletions(-)

The diff of changes is:
diff --git a/debian/changelog b/debian/changelog
index 42f5655..74a4339 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -73,6 +73,7 @@ x2goclient (3.99.3.0-0~x2go1) UNRELEASED; urgency=low
       instead.
     - reduce listen interval for ssh-tunnell to 100 msec
     - fixed visibility of SSH-proxy box with direct RDP sessions 
+    - SshProcess is only usable over SshMasterConnection 
 
   [ Ricardo Diaz ]
   * New upstream version (3.99.3.0):
diff --git a/httpbrokerclient.cpp b/httpbrokerclient.cpp
index f84f95e..ca4bbec 100644
--- a/httpbrokerclient.cpp
+++ b/httpbrokerclient.cpp
@@ -26,7 +26,6 @@
 #include "onmainwindow.h"
 #include <QTemporaryFile>
 #include <QInputDialog>
-#include <sshprocess.h>
 
 HttpBrokerClient::HttpBrokerClient ( ONMainWindow* wnd, ConfigFile* cfg )
 {
@@ -236,11 +235,8 @@ void HttpBrokerClient::getUserSessions()
             createSshConnection();
             return;
         }
-        SshProcess* proc=new SshProcess ( sshConnection, this );
-        connect ( proc,SIGNAL ( sshFinished ( bool,QString,SshProcess* ) ),
-                  this,SLOT ( slotListSessions ( bool, QString,
-                              SshProcess* ) ) );
-        proc->startNormal ( config->sshBrokerBin+" --authid "+config->brokerUserId+ " --task listsessions" );
+        sshConnection->executeCommand ( config->sshBrokerBin+" --authid "+config->brokerUserId+ " --task listsessions",
+                                        this, SLOT ( slotListSessions ( bool, QString,int ) ));
     }
 }
 
@@ -262,10 +258,8 @@ void HttpBrokerClient::selectUserSession(const QString& session)
     }
     else
     {
-        SshProcess* proc=new SshProcess ( sshConnection, this );
-        connect ( proc,SIGNAL ( sshFinished ( bool,QString,SshProcess* ) ),
-                  this,SLOT ( slotSelectSession(bool,QString,SshProcess*)));
-        proc->startNormal ( config->sshBrokerBin+" --authid "+config->brokerUserId+ " --task selectsession --sid "+session );
+        sshConnection->executeCommand ( config->sshBrokerBin+" --authid "+config->brokerUserId+ " --task selectsession --sid "+session,
+                                        this,SLOT ( slotSelectSession(bool,QString,int)));
     }
 
 }
@@ -289,10 +283,8 @@ void HttpBrokerClient::changePassword(QString newPass)
     }
     else
     {
-        SshProcess* proc=new SshProcess ( sshConnection, this );
-        connect ( proc,SIGNAL ( sshFinished ( bool,QString,SshProcess* ) ),
-                  this,SLOT ( slotPassChanged(bool,QString,SshProcess*)));
-        proc->startNormal ( config->sshBrokerBin+" --authid "+config->brokerUserId+ " --task setpass --newpass "+newPass );
+        sshConnection->executeCommand ( config->sshBrokerBin+" --authid "+config->brokerUserId+ " --task setpass --newpass "+newPass, this,
+	  SLOT ( slotPassChanged(bool,QString,int)));
     }
 }
 
@@ -311,10 +303,8 @@ void HttpBrokerClient::testConnection()
     }
     else
     {
-        SshProcess* proc=new SshProcess ( sshConnection, this );
-        connect ( proc,SIGNAL ( sshFinished ( bool,QString,SshProcess* ) ),
-                  this,SLOT ( slotSelectSession(bool,QString,SshProcess*)));
-        proc->startNormal ( config->sshBrokerBin+" --authid "+config->brokerUserId+ " --task testcon" );
+        sshConnection->executeCommand(config->sshBrokerBin+" --authid "+config->brokerUserId+ " --task testcon",
+                                      this, SLOT ( slotSelectSession(bool,QString,int)));
     }
 }
 
@@ -350,10 +340,8 @@ bool HttpBrokerClient::checkAccess(QString answer )
 }
 
 
-void HttpBrokerClient::slotConnectionTest(bool success, QString answer, SshProcess* proc)
+void HttpBrokerClient::slotConnectionTest(bool success, QString answer, int)
 {
-    if(proc)
-        delete proc;
     if(!success)
     {
         x2goDebug<<answer;
@@ -372,10 +360,8 @@ void HttpBrokerClient::slotConnectionTest(bool success, QString answer, SshProce
 
 }
 
-void HttpBrokerClient::slotListSessions(bool success, QString answer, SshProcess* proc)
+void HttpBrokerClient::slotListSessions(bool success, QString answer, int)
 {
-    if(proc)
-        delete proc;
     if(!success)
     {
         x2goDebug<<answer;
@@ -389,10 +375,8 @@ void HttpBrokerClient::slotListSessions(bool success, QString answer, SshProcess
     emit sessionsLoaded();
 }
 
-void HttpBrokerClient::slotPassChanged(bool success, QString answer, SshProcess* proc)
+void HttpBrokerClient::slotPassChanged(bool success, QString answer, int)
 {
-    if(proc)
-        delete proc;
     if(!success)
     {
         x2goDebug<<answer;
@@ -405,10 +389,8 @@ void HttpBrokerClient::slotPassChanged(bool success, QString answer, SshProcess*
 
 }
 
-void HttpBrokerClient::slotSelectSession(bool success, QString answer, SshProcess* proc)
+void HttpBrokerClient::slotSelectSession(bool success, QString answer, int)
 {
-    if(proc)
-        delete proc;
     if(!success)
     {
         x2goDebug<<answer;
diff --git a/httpbrokerclient.h b/httpbrokerclient.h
index 02f5d3d..bb7e9cd 100644
--- a/httpbrokerclient.h
+++ b/httpbrokerclient.h
@@ -62,10 +62,10 @@ private slots:
     void slotSshServerAuthPassphrase ( SshMasterConnection* connection );
     void slotSshUserAuthError ( QString error );
     void slotSshConnectionOk();
-    void slotListSessions ( bool success, QString answer, SshProcess* proc);
-    void slotSelectSession ( bool success, QString answer, SshProcess* proc);
-    void slotPassChanged ( bool success, QString answer, SshProcess* proc);
-    void slotConnectionTest( bool success, QString answer, SshProcess* proc);
+    void slotListSessions ( bool success, QString answer, int pid);
+    void slotSelectSession ( bool success, QString answer, int pid);
+    void slotPassChanged ( bool success, QString answer, int pid);
+    void slotConnectionTest( bool success, QString answer, int pid);
 
 public slots:
     void getUserSessions();
diff --git a/onmainwindow.cpp b/onmainwindow.cpp
index 89e2964..8f452cb 100644
--- a/onmainwindow.cpp
+++ b/onmainwindow.cpp
@@ -1267,9 +1267,8 @@ void ONMainWindow::closeClient()
     }
     if ( sshConnection && !useLdap)
     {
-        sshConnection->disconnectSession();
         x2goDebug<<"waiting sshConnection to finish\n";
-        sshConnection->wait ( 10000 );
+        delete sshConnection;
         x2goDebug<<"sshConnection is closed\n";
         sshConnection=0;
     }
@@ -1279,9 +1278,8 @@ void ONMainWindow::closeClient()
         {
             if (serverSshConnections[i])
             {
-                serverSshConnections[i]->disconnectSession();
                 x2goDebug<<"waiting sshConnection to finish\n";
-                serverSshConnections[i]->wait ( 10000 );
+                delete serverSshConnections[i];
                 x2goDebug<<"sshConnection is closed\n";
             }
         }
@@ -1768,7 +1766,7 @@ void ONMainWindow::slotPassEnter()
     QString host=firstServer;
     passwd=getCurrentPass();
     if (sshConnection)
-        sshConnection->disconnectSession();
+        delete sshConnection;
     sshConnection=startSshConnection ( host,sshPort,acceptRsa,user,passwd,true, false );
 
 #endif
@@ -2850,15 +2848,8 @@ void ONMainWindow::slotServSshConnectionOk(QString server)
     SshMasterConnection* con=findServerSshConnection(server);
     if (!con)
         return;
-    SshProcess* lproc;
-    lproc=new SshProcess ( con,  this );
-    connect ( lproc,SIGNAL ( sshFinished ( bool,
-                                           QString,SshProcess* ) ),
-              this,SLOT (
-                  slotListAllSessions ( bool,
-                                        QString,SshProcess* ) ) );
     x2goDebug<<"getting sessions on "<<server<<endl;
-    lproc->startNormal ( "export HOSTNAME && x2golistsessions" );
+    con->executeCommand( "export HOSTNAME && x2golistsessions", this, SLOT (slotListAllSessions ( bool,QString,int ) ));
 }
 
 void ONMainWindow::slotSshServerAuthPassphrase(SshMasterConnection* connection)
@@ -3042,25 +3033,16 @@ void ONMainWindow::continueNormalSession()
         slotListSessions(true,QString::null,0);
         return;
     }
-    SshProcess* proc=new SshProcess ( sshConnection, this );
-    connect ( proc,SIGNAL ( sshFinished ( bool,QString,SshProcess* ) ),
-              this,SLOT ( slotListSessions ( bool, QString,
-                          SshProcess* ) ) );
     if ( !shadowSession )
-        proc->startNormal ( "export HOSTNAME && x2golistsessions" );
+        sshConnection->executeCommand ( "export HOSTNAME && x2golistsessions", this,SLOT ( slotListSessions ( bool, QString,int )));
     else
-        proc->startNormal ( "export HOSTNAME && x2golistdesktops" );
+        sshConnection->executeCommand ( "export HOSTNAME && x2golistdesktops", this,SLOT ( slotListSessions ( bool, QString,int )));
 
 }
 
 void ONMainWindow::continueLDAPSession()
 {
-
-
-    SshProcess* proc=new SshProcess ( sshConnection,this );
-    connect ( proc,SIGNAL ( sshFinished ( bool,QString,SshProcess* ) ),
-              this,SLOT ( slotGetServers ( bool, QString,SshProcess* ) ) );
-    proc->startNormal ( "x2gogetservers" );
+    sshConnection->executeCommand ( "x2gogetservers", this, SLOT ( slotGetServers ( bool, QString,int ) ));
 }
 
 #ifdef Q_OS_LINUX
@@ -3243,8 +3225,10 @@ bool ONMainWindow::startSession ( const QString& sid )
     krblogin=st->setting()->value ( sid+"/krblogin",
                                     ( QVariant ) false ).toBool();
 #ifdef Q_OS_LINUX
-    directRDP=st->setting()->value ( sid+"/directrdp",
-                                     ( QVariant ) false ).toBool();
+    directRDP=(st->setting()->value ( sid+"/directrdp",
+                                      ( QVariant ) false ).toBool() && cmd == "RDP");
+
+
     if (cmd =="RDP" && directRDP)
     {
         startDirectRDP();
@@ -3260,7 +3244,7 @@ bool ONMainWindow::startSession ( const QString& sid )
         sshPort=config.sshport;
     }
     if (sshConnection)
-        sshConnection->disconnectSession();
+        delete sshConnection;
 
     if(currentKey.length()<=0)
     {
@@ -3359,10 +3343,8 @@ bool ONMainWindow::startSession ( const QString& sid )
 
 
 void ONMainWindow::slotListSessions ( bool result,QString output,
-                                      SshProcess* proc )
+                                      int  )
 {
-    if ( proc )
-        delete proc;
     if ( result==false )
     {
         cardReady=false;
@@ -3826,16 +3808,8 @@ void ONMainWindow::startNewSession()
         return;
     }
 
-    SshProcess* proc=0l;
-
-    proc=new SshProcess ( sshConnection, this ) ;
-
-
-    connect ( proc,SIGNAL ( sshFinished ( bool, QString,SshProcess* ) ),
-              this,SLOT ( slotRetResumeSess ( bool,
-                          QString,SshProcess* ) ) );
-
-    proc->startNormal ( cmd );
+    sshConnection->executeCommand ( cmd, this, SLOT ( slotRetResumeSess ( bool,
+                                    QString,int ) ) );
     passForm->hide();
 }
 
@@ -4069,14 +4043,8 @@ void ONMainWindow::resumeSession ( const x2goSession& s )
     else
         cmd += "0";
 
-    SshProcess* proc=0l;
-    proc=new SshProcess ( sshConnection, this );
-
-    connect ( proc,SIGNAL ( sshFinished ( bool, QString,SshProcess* ) ),
-              this,SLOT ( slotRetResumeSess ( bool, QString,
-                          SshProcess* ) ) );
-
-    proc->startNormal ( cmd );
+    sshConnection->executeCommand ( cmd, this,  SLOT ( slotRetResumeSess ( bool, QString,
+                                    int ) ));
     resumingSession=s;
     passForm->hide();
 }
@@ -4398,6 +4366,7 @@ void ONMainWindow::slotTermSessFromSt()
 #ifdef Q_OS_LINUX
     if (directRDP)
     {
+        x2goDebug<<"terminating direct RDP session";
         nxproxy->terminate();
         proxyRunning=false;
         return;
@@ -4419,10 +4388,8 @@ void ONMainWindow::slotTermSessFromSt()
 
 
 void ONMainWindow::slotRetSuspSess ( bool result, QString output,
-                                     SshProcess* proc )
+                                     int )
 {
-    if ( proc )
-        delete proc;
     if ( result==false )
     {
         QString message=tr ( "<b>Connection failed</b>\n" ) +output;
@@ -4515,11 +4482,8 @@ void ONMainWindow::slotNewSess()
 
 
 void ONMainWindow::slotRetTermSess ( bool result,  QString output,
-                                     SshProcess* proc )
+                                     int )
 {
-    bool nodel= ( proc==0 );
-    if ( proc )
-        delete proc;
     if ( result==false )
     {
         QString message=tr ( "<b>Connection failed</b>\n" ) +output;
@@ -4535,7 +4499,7 @@ void ONMainWindow::slotRetTermSess ( bool result,  QString output,
     }
     else
     {
-        if ( selectSessionDlg->isVisible() &&!nodel )
+        if ( selectSessionDlg->isVisible()  )
         {
             sessTv->model()->removeRow (
                 sessTv->currentIndex().row() );
@@ -4548,10 +4512,8 @@ void ONMainWindow::slotRetTermSess ( bool result,  QString output,
 
 void ONMainWindow::slotRetResumeSess ( bool result,
                                        QString output,
-                                       SshProcess* proc )
+                                       int )
 {
-    if ( proc )
-        delete proc;
     x2goDebug<<"Agent output:"<<output;
     if ( result==false )
     {
@@ -4738,13 +4700,7 @@ void ONMainWindow::slotRetResumeSess ( bool result,
             host=config.server;
         resumingSession.server=host;
     }
-    tunnel=new SshProcess ( sshConnection, this );
 
-    connect ( tunnel,SIGNAL ( sshFinished ( bool,  QString,SshProcess* ) ),
-              this,SLOT ( slotTunnelFailed ( bool,
-                          QString,SshProcess* ) ) );
-    connect ( tunnel,SIGNAL ( sshTunnelOk() ),
-              this,SLOT ( slotTunnelOk() ) );
 
     localGraphicPort=resumingSession.grPort;
     int iport=localGraphicPort.toInt() +1000;
@@ -4754,8 +4710,9 @@ void ONMainWindow::slotRetResumeSess ( bool result,
         ++iport;
     localGraphicPort=QString::number ( iport );
 
-    tunnel->startTunnel ( "localhost",resumingSession.grPort.toInt(),"localhost",
-                          localGraphicPort.toInt() );
+    sshConnection->startTunnel ( "localhost",resumingSession.grPort.toInt(),"localhost",
+                                 localGraphicPort.toInt(), false, this,  SLOT ( slotTunnelOk(int) ), SLOT ( slotTunnelFailed ( bool,
+                                         QString,int ) ) );
     if ( shadowSession )
         return;
 
@@ -4791,9 +4748,8 @@ void ONMainWindow::slotRetResumeSess ( bool result,
                      "\">> ~/.x2go/C-"+
                      resumingSession.sessionId+
                      "/.pulse-client.conf";
-            SshProcess* paProc;
-            paProc=new SshProcess ( sshConnection, this );
-            paProc->startNormal ( scmd );
+
+            sshConnection->executeCommand(scmd);
 
             bool sysPulse=false;
 #ifdef Q_OS_LINUX
@@ -4825,18 +4781,20 @@ void ONMainWindow::slotRetResumeSess ( bool result,
             }
 #endif
             if ( sysPulse )
-                paProc->start_cp (
+
+                sshConnection->copyFile(
                     "/var/run/pulse/.pulse-cookie",
                     "~/.x2go/C-"+
                     resumingSession.sessionId+
-                    "/.pulse-cookie" );
+                    "/.pulse-cookie", this, SLOT ( slotPCookieReady ( bool, QString,int )));
+
             else
             {
 #ifndef Q_OS_WIN
-                paProc->start_cp ( homeDir+"/.pulse-cookie",
-                                   "~/.x2go/C-"+
-                                   resumingSession.sessionId+
-                                   "/.pulse-cookie" );
+                sshConnection->copyFile(homeDir+"/.pulse-cookie",
+                                        "~/.x2go/C-"+
+                                        resumingSession.sessionId+
+                                        "/.pulse-cookie", this, SLOT ( slotPCookieReady ( bool, QString,int )));
 #else
                 QString cooFile=
                     wapiShortFileName ( homeDir )  +
@@ -4844,41 +4802,25 @@ void ONMainWindow::slotRetResumeSess ( bool result,
                 QString destFile="~/.x2go/C-"+
                                  resumingSession.sessionId+
                                  "/.pulse-cookie";
-                paProc->start_cp ( cooFile,
-                                   destFile );
-
-                /*x2goDebug<<"cookie file: "<<cooFile
-                <<" remote:"<<
-                destFile<<endl;*/
-                connect ( paProc,
-                          SIGNAL (
-                              sshFinished ( bool,
-                                            QString,
-                                            SshProcess* ) ),
-                          this,
-                          SLOT (
-                              slotPCookieReady ( bool,
-                                                 QString,
-                                                 SshProcess* )
-                          ) );
-                parecTunnelOk=true;
+                sshConnection->copyFile(cooFile,
+                                        destFile, this, SLOT ( slotPCookieReady ( bool, QString,int ));
+                                        parecTunnelOk=true;
 #endif
             }
         }
         if ( sndSystem==ESD )
         {
-            SshProcess* paProc;
-            paProc=new SshProcess ( sshConnection, this );
 #ifndef Q_OS_WIN
-            paProc->start_cp ( homeDir+"/.esd_auth",
-                               "~/.esd_auth" );
+            sshConnection->copyFile(homeDir+"/.esd_auth",
+                                    "~/.esd_auth" );
 #else
             QString cooFile=
                 wapiShortFileName ( homeDir )  +
                 "/.x2go/pulse/.esd_auth";
             QString destFile="~/.esd_auth";
-            paProc->start_cp ( cooFile,
-                               destFile );
+            sshConnection->copyFile(cooFile,
+                                    destFile );
+
 #endif
         }
 #ifndef Q_OS_WIN
@@ -4909,32 +4851,21 @@ void ONMainWindow::slotRetResumeSess ( bool result,
 #endif //Q_OS_WIN
         if ( sshSndTunnel )
         {
-            sndTunnel=new SshProcess ( sshConnection, this );
-
+            char* okSlot=0;
 #ifdef Q_OS_WIN
             if ( sndSystem==PULSE )
             {
                 parecTunnelOk=false;
-                connect ( sndTunnel,SIGNAL ( sshTunnelOk() ),
-                          this,SLOT ( slotSndTunOk() ) );
+                okSlot=SLOT ( slotSndTunOk(int) );
             }
 #endif
-            connect ( sndTunnel,SIGNAL ( sshFinished ( bool,
-                                         QString,
-                                         SshProcess* ) ),
-                      this,SLOT (
-                          slotSndTunnelFailed ( bool,
-                                                QString,
-                                                SshProcess* ) ) );
-
-            sndTunnel->startTunnel (
-                "localhost",
-                resumingSession.sndPort.toInt(),"127.0.0.1",
-                sndPort.toInt(),true );
-            /*x2goDebug<<"starting tunnel, local port:"<<
-            	sndPort<<", remote: "<<
-            	resumingSession.sndPort<<
-            	endl;*/
+            sndTunnel=sshConnection->startTunnel (
+                          "localhost",
+                          resumingSession.sndPort.toInt(),"127.0.0.1",
+                          sndPort.toInt(),true,this,okSlot, SLOT (
+                              slotSndTunnelFailed ( bool,
+                                                    QString,
+                                                    int ) ));
         }
     }
 }
@@ -4954,7 +4885,7 @@ x2goSession ONMainWindow::getSelectedSession()
 }
 
 
-void ONMainWindow::slotTunnelOk()
+void ONMainWindow::slotTunnelOk(int)
 {
 
 #ifdef Q_OS_WIN
@@ -4980,14 +4911,14 @@ void ONMainWindow::slotTunnelOk()
                                     QMessageBox::Ok,
                                     QMessageBox::NoButton );
             slotShowPassForm();
-            if ( tunnel )
-                delete tunnel;
-            if ( sndTunnel )
-                delete sndTunnel;
-            if ( fsTunnel )
-                delete fsTunnel;
-            if ( soundServer )
-                delete soundServer;
+//             if ( tunnel )
+//                 delete tunnel;
+//             if ( sndTunnel )
+//                 delete sndTunnel;
+//             if ( fsTunnel )
+//                 delete fsTunnel;
+//             if ( soundServer )
+//                 delete soundServer;
             tunnel=sndTunnel=fsTunnel=0l;
             soundServer=0l;
             nxproxy=0l;
@@ -5144,7 +5075,7 @@ void ONMainWindow::slotTunnelOk()
 }
 
 void ONMainWindow::slotTunnelFailed ( bool result,  QString output,
-                                      SshProcess* )
+                                      int )
 {
     if ( result==false )
     {
@@ -5156,14 +5087,14 @@ void ONMainWindow::slotTunnelFailed ( bool result,  QString output,
                                     QMessageBox::Ok,
                                     QMessageBox::NoButton );
         }
-        if ( tunnel )
-            delete tunnel;
-        if ( sndTunnel )
-            delete sndTunnel;
-        if ( fsTunnel )
-            delete fsTunnel;
-        if ( soundServer )
-            delete soundServer;
+//         if ( tunnel )
+//             delete tunnel;
+//         if ( sndTunnel )
+//             delete sndTunnel;
+//         if ( fsTunnel )
+//             delete fsTunnel;
+//         if ( soundServer )
+//             delete soundServer;
         tunnel=sndTunnel=fsTunnel=0l;
         soundServer=0l;
         nxproxy=0l;
@@ -5174,7 +5105,7 @@ void ONMainWindow::slotTunnelFailed ( bool result,  QString output,
 }
 
 void ONMainWindow::slotSndTunnelFailed ( bool result,  QString output,
-        SshProcess* )
+        int )
 {
     if ( result==false )
     {
@@ -5186,8 +5117,6 @@ void ONMainWindow::slotSndTunnelFailed ( bool result,  QString output,
                                    QMessageBox::Ok,
                                    QMessageBox::NoButton );
         }
-        if ( sndTunnel )
-            delete sndTunnel;
         sndTunnel=0l;
     }
 }
@@ -5233,12 +5162,12 @@ void ONMainWindow::slotProxyFinished ( int,QProcess::ExitStatus )
 #endif
     if ( closeEventSent )
         return;
-    if ( tunnel )
-        delete tunnel;
-    if ( sndTunnel )
-        delete sndTunnel;
-    if ( fsTunnel )
-        delete fsTunnel;
+//     if ( tunnel )
+//         delete tunnel;
+//     if ( sndTunnel )
+//         delete sndTunnel;
+//     if ( fsTunnel )
+//         delete fsTunnel;
     if ( soundServer )
         delete soundServer;
     if ( spoolTimer )
@@ -5306,10 +5235,14 @@ void ONMainWindow::slotProxyFinished ( int,QProcess::ExitStatus )
 #endif
     if ( !shadowSession && !usePGPCard && ! ( embedMode &&
             ( config.checkexitstatus==false ) ) )
+    {
+        x2goDebug<<"checking exit status";
         check_cmd_status();
+    }
     else
     {
-        sshConnection->disconnectSession();
+        x2goDebug<<"deleting sshConnection instance: "<<sshConnection;
+        delete sshConnection;
         sshConnection=0;
     }
     if ( startHidden )
@@ -5572,14 +5505,9 @@ void ONMainWindow::slotResumeDoubleClick ( const QModelIndex& )
 
 void ONMainWindow::suspendSession ( QString sessId )
 {
-    SshProcess* proc=0l;
-    proc=new SshProcess ( sshConnection, this );
 
-    connect ( proc,SIGNAL ( sshFinished ( bool,  QString,SshProcess* ) ),
-              this,SLOT ( slotRetSuspSess ( bool,  QString,
-                                            SshProcess* ) ) );
-
-    proc->startNormal ( "x2gosuspend-session "+sessId );
+    sshConnection->executeCommand ( "x2gosuspend-session "+sessId, this,  SLOT ( slotRetSuspSess ( bool,  QString,
+                                    int ) ) );
 }
 
 
@@ -5616,14 +5544,8 @@ bool ONMainWindow::termSession ( QString sessId, bool warn )
         return true;
     }
 
-    SshProcess* proc=0l;
-    proc=new SshProcess ( sshConnection,  this );
-
-    connect ( proc,SIGNAL ( sshFinished ( bool,  QString,SshProcess* ) ),
-              this,SLOT ( slotRetTermSess ( bool,
-                                            QString,SshProcess* ) ) );
-
-    proc->startNormal ( "x2goterminate-session "+sessId );
+    sshConnection->executeCommand ( "x2goterminate-session "+sessId, this, SLOT ( slotRetTermSess ( bool,
+                                    QString,int) )  );
     proxyRunning=false;
     return true;
 }
@@ -5868,7 +5790,6 @@ void ONMainWindow::runCommand()
     if ( managedMode )
         return;
 
-    SshProcess *proc=0l;
 
     QString cmd;
 
@@ -5916,14 +5837,9 @@ void ONMainWindow::runCommand()
 
     if ( runRemoteCommand )
     {
-        proc=new SshProcess ( sshConnection, this );
-        connect ( proc,SIGNAL ( sshFinished ( bool, QString,
-                                              SshProcess* ) ),
-                  this,SLOT ( slotRetRunCommand ( bool,
-                              QString,
-                              SshProcess* ) ) );
-
-        proc->startNormal ( cmd );
+        sshConnection->executeCommand ( cmd, this,  SLOT ( slotRetRunCommand ( bool,
+                                        QString,
+                                        int ) ));
     }
 #ifdef Q_WS_HILDON
     //wait 5 seconds and execute xkbcomp
@@ -5934,18 +5850,15 @@ void ONMainWindow::runCommand()
 
 void ONMainWindow::runApplication(QString exec)
 {
-    SshProcess* proc=new SshProcess ( sshConnection, this );
-    proc->startNormal ("PULSE_CLIENTCONFIG=~/.x2go/C-"+
-                       resumingSession.sessionId+"/.pulse-client.conf DISPLAY=:"+
-                       resumingSession.display+
-                       " setsid "+exec+" 1> /dev/null 2>/dev/null & exit");
+    sshConnection->executeCommand ("PULSE_CLIENTCONFIG=~/.x2go/C-"+
+                                   resumingSession.sessionId+"/.pulse-client.conf DISPLAY=:"+
+                                   resumingSession.display+
+                                   " setsid "+exec+" 1> /dev/null 2>/dev/null & exit");
 }
 
 void ONMainWindow::slotRetRunCommand ( bool result, QString output,
-                                       SshProcess* proc )
+                                       int )
 {
-    if ( proc )
-        delete proc;
     if ( result==false )
     {
         QString message=tr ( "<b>Connection failed</b>\n:\n" ) +output;
@@ -5967,21 +5880,15 @@ void ONMainWindow::slotRetRunCommand ( bool result, QString output,
 
 void ONMainWindow::readApplications()
 {
-    SshProcess* proc=new SshProcess ( sshConnection, this );
-    connect ( proc,SIGNAL ( sshFinished ( bool, QString,
-                                          SshProcess* ) ),
-              this,SLOT ( slotReadApplications ( bool,
-                          QString,
-                          SshProcess* ) ) );
-    proc->startNormal ( "x2gogetapps" );
+    sshConnection->executeCommand ( "x2gogetapps", this,  SLOT ( slotReadApplications ( bool,
+                                    QString,
+                                    int) ));
     sbApps->setEnabled(false);
 }
 
 void ONMainWindow::slotReadApplications(bool result, QString output,
-                                        SshProcess* proc )
+                                        int)
 {
-    if ( proc )
-        delete proc;
     if ( result==false )
     {
         QString message=tr ( "<b>Connection failed</b>\n:\n" ) +output;
@@ -6753,11 +6660,8 @@ void ONMainWindow::showHelpPack()
 }
 
 void ONMainWindow::slotGetServers ( bool result, QString output,
-                                    SshProcess* proc )
+                                    int )
 {
-    if ( proc )
-        delete proc;
-    proc=0;
     if ( result==false )
     {
         cardReady=false;
@@ -6811,7 +6715,7 @@ void ONMainWindow::slotGetServers ( bool result, QString output,
     retSessions=0;
     if (sshConnection)
     {
-        sshConnection->disconnectSession();
+        delete sshConnection;
         sshConnection=0;
     }
     QString passwd;
@@ -6820,7 +6724,7 @@ void ONMainWindow::slotGetServers ( bool result, QString output,
     for (int i=0; i< serverSshConnections.count(); ++i)
     {
         if (serverSshConnections[i])
-            serverSshConnections[i]->disconnectSession();
+            delete serverSshConnections[i];
     }
     serverSshConnections.clear();
     for ( int j=0; j<x2goServers.size(); ++j )
@@ -6833,16 +6737,13 @@ void ONMainWindow::slotGetServers ( bool result, QString output,
 
 
 void ONMainWindow::slotListAllSessions ( bool result,QString output,
-        SshProcess* proc )
+        int )
 {
     bool last=false;
 
     ++retSessions;
     if ( retSessions == x2goServers.size() )
         last=true;
-    if ( proc )
-        delete proc;
-    proc=0;
 
     if ( result==false )
     {
@@ -7001,11 +6902,9 @@ void ONMainWindow::exportDirs ( QString exports,bool removable )
             if ( startSshFsTunnel() )
                 return;
     }
-    SshProcess* lproc;
+
+
     QString uname=getCurrentUname();
-    lproc=new SshProcess ( sshConnection, this );
-    connect ( lproc,SIGNAL ( sshFinished ( bool,QString,SshProcess* ) ),
-              this,SLOT ( slotCopyKey ( bool, QString,SshProcess* ) ) );
     QString dst=dr.key;
     QString dhdir=homeDir+"/.x2go";
 #ifdef Q_OS_WIN
@@ -7017,7 +6916,7 @@ void ONMainWindow::exportDirs ( QString exports,bool removable )
     dr.isRemovable=removable;
     exportDir.append ( dr );
     QString keyFile=dr.key;
-    lproc->start_cp ( keyFile,dst );
+    sshConnection->copyFile ( keyFile,dst, this,  SLOT ( slotCopyKey ( bool, QString,int ) ));
 
 }
 
@@ -7207,12 +7106,9 @@ QString ONMainWindow::createRSAKey()
     return keyName;
 }
 
-void ONMainWindow::slotCopyKey ( bool result, QString output, SshProcess* proc )
+void ONMainWindow::slotCopyKey ( bool result, QString output, int pid)
 {
-    fsExportKey=proc->getSource();
-    if ( proc )
-        delete proc;
-    proc=0;
+    fsExportKey=sshConnection->getSourceFile(pid);
     x2goDebug<<"exported key "<<fsExportKey;
     QFile::remove ( fsExportKey );
     x2goDebug<<"key removed";
@@ -7254,20 +7150,18 @@ directory* ONMainWindow::getExpDir ( QString key )
 
 
 void ONMainWindow::slotRetExportDir ( bool result,QString output,
-                                      SshProcess* proc )
+                                      int pid)
 {
 
     QString key;
     for ( int i=0; i<exportDir.size(); ++i )
-        if ( exportDir[i].proc==proc )
+        if ( exportDir[i].pid==pid )
         {
             key=exportDir[i].key;
             exportDir.removeAt ( i );
             break;
         }
 
-    if ( proc )
-        delete proc;
 
     if ( result==false )
     {
@@ -7492,10 +7386,8 @@ void ONMainWindow::slotExportTimer()
 
     for ( int i=0; i<args.size(); ++i )
     {
-        SshProcess* sproc=new SshProcess (
-            sshConnection, this );
-        sproc->startNormal ( "export HOSTNAME && x2goumount_session "+
-                             sessionId+" "+args[i] );
+        sshConnection->executeCommand ( "export HOSTNAME && x2goumount_session "+
+                                        sessionId+" "+args[i] );
     }
 }
 
@@ -8308,20 +8200,13 @@ void ONMainWindow::check_cmd_status()
     passwd=getCurrentPass();
 
     x2goDebug<<"check command message"<<endl;
-    SshProcess* proc;
-    proc=new SshProcess ( sshConnection, this );
-    connect ( proc,SIGNAL ( sshFinished ( bool,QString,SshProcess* ) ),
-              this,SLOT ( slotCmdMessage ( bool, QString,SshProcess* ) ) );
-
-    proc->startNormal ( "x2gocmdexitmessage "+
-                        resumingSession.sessionId );
+    sshConnection->executeCommand ( "x2gocmdexitmessage "+
+                                    resumingSession.sessionId , this, SLOT(slotCmdMessage(bool, QString, int)));
 }
 
 void ONMainWindow::slotCmdMessage ( bool result,QString output,
-                                    SshProcess* proc )
+                                    int)
 {
-    if ( proc )
-        delete proc;
     if ( result==false )
     {
         cardReady=false;
@@ -8340,7 +8225,7 @@ void ONMainWindow::slotCmdMessage ( bool result,QString output,
         passForm->setEnabled ( true );
         pass->setFocus();
         pass->selectAll();
-        sshConnection->disconnectSession();
+        delete sshConnection;
         sshConnection=0;
         return;
     }
@@ -8353,7 +8238,7 @@ void ONMainWindow::slotCmdMessage ( bool result,QString output,
                                 cmd,QMessageBox::Ok,
                                 QMessageBox::NoButton );
     }
-    sshConnection->disconnectSession();
+    delete sshConnection;
     sshConnection=0;
 }
 
@@ -8378,23 +8263,14 @@ int ONMainWindow::startSshFsTunnel()
     QString passwd=getCurrentPass();
     QString uname=getCurrentUname();
 
-    fsTunnel=new SshProcess ( sshConnection, this );
-
-    connect ( fsTunnel,SIGNAL ( sshFinished ( bool,
-                                QString,SshProcess* ) ),
-              this,SLOT ( slotFsTunnelFailed ( bool,
-                          QString,SshProcess* ) ) );
-
-    connect ( fsTunnel,SIGNAL ( sshTunnelOk() ),
-              this,SLOT ( slotFsTunnelOk() ) );
-
-    fsTunnel->startTunnel ( "localhost",resumingSession.fsPort.toUInt(),"127.0.0.1",
-                            clientSshPort.toInt(), true );
+    fsTunnel=sshConnection->startTunnel ( "localhost",resumingSession.fsPort.toUInt(),"127.0.0.1",
+                                          clientSshPort.toInt(), true, this, SLOT ( slotFsTunnelOk(int)), SLOT ( slotFsTunnelFailed ( bool,
+                                                  QString,int ) ) );
     return 0;
 }
 
 void ONMainWindow::slotFsTunnelFailed ( bool result,  QString output,
-                                        SshProcess* )
+                                        int)
 {
     if ( result==false )
     {
@@ -8407,15 +8283,13 @@ void ONMainWindow::slotFsTunnelFailed ( bool result,  QString output,
                                     QMessageBox::Ok,
                                     QMessageBox::NoButton );
         }
-        if ( fsTunnel )
-            delete fsTunnel;
         fsTunnel=0l;
         fsTunReady=false;
     }
 }
 
 
-void ONMainWindow::slotFsTunnelOk()
+void ONMainWindow::slotFsTunnelOk(int)
 {
     fsTunReady=true;
     //start reverse mounting if RSA Key and FS tunnel are ready
@@ -8498,7 +8372,6 @@ void ONMainWindow::startX2goMount()
 #ifdef Q_OS_WIN
     cuser="sshuser";
 #endif
-    SshProcess* proc=0l;
     QString cmd;
     QString dirs=dir->dirList;
 
@@ -8564,14 +8437,9 @@ void ONMainWindow::startX2goMount()
         }
     }
 
-    proc=new SshProcess ( sshConnection, this );
-    dir->proc=proc;
-
-    connect ( proc,SIGNAL ( sshFinished ( bool, QString,SshProcess* ) ),
-              this,SLOT ( slotRetExportDir ( bool,
-                          QString,SshProcess* ) ) );
+    dir->pid=sshConnection->executeCommand(cmd,this,SLOT ( slotRetExportDir ( bool,
+                                           QString,int) ));
 
-    proc->startNormal ( cmd );
 }
 
 void ONMainWindow::slotCheckPrintSpool()
@@ -9557,9 +9425,7 @@ void ONMainWindow::slotConfigXinerama()
     {
         xineramaScreens=newXineramaScreens;
         x2goDebug<<"xinerama screen changed, new screens: "<<xineramaScreens<<endl;
-        SshProcess* proc=new SshProcess(sshConnection, this);
         xineramaTimer->stop();
-        connect (proc, SIGNAL(sshFinished(bool,QString,SshProcess*)), this, SLOT(slotXineramaConfigured()));
         QStringList screens;
         foreach (QRect disp, xineramaScreens)
         screens<<QString::number(disp.x())+" "+QString::number(disp.y())+" "+QString::number(disp.width())+
@@ -9568,7 +9434,7 @@ void ONMainWindow::slotConfigXinerama()
                     resumingSession.sessionId+"/xinerama.conf";
 
         x2goDebug<<cmd<<endl;
-        proc->startNormal(cmd);
+        sshConnection->executeCommand(cmd, this, SLOT(slotXineramaConfigured()));
     }
 }
 
@@ -10691,7 +10557,6 @@ void ONMainWindow::slotStartParec ()
         QTimer::singleShot ( 1000, this, SLOT ( slotStartParec() ) );
         return;
     }
-    SshProcess* paProc;
     QString passwd=getCurrentPass();
     QString user=getCurrentUname();
     QString host=resumingSession.server;
@@ -10700,8 +10565,7 @@ void ONMainWindow::slotStartParec ()
                  "/.pulse-client.conf "+
                  "parec 1> /dev/null & sleep 1 && kill %1";
 
-    paProc=new SshProcess ( sshConnection, this );
-    paProc->startNormal ( scmd );
+    sshConnection->executeCommand ( scmd );
 }
 
 
@@ -10713,7 +10577,7 @@ void ONMainWindow::slotSndTunOk()
 
 void ONMainWindow::slotPCookieReady (	bool result,
                                         QString ,
-                                        SshProcess* )
+                                        int )
 {
     if ( result )
         slotStartParec();
diff --git a/onmainwindow.h b/onmainwindow.h
index 5e8ec6e..ae8ac77 100644
--- a/onmainwindow.h
+++ b/onmainwindow.h
@@ -75,7 +75,6 @@ class QAction;
 class QCheckBox;
 class QTreeView;
 class QModelIndex;
-class SshProcess;
 class SshMasterConnection;
 class IMGFrame;
 class QStandardItemModel;
@@ -100,7 +99,7 @@ struct directory
     QString dstKey;
     QString dirList;
     bool isRemovable;
-    SshProcess* proc;
+    int pid;
 };
 
 struct serv
@@ -760,9 +759,9 @@ private:
     QTextEdit* stInfo;
 
     SVGFrame* ln;
-    SshProcess* tunnel;
-    SshProcess* sndTunnel;
-    SshProcess* fsTunnel;
+    int tunnel;
+    int sndTunnel;
+    int fsTunnel;
     QList<x2goSession> selectedSessions;
     QStringList selectedDesktops;
     x2goSession resumingSession;
@@ -914,7 +913,7 @@ private slots:
     void slotChangeKbdLayout(const QString& layout);
     void slotSyncX();
     void slotShutdownThinClient();
-    void slotReadApplications(bool result, QString output, SshProcess* proc );
+    void slotReadApplications(bool result, QString output, int pid );
 
 public slots:
     void slotConfig();
@@ -942,24 +941,24 @@ private slots:
     void slotGetBrokerAuth();
     void slotGetBrokerSession();
     void slotCmdMessage ( bool result,QString output,
-                          SshProcess* );
+                          int );
     void slotListSessions ( bool result,QString output,
-                            SshProcess* );
+                            int );
     void slotRetSuspSess ( bool value,QString message,
-                           SshProcess* );
+                           int );
     void slotRetTermSess ( bool result,QString output,
-                           SshProcess* );
+                           int );
     void slotRetResumeSess ( bool result,QString output,
-                             SshProcess* );
+                             int );
     void slotTunnelFailed ( bool result,QString output,
-                            SshProcess* );
+                            int );
     void slotFsTunnelFailed ( bool result,QString output,
-                              SshProcess* );
+                              int );
     void slotSndTunnelFailed ( bool result,QString output,
-                               SshProcess* );
-    void slotCopyKey ( bool result,QString output,SshProcess* );
-    void slotTunnelOk();
-    void slotFsTunnelOk();
+                               int );
+    void slotCopyKey ( bool result,QString output,int );
+    void slotTunnelOk(int );
+    void slotFsTunnelOk(int );
     void slotProxyError ( QProcess::ProcessError err );
     void slotProxyFinished ( int result,QProcess::ExitStatus st );
     void slotProxyStderr();
@@ -969,13 +968,13 @@ private slots:
     void slotRestartProxy();
     void slotTestSessionStatus();
     void slotRetRunCommand ( bool result, QString output,
-                             SshProcess* );
+                             int );
     void slotGetServers ( bool result, QString output,
-                          SshProcess* );
+                          int );
     void slotListAllSessions ( bool result,QString output,
-                               SshProcess* );
+                               int );
     void slotRetExportDir ( bool result,QString output,
-                            SshProcess* );
+                            int );
     void slotResize();
     void slotExportDirectory();
     void slotExportTimer();
@@ -1018,7 +1017,7 @@ private slots:
     void slotStartParec ();
     void slotSndTunOk();
     void slotPCookieReady (	bool result,QString output,
-                            SshProcess* proc );
+                            int proc );
     void slotEmbedToolBar();
     void slotEmbedToolBarToolTip();
     void slotHideEmbedToolBarToolTip();
diff --git a/onmainwindow_privat.h b/onmainwindow_privat.h
index 1d6266d..f1a7e4d 100644
--- a/onmainwindow_privat.h
+++ b/onmainwindow_privat.h
@@ -71,7 +71,6 @@
 #include <QUrl>
 #include <QLocalSocket>
 #include <QPlastiqueStyle>
-#include "sshprocess.h"
 #include "imgframe.h"
 #include <QToolTip>
 #include "clicklineedit.h"
diff --git a/sshmasterconnection.cpp b/sshmasterconnection.cpp
index 0bde770..619d2e7 100644
--- a/sshmasterconnection.cpp
+++ b/sshmasterconnection.cpp
@@ -74,6 +74,7 @@ SshMasterConnection::SshMasterConnection (QObject* parent, QString host, int por
     tcpNetworkProxy = NULL;
     sshProxy= NULL;
     sshProxyReady=false;
+    nextPid=0;
 
     breakLoop=false;
     this->host=host;
@@ -101,7 +102,9 @@ SshMasterConnection::SshMasterConnection (QObject* parent, QString host, int por
         x2goDebug<<"starting ssh connection without kerberos authentication"<<endl;
 #endif
     kerberos=false;
-
+#ifdef DEBUG
+    x2goDebug<<"SshMasterConnection, instance "<<this<<" created";
+#endif
 }
 
 SshMasterConnection::SshMasterConnection (QObject* parent, ONMainWindow* mwd, QString host, int port, bool acceptUnknownServers,
@@ -141,6 +144,9 @@ SshMasterConnection::SshMasterConnection (QObject* parent, ONMainWindow* mwd, QS
     reverseTunnel=true;
     reverseTunnelRemotePort=remotePort;
     mainWnd=mwd;
+#ifdef DEBUG
+    x2goDebug<<"SshMasterConnection, instance "<<this<<" created (reverse tunnel)";
+#endif
 }
 
 void SshMasterConnection::slotSshProxyConnectionOk()
@@ -148,19 +154,69 @@ void SshMasterConnection::slotSshProxyConnectionOk()
 #ifdef DEBUG
     x2goDebug<<"sshproxy connected";
 #endif
-    SshProcess* tunnel=new SshProcess ( sshProxy, this );
 
-    connect ( tunnel,SIGNAL ( sshFinished ( bool,  QString, SshProcess* ) ),
-              this,SLOT ( slotSshProxyTunnelFailed(bool,QString,SshProcess*)));
-    connect ( tunnel,SIGNAL ( sshTunnelOk() ),
-              this,SLOT ( slotSshProxyTunnelOk()) );
 
     localProxyPort=PROXYTUNNELPORT;
     while ( ONMainWindow::isServerRunning ( localProxyPort ) )
         ++localProxyPort;
 
-    tunnel->startTunnel ( host, port, "localhost",localProxyPort);
+    sshProxy->startTunnel ( host, port, "localhost",localProxyPort,false,this, SLOT ( slotSshProxyTunnelOk(int)),
+                            SLOT ( slotSshProxyTunnelFailed(bool,QString,int)));
+
+}
+
 
+int SshMasterConnection::copyFile(const QString& src, const QString dst, QObject* receiver, const char* slotFinished)
+{
+    SshProcess* proc=new SshProcess(this, nextPid++);
+    if(receiver && slotFinished)
+    {
+        connect(proc, SIGNAL(sshFinished(bool,QString,int)), receiver, slotFinished);
+    }
+    proc->start_cp(src,dst);
+    processes<<proc;
+    return proc->pid;
+}
+
+int SshMasterConnection::executeCommand(const QString& command, QObject* receiver, const char* slotFinished)
+{
+    SshProcess* proc=new SshProcess(this, nextPid++);
+    if(receiver && slotFinished)
+    {
+        connect(proc, SIGNAL(sshFinished(bool,QString,int)), receiver, slotFinished);
+    }
+    proc->startNormal(command);
+    processes<<proc;
+    return proc->pid;
+
+}
+
+QString SshMasterConnection::getSourceFile(int pid)
+{
+    foreach (SshProcess* proc, processes)
+    {
+        if(proc->pid==pid)
+            return proc->getSource();
+    }
+    return QString ::null;
+}
+
+
+int SshMasterConnection::startTunnel(const QString& forwardHost, uint forwardPort, const QString& localHost, uint localPort, bool reverse,
+                                     QObject* receiver, const char* slotTunnelOk, const char* slotFinished)
+{
+    SshProcess* proc=new SshProcess(this, nextPid++);
+    if(receiver && slotFinished)
+    {
+        connect(proc, SIGNAL(sshFinished(bool,QString,int)), receiver, slotFinished);
+    }
+    if(receiver && slotTunnelOk)
+    {
+        connect(proc, SIGNAL(sshTunnelOk(int)), receiver, slotTunnelOk);
+    }
+    proc->startTunnel(forwardHost, forwardPort, localHost, localPort, reverse);
+    processes<<proc;
+    return proc->pid;
 }
 
 
@@ -182,7 +238,7 @@ void SshMasterConnection::slotSshProxyUserAuthError(QString err)
 }
 
 
-void SshMasterConnection::slotSshProxyTunnelOk()
+void SshMasterConnection::slotSshProxyTunnelOk(int)
 {
 #ifdef DEBUG
     x2goDebug<<"Ssh proxy tunnel established";
@@ -191,7 +247,7 @@ void SshMasterConnection::slotSshProxyTunnelOk()
 }
 
 void SshMasterConnection::slotSshProxyTunnelFailed(bool ,  QString output,
-        SshProcess*)
+        int)
 {
     breakLoop=true;
     emit connectionError(tr("Failed to create SSH proxy tunnel"), output);
@@ -224,6 +280,9 @@ void SshMasterConnection::slotSshProxyServerAuthAborted()
 
 void SshMasterConnection::run()
 {
+#ifdef DEBUG
+    x2goDebug<<"SshMasterConnection, instance "<<this<<" entering thread";
+#endif
     if(useproxy && proxytype==PROXYSSH && !reverseTunnel)
     {
 
@@ -438,10 +497,23 @@ void SshMasterConnection::run()
 SshMasterConnection::~SshMasterConnection()
 {
 
-    if (tcpProxySocket != NULL)
-        delete tcpProxySocket;
-    if (tcpNetworkProxy != NULL)
-        delete tcpNetworkProxy;
+    disconnectFlagMutex.lock();
+    disconnectSessionFlag=true;
+    disconnectFlagMutex.unlock();
+#ifdef DEBUG
+    x2goDebug<<"SshMasterConnection, instance "<<this<<" waiting for thread to finish";
+#endif
+    wait();
+#ifdef DEBUG
+    x2goDebug<<"SshMasterConnection, instance "<<this<<" thread finished";
+#endif
+    for(int i=processes.count()-1; i>=0; --i)
+    {
+        delete processes[i];
+    }
+#ifdef DEBUG
+    x2goDebug<<"SshMasterConnection, instance "<<this<<" SshMasterConnection, instance  SshMasterConnection(0x7fce7c008aa0) deleted";
+#endif
 }
 
 
@@ -790,14 +862,6 @@ void SshMasterConnection::addCopyRequest ( SshProcess* creator, QString src, QSt
     copyRequestMutex.unlock();
 }
 
-void SshMasterConnection::disconnectSession()
-{
-
-    disconnectFlagMutex.lock();
-    disconnectSessionFlag=true;
-    disconnectFlagMutex.unlock();
-
-}
 
 void SshMasterConnection::copy()
 {
@@ -949,8 +1013,7 @@ void SshMasterConnection::channelLoop()
 
             if (useproxy && proxytype==PROXYSSH&&sshProxy)
             {
-                sshProxy->disconnectSession();
-                sshProxy->wait ( 10000 );
+                delete sshProxy;
                 sshProxy=0;
             }
 
@@ -959,11 +1022,9 @@ void SshMasterConnection::channelLoop()
                 x2goDebug<<"Disconnecting..."<<endl;
 #endif
             reverseTunnelConnectionsMutex.lock();
-            for ( int i=0; i<reverseTunnelConnections.size(); ++i )
+            for ( int i=reverseTunnelConnections.size()-1; i>=0; --i)
             {
-                reverseTunnelConnections[i]->disconnectSession();
-                reverseTunnelConnections[i]->wait ( 10000 );
-
+                delete reverseTunnelConnections[i];
             }
             reverseTunnelConnectionsMutex.unlock();
 
@@ -973,9 +1034,13 @@ void SshMasterConnection::channelLoop()
                 finalize ( i );
             }
             channelConnectionsMutex.unlock();
-
             ssh_disconnect ( my_ssh_session );
             ssh_free ( my_ssh_session );
+
+            if (tcpProxySocket != NULL)
+                delete tcpProxySocket;
+            if (tcpNetworkProxy != NULL)
+                delete tcpNetworkProxy;
 #ifdef DEBUG
             if ( !reverseTunnel )
                 x2goDebug<<"All channels closed, session disconnected, quiting session loop"<<endl;
@@ -1219,7 +1284,6 @@ void SshMasterConnection::finalize ( int item )
         close ( tcpSocket );
     }
     SshProcess* proc=channelConnections[item].creator;
-    proc->shutdownSocket();
     channelConnections.removeAt ( item );
     emit channelClosed ( proc );
 }
diff --git a/sshmasterconnection.h b/sshmasterconnection.h
index d9e92cf..fa9af03 100644
--- a/sshmasterconnection.h
+++ b/sshmasterconnection.h
@@ -73,9 +73,15 @@ public:
                               int forwardPort, QString localHost, int localPort, void* channel=0l);
     void addChannelConnection(SshProcess* creator, QString cmd);
     void addCopyRequest(SshProcess* creator, QString src, QString dst);
-    void disconnectSession();
     void writeKnownHosts(bool);
     void setKeyPhrase(QString);
+
+    int executeCommand(const QString& command, QObject* receiver=0, const char* slotFinished=0);
+    int startTunnel(const QString& forwardHost, uint forwardPort, const QString& localHost,
+                    uint localPort, bool reverse=false, QObject* receiver=0, const char* slotTunnelOk=0, const char* slotFinished=0);
+    int copyFile(const QString& src, const QString dst, QObject* receiver=0, const char* slotFinished=0);
+    QString getSourceFile(int pid);
+
     void setAcceptUnknownServers(bool accept)
     {
         acceptUnknownServers=accept;
@@ -128,9 +134,9 @@ private slots:
 
 
     void slotSshProxyConnectionOk();
-    void slotSshProxyTunnelOk();
+    void slotSshProxyTunnelOk(int);
     void slotSshProxyTunnelFailed(bool result,  QString output,
-                                  SshProcess*);
+                                  int);
 
 private:
     ssh_session my_ssh_session;
@@ -144,6 +150,8 @@ private:
     QMutex writeHostKeyMutex;
     bool writeHostKey;
     bool writeHostKeyReady;
+    int nextPid;
+    QList<SshProcess*> processes;
 
     QString keyPhrase;
     bool keyPhraseReady;
diff --git a/sshprocess.cpp b/sshprocess.cpp
index 7050354..c997002 100644
--- a/sshprocess.cpp
+++ b/sshprocess.cpp
@@ -33,7 +33,8 @@
 #undef DEBUG
 // #define DEBUG
 
-SshProcess::SshProcess(SshMasterConnection* master, QObject* parent): QObject(parent)
+
+SshProcess::SshProcess(SshMasterConnection* master, int pid): QObject(0)
 {
     masterCon=master;
     serverSocket=0;
@@ -41,6 +42,7 @@ SshProcess::SshProcess(SshMasterConnection* master, QObject* parent): QObject(pa
     connect(master,SIGNAL(ioErr(SshProcess*,QString,QString)),this,SLOT(slotIOerr(SshProcess*,QString,QString)));
     tunnel=false;
     normalExited=true;
+    this->pid=pid;
 }
 
 SshProcess::~SshProcess()
@@ -60,21 +62,6 @@ SshProcess::~SshProcess()
     }
 }
 
-void SshProcess::shutdownSocket()
-{
-    if (serverSocket>0)
-    {
-#ifdef Q_OS_WIN
-        closesocket(serverSocket);
-        WSACleanup();
-
-#else
-        close(serverSocket);
-#endif
-        serverSocket=0;
-
-    }
-}
 
 void SshProcess::slotCheckNewConnection()
 {
@@ -111,7 +98,7 @@ void SshProcess::tunnelLoop()
     {
         QString err=tr("Error creating socket");
         x2goDebug<<err<<endl;
-        emit sshFinished(false,err,this);
+        emit sshFinished(false,err,pid);
         return;
     }
 #ifndef Q_OS_WIN
@@ -129,7 +116,7 @@ void SshProcess::tunnelLoop()
     {
         QString err=tr("Error binding ")+localHost+":"+QString::number(localPort);
         x2goDebug<<err<<endl;
-        emit sshFinished(false,err,this);
+        emit sshFinished(false,err,pid);
         return;
     }
     listen(serverSocket,5);
@@ -137,7 +124,7 @@ void SshProcess::tunnelLoop()
     QTimer* timer=new QTimer();
     connect(timer,SIGNAL(timeout()),this,SLOT(slotCheckNewConnection()));
     timer->start(100);
-    emit sshTunnelOk();
+    emit sshTunnelOk(pid);
 #ifdef DEBUG
     x2goDebug<<"Direct tunnel: waiting for connections on "<<localHost<<":"<<localPort<<endl;
 #endif
@@ -216,20 +203,20 @@ void SshProcess::slotCopyErr(SshProcess* creator, QString message, QString sshSe
 {
     if (creator!=this)
         return;
-    emit sshFinished(false, message+" - "+sshSessionErr, this);
+    emit sshFinished(false, message+" - "+sshSessionErr, pid);
 }
 
 void SshProcess::slotCopyOk(SshProcess* creator)
 {
     if (creator!=this)
         return;
-    emit sshFinished(true,"", this);
+    emit sshFinished(true,"", pid);
 }
 
 void SshProcess::slotReverseTunnelOk(SshProcess* creator)
 {
     if (creator==this)
-        emit sshTunnelOk();
+        emit sshTunnelOk(pid);
 }
 
 
@@ -258,5 +245,5 @@ void SshProcess::slotChannelClosed(SshProcess* creator)
 #ifdef DEBUG
     x2goDebug<<"ssh finished:"<<normalExited<<" - "<<output<<endl;
 #endif
-    emit sshFinished(normalExited, output, this);
+    emit sshFinished(normalExited, output, pid);
 }
diff --git a/sshprocess.h b/sshprocess.h
index 5b9dad4..9bd8b92 100644
--- a/sshprocess.h
+++ b/sshprocess.h
@@ -29,34 +29,33 @@
 #include <netinet/in.h>
 #endif
 
-class SshMasterConnection;
+#include "sshmasterconnection.h"
 
 
 class SshProcess : public QObject
 {
     Q_OBJECT
+    friend class SshMasterConnection;
+private:
 
-public:
-    SshProcess(SshMasterConnection* master, QObject* parent=0);
+    SshProcess(SshMasterConnection* master, int pid);
     ~SshProcess();
 
-public:
     void startNormal(const QString& cmd);
     void startTunnel(const QString& forwardHost, uint forwardPort, const QString& localHost,
                      uint localPort, bool reverse=false);
     void start_cp(QString src, QString dst);
-    void shutdownSocket();
-    QString getSource() 
+    QString getSource()
     {
         return scpSource;
     }
 
-private:
     void tunnelLoop();
 
 private:
     SshMasterConnection* masterCon;
     SshMasterConnection* tunnelConnection;
+    int pid;
     QString forwardHost;
     QString localHost;
     QString command;
@@ -87,11 +86,8 @@ private slots:
     void slotCopyOk(SshProcess* creator);
     void slotCopyErr(SshProcess* creator,QString message, QString sshSessionErr);
 signals:
-    void sshFinished ( bool result, QString output, SshProcess* proc);
-    void sshTunnelOk();
-    /*
-        void sudoConfigError ( QString, SshProcess* );
-        */
+    void sshFinished ( bool result, QString output, int processId);
+    void sshTunnelOk(int processId);
 };
 
 #endif // SSHPROCESS_H


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).




More information about the x2go-commits mailing list