[X2Go-Commits] [x2goclient] 01/01: Add new brocker feature. Broker can send to client some configuration in the section START_CLIENT_CONFIG - END_CLIENT_CONFIG. For the moment is supported option events=bool. If true, client sending to broker events: CONNECTING, CONNECTED, SUSPENDING, TERMINATING, FINISHED. It's not a real session state, but rather the state of X2Go Client.

git-admin at x2go.org git-admin at x2go.org
Tue Aug 21 15:43:05 CEST 2018


This is an automated email from the git hooks/post-receive script.

x2go pushed a commit to branch master
in repository x2goclient.

commit 539e0a4268df3d78f88f6908506c18222743d84f
Author: Oleksandr Shneyder <o.shneyder at phoca-gmbh.de>
Date:   Tue Aug 21 15:42:52 2018 +0200

    Add new brocker feature. Broker can send to client some configuration in the section START_CLIENT_CONFIG - END_CLIENT_CONFIG. For the moment is supported option events=bool. If true, client sending to broker events: CONNECTING, CONNECTED, SUSPENDING, TERMINATING, FINISHED. It's not a real session state, but rather the state of X2Go Client.
---
 debian/changelog         |  5 +++
 src/httpbrokerclient.cpp | 86 ++++++++++++++++++++++++++++++++++++++++++++++++
 src/httpbrokerclient.h   |  5 +++
 src/onmainwindow.cpp     | 86 +++++++++++++++++++++++++++++++++++++++++++-----
 src/onmainwindow.h       | 15 ++++++++-
 5 files changed, 187 insertions(+), 10 deletions(-)

diff --git a/debian/changelog b/debian/changelog
index 5e22cd3..b0c0449 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -3,6 +3,11 @@ x2goclient (4.1.2.2-0x2go1) UNRELEASED; urgency=medium
   [ Oleksandr Shneyder ]
   * New upstream version (4.1.2.2):
     - Add SSH instruction to list of errors if keyboard-interactive auth has failed.
+    - Add new brocker feature. Broker can send to client some configuration in
+      the section START_CLIENT_CONFIG - END_CLIENT_CONFIG. For the moment is supported
+      option events=bool. If true, client sending to broker events: CONNECTING,
+      CONNECTED, SUSPENDING, TERMINATING, FINISHED. It's not a real session state,
+      but rather the state of X2Go Client.
 
   [ Mihai Moldovan ]
   * New upstream version (4.1.2.2):
diff --git a/src/httpbrokerclient.cpp b/src/httpbrokerclient.cpp
index f7fbaf1..ea5158e 100644
--- a/src/httpbrokerclient.cpp
+++ b/src/httpbrokerclient.cpp
@@ -270,6 +270,7 @@ void HttpBrokerClient::slotSshUserAuthError(QString error)
     return;
 }
 
+
 void HttpBrokerClient::getUserSessions()
 {
     QString brokerUser=config->brokerUser;
@@ -347,6 +348,66 @@ void HttpBrokerClient::selectUserSession(const QString& session)
 
 }
 
+void HttpBrokerClient::sendEvent(const QString& ev, const QString& id, const QString& server, const QString& client, const QString& login, const QString& cmd, const QString& display, const QString& start)
+{
+    x2goDebug<<"Called sendEvent.";
+    QString brokerUser=config->brokerUser;
+    if(mainWindow->getUsePGPCard())
+        brokerUser=mainWindow->getCardLogin();
+
+    if(!sshBroker)
+    {
+        QString req;
+        QTextStream ( &req ) <<
+                             "task=clientevent&"<<
+                             "user="<<QUrl::toPercentEncoding(brokerUser)<<"&"<<
+                             "sid="<<id<<"&"<<
+                             "event="<<ev<<"&"<<
+                             "server="<<QUrl::toPercentEncoding(server)<<"&"<<
+                             "client="<<QUrl::toPercentEncoding(client)<<"&"<<
+                             "login="<<QUrl::toPercentEncoding(login)<<"&"<<
+                             "cmd="<<QUrl::toPercentEncoding(cmd)<<"&"<<
+                             "display="<<QUrl::toPercentEncoding(display)<<"&"<<
+                             "start="<<QUrl::toPercentEncoding(start)<<"&"<<
+                             "authid="<<nextAuthId;
+        x2goDebug << "Sending request: "<< req.toUtf8();
+        QNetworkRequest request(QUrl(config->brokerurl));
+        request.setHeader(QNetworkRequest::ContentTypeHeader, "application/x-www-form-urlencoded");
+        eventRequest=http->post (request, req.toUtf8() );
+
+    }
+    else
+    {
+        if (nextAuthId.length() > 0) {
+            sshConnection->executeCommand ( config->sshBrokerBin+" --user "+ brokerUser +" --authid "+nextAuthId+
+            " --task clientevent --sid \""+id+"\" --event "+ev+" --server \""+server+"\" --client \""+client+"\" --login "+"\""+
+            login+"\" --cmd \""+cmd+"\" --display \""+display+"\" --start \""+start+"\"",
+            this,SLOT ( slotEventSent(bool,QString,int)));
+        } else {
+            sshConnection->executeCommand ( config->sshBrokerBin+" --user "+ brokerUser +
+            " --task clientevent --sid \""+id+"\" --event "+ev+" --server \""+server+"\" --client \""+client+"\" --login "+"\""+
+            login+"\" --cmd \""+cmd+"\" --display\" "+display+" \" --start \""+start+"\"",
+            this,SLOT ( slotEventSent(bool,QString,int)));
+        }
+    }
+}
+
+
+void HttpBrokerClient::slotEventSent(bool success, QString answer, int)
+{
+    if(!success)
+    {
+        x2goDebug<<answer;
+        QMessageBox::critical(0,tr("Error"),answer);
+        emit fatalHttpError();
+        return;
+    }
+    if(!checkAccess(answer))
+        return;
+    x2goDebug<<"event sent:"<<answer;
+}
+
+
 void HttpBrokerClient::changePassword(QString newPass)
 {
     newBrokerPass=newPass;
@@ -405,6 +466,16 @@ void HttpBrokerClient::testConnection()
     }
 }
 
+void HttpBrokerClient::processClientConfig(const QString& raw_content)
+{
+    X2goSettings st(raw_content, QSettings::IniFormat);
+    mainWindow->config.brokerEvents=st.setting()->value("events",false).toBool();
+    if(mainWindow->config.brokerEvents)
+    {
+        x2goDebug<<"sending client events to broker";
+    }
+}
+
 
 void HttpBrokerClient::createIniFile(const QString& raw_content)
 {
@@ -420,6 +491,17 @@ void HttpBrokerClient::createIniFile(const QString& raw_content)
         cont=cont.split("END_USER_SESSIONS\n")[0];
     }
     mainWindow->config.iniFile=cont;
+    lines=content.split("START_CLIENT_CONFIG\n");
+    if (lines.count()>1)
+    {
+        cont=lines[1];
+        cont=cont.split("END_CLIENT_CONFIG\n")[0];
+        processClientConfig(cont);
+    }
+    else
+    {
+        x2goDebug<<"no client config from broker";
+    }
 }
 
 
@@ -540,6 +622,10 @@ void HttpBrokerClient::slotRequestFinished ( QNetworkReply*  reply )
     {
         slotPassChanged(true,answer,0);
     }
+    if (reply == eventRequest)
+    {
+        slotEventSent(true,answer,0);
+    }
 
     // We receive ownership of the reply object
     // and therefore need to handle deletion.
diff --git a/src/httpbrokerclient.h b/src/httpbrokerclient.h
index 0a307e1..4e0098e 100644
--- a/src/httpbrokerclient.h
+++ b/src/httpbrokerclient.h
@@ -45,6 +45,8 @@ public:
     void changePassword(QString newPass);
     void testConnection();
     void closeSSHInteractionDialog();
+    void sendEvent(const QString& ev, const QString& id, const QString& server, const QString& client,
+                   const QString& login, const QString& cmd, const QString& display, const QString& start);
 private:
     QNetworkAccessManager* http;
     QNetworkRequest* netRequest;
@@ -53,6 +55,7 @@ private:
     QNetworkReply* selSessRequest;
     QNetworkReply* chPassRequest;
     QNetworkReply* testConRequest;
+    QNetworkReply* eventRequest;
     QString nextAuthId;
     QString newBrokerPass;
     ConfigFile* config;
@@ -62,6 +65,7 @@ private:
     SshMasterConnection* sshConnection;
 private:
     void createIniFile(const QString& raw_content);
+    void processClientConfig(const QString& raw_content);
     void parseSession(QString sInfo);
     void createSshConnection();
     bool checkAccess(QString answer);
@@ -78,6 +82,7 @@ private slots:
     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 slotEventSent ( bool success, QString answer, int pid);
     void slotConnectionTest( bool success, QString answer, int pid);
     void slotSshIoErr(SshProcess* caller, QString error, QString lastSessionError);
 
diff --git a/src/onmainwindow.cpp b/src/onmainwindow.cpp
index 405b124..d547248 100644
--- a/src/onmainwindow.cpp
+++ b/src/onmainwindow.cpp
@@ -3548,6 +3548,12 @@ void ONMainWindow::startDirectRDP()
     resumingSession.sessionId=sessionExplorer->getLastSession()->name();
     resumingSession.crTime=QDateTime::currentDateTime().toString("dd.MM.yy HH:mm:ss");
     showSessionStatus();
+    if(brokerMode)
+    {
+        sendEventToBroker(CONNECTING,resumingSession.sessionId,resumingSession.server, resumingSession.clientIp, getCurrentUname(),
+                          resumingSession.command, resumingSession.display, resumingSession.crTime);
+    }
+
 //     QTimer::singleShot ( 30000,this,SLOT ( slotRestartProxy() ) );
     proxyRunning=true;
     delete st;
@@ -3991,6 +3997,31 @@ x2goSession ONMainWindow::getSessionFromString ( const QString& string )
 }
 
 
+void ONMainWindow::sendEventToBroker(ONMainWindow::client_events ev, const QString& id, const QString& server, const QString& client, const QString& login, const QString& cmd, const QString& display, const QString& start)
+{
+    if(!config.brokerEvents)
+    {
+        return;
+    }
+    if(ev <= lastBrokerEvent && id == lastBrokerEventSession )
+    {
+        return;
+    }
+    lastBrokerEvent=ev;
+    lastBrokerEventSession=id;
+    QString event;
+    switch(ev)
+    {
+        case CONNECTING: event="CONNECTING";break;
+        case CONNECTED: event="CONNECTED";break;
+        case SUSPENDING: event="SUSPENDING";break;
+        case TERMINATING: event="TERMINATING";break;
+        case FINISHED: event="FINISHED";break;
+    }
+    broker->sendEvent(event, id, server, client, login, cmd, display, start);
+}
+
+
 void ONMainWindow::startNewSession()
 {
     newSession=true;
@@ -5025,6 +5056,11 @@ void ONMainWindow::slotSuspendSess()
 void ONMainWindow::slotSuspendSessFromSt()
 {
 
+    if(brokerMode)
+    {
+        sendEventToBroker(SUSPENDING,resumingSession.sessionId,resumingSession.server, resumingSession.clientIp, getCurrentUname(),
+                          resumingSession.command, resumingSession.display, resumingSession.crTime);
+    }
 #ifdef Q_OS_LINUX
     if (directRDP)
     {
@@ -5053,6 +5089,11 @@ void ONMainWindow::slotTermSessFromSt()
     if (directRDP)
     {
 
+        if(brokerMode)
+        {
+            sendEventToBroker(TERMINATING,resumingSession.sessionId,resumingSession.server, resumingSession.clientIp, getCurrentUname(),
+                              resumingSession.command, resumingSession.display, resumingSession.crTime);
+        }
         x2goDebug<<"Terminating direct RDP session.";
 
         nxproxy->terminate();
@@ -5061,20 +5102,30 @@ void ONMainWindow::slotTermSessFromSt()
     }
 #endif
 
-    x2goDebug<<"Disconnect export.";
-
-    /*
-    	disconnect ( sbExp,SIGNAL ( clicked() ),this,
-    	             SLOT ( slot_exportDirectory() ) );*/
-    sbExp->setEnabled ( false );
 
     if ( !shadowSession )
     {
         if ( termSession ( resumingSession.sessionId ) )
+        {
+            sbExp->setEnabled ( false );
+            if(brokerMode)
+            {
+                sendEventToBroker(TERMINATING,resumingSession.sessionId,resumingSession.server, resumingSession.clientIp, getCurrentUname(),
+                                  resumingSession.command, resumingSession.display, resumingSession.crTime);
+            }
             setStatStatus ( tr ( "terminating" ) );
+        }
     }
     else
+    {
+        sbExp->setEnabled ( false );
+        if(brokerMode)
+        {
+            sendEventToBroker(TERMINATING,resumingSession.sessionId,resumingSession.server, resumingSession.clientIp, getCurrentUname(),
+                              resumingSession.command, resumingSession.display, resumingSession.crTime);
+        }
         termSession ( resumingSession.sessionId,false );
+    }
 }
 
 
@@ -5812,6 +5863,12 @@ void ONMainWindow::slotTunnelOk(int)
 
     nxproxy->start ( proxyCmd );
     proxyRunning=true;
+    if(brokerMode)
+    {
+        sendEventToBroker(CONNECTING,resumingSession.sessionId,resumingSession.server, resumingSession.clientIp, getCurrentUname(),
+                          resumingSession.command, resumingSession.display, resumingSession.crTime);
+    }
+
 // always search for proxy window on linux. On Windows only in window mode
 #ifdef Q_OS_WIN
     if (xorgMode==WIN) {
@@ -6087,7 +6144,11 @@ void ONMainWindow::slotProxyError ( QProcess::ProcessError err )
 
 void ONMainWindow::slotProxyFinished ( int,QProcess::ExitStatus )
 {
-
+    if(brokerMode)
+    {
+        sendEventToBroker(FINISHED,resumingSession.sessionId,resumingSession.server, resumingSession.clientIp, getCurrentUname(),
+                          resumingSession.command, resumingSession.display, resumingSession.crTime);
+    }
 #ifdef Q_OS_DARWIN
     if (modMapTimer) {
       disconnect (modMapTimer, SIGNAL (timeout ()), this, SLOT (slotSetModMap ()));
@@ -6288,9 +6349,11 @@ void ONMainWindow::slotProxyStderr()
     stInfo->insertPlainText ( reserr );
     stInfo->ensureCursorVisible();
     if ( stInfo->toPlainText().indexOf (
-                "Connecting to remote host 'localhost:"+
-                /*resumingSession.grPort*/ localGraphicPort ) !=-1 )
+        "Connecting to remote host 'localhost:"+
+        /*resumingSession.grPort*/ localGraphicPort ) !=-1 )
+    {
         setStatStatus ( tr ( "connecting" ) );
+    }
 
     if ( stInfo->toPlainText().indexOf (
                 "Connection to remote proxy 'localhost:"+
@@ -6310,6 +6373,11 @@ void ONMainWindow::slotProxyStderr()
     if ( stInfo->toPlainText().indexOf (
                 "Established X server connection" ) !=-1 )
     {
+        if(brokerMode)
+        {
+            sendEventToBroker(CONNECTED,resumingSession.sessionId,resumingSession.server, resumingSession.clientIp, getCurrentUname(),
+                              resumingSession.command, resumingSession.display, resumingSession.crTime);
+        }
         setStatStatus ( tr ( "running" ) );
         if (trayEnabled)
         {
diff --git a/src/onmainwindow.h b/src/onmainwindow.h
index 47eaa5e..a1fab35 100644
--- a/src/onmainwindow.h
+++ b/src/onmainwindow.h
@@ -169,6 +169,7 @@ struct ConfigFile
     bool brokerAutologin;
     bool brokerAutologoff;
     bool brokerKrbLogin;
+    bool brokerEvents; //Send events to broker and get control commands
     QString brokerSshKey;
     QString brokerCaCertFile;
     QString iniFile;
@@ -300,6 +301,14 @@ public:
         UNKNOWN_KEY_TYPE
     };
 
+    enum client_events {
+        CONNECTING,
+        CONNECTED,
+        SUSPENDING,
+        TERMINATING,
+        FINISHED
+    };
+
     static bool debugging;
 
     static bool portable;
@@ -859,6 +868,8 @@ private:
     int lastUid;
     bool cardReady;
     HttpBrokerClient* broker;
+    client_events lastBrokerEvent;
+    QString lastBrokerEventSession;
 
 
 #if defined ( Q_OS_WIN) //&& defined (CFGCLIENT )
@@ -899,7 +910,9 @@ private:
     bool trayMinCon;
     bool trayMaxDiscon;
     bool trayAutoHidden;
-
+    void sendEventToBroker(client_events ev, const QString& id, const QString& server, const QString& client,
+                           const QString& login, const QString& cmd,
+                           const QString& display, const QString& start);
     QString findSshKeyForServer(QString user, QString server, QString port);
     void loadSettings();
     void showPass ( UserButton* user );

--
Alioth's /home/x2go-admin/maintenancescripts/git/hooks/post-receive-email on /srv/git/code.x2go.org/x2goclient.git


More information about the x2go-commits mailing list