The branch, master has been updated
via ca94e0810266761b80454a616d68b0f06bad10c7 (commit)
from 23b595523da9554529cb2874112b3b3dad4614db (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 ca94e0810266761b80454a616d68b0f06bad10c7
Author: Oleksandr Shneyder <o.shneyder(a)phoca-gmbh.de>
Date: Wed Mar 13 12:43:54 2013 +0100
implement ssh proxy for ssh connections
-----------------------------------------------------------------------
Summary of changes:
profile.cpp | 2 +
profile.h | 1 +
sshconnection.cpp | 232 +++++++++++++++++++++++++++++++--------
sshconnection.h | 27 ++++-
sshconnectionguiinteraction.cpp | 2 +-
x2goapplication.cpp | 76 +++++++++++++
x2goapplication.h | 1 +
x2gobroker.cpp | 21 +++-
x2gobroker.h | 3 +-
x2gosession.cpp | 19 +++-
10 files changed, 323 insertions(+), 61 deletions(-)
The diff of changes is:
diff --git a/profile.cpp b/profile.cpp
index 36a02de..4d3a99d 100644
--- a/profile.cpp
+++ b/profile.cpp
@@ -82,6 +82,7 @@ void Profile::setDefaultValues()
proxyAutoLogin=false;
proxySameLogin=false;
proxySamePass=false;
+ useBrokerPassForProxy=false;
directRDP=false;
rootless=false;
published=false;
@@ -451,6 +452,7 @@ void Profile::loadProfile()
LOAD_VALUE(Bool, proxySamePass, "sshproxysamepass");
LOAD_VALUE(String, proxyKey, "sshproxykeyfile");
LOAD_VALUE(Bool, proxyAutoLogin, "sshproxyautologin");
+ LOAD_VALUE(Bool, useBrokerPassForProxy, "usebrokerpassforproxy");
LOAD_VALUE(Bool, rootless, "rootless");
LOAD_VALUE(Bool, published, "published");
diff --git a/profile.h b/profile.h
index ca02fae..09f9b52 100644
--- a/profile.h
+++ b/profile.h
@@ -54,6 +54,7 @@ public:
X2GO_PROPERTY(bool, proxySamePass)
X2GO_PROPERTY(QString, proxyKey)
X2GO_PROPERTY(bool, proxyAutoLogin)
+ X2GO_PROPERTY(bool, useBrokerPassForProxy)
X2GO_PROPERTY(bool, rootless)
X2GO_PROPERTY(bool, published)
diff --git a/sshconnection.cpp b/sshconnection.cpp
index 899faea..f5680ae 100644
--- a/sshconnection.cpp
+++ b/sshconnection.cpp
@@ -25,7 +25,7 @@
#define PROXYTUNNELPORT 44444
#undef DEBUG
-// #define DEBUG
+#define DEBUG
#undef SSH_DEBUG
// #define SSH_DEBUG
@@ -52,6 +52,25 @@
bool SshConnection::isLibSshInited=false;
SshConnectionGuiInteraction* SshConnection::guiInteractor=0;
+void SshConnection::initFunction()
+{
+ tcpProxySocket = NULL;
+ tcpNetworkProxy = NULL;
+ sshProxy= NULL;
+ isConnectedFlag=false;
+ nextPid=0;
+ my_ssh_session=0;
+ isConnectedFlag=false;
+ isProxyFailedFlag=false;
+ isProxyReadyFlag=false;
+ sshProxy=0;
+ proxySameLogin=false;
+ proxySamePass=false;
+ disconnectSessionFlag=false;
+ kerberos=false;
+}
+
+
SshConnection::SshConnection(QObject* parent, QString host, int port, bool acceptUnknownServers,
QString user, QString pass, QString key, bool autoLogin, bool krbLogin,
bool useProxy, SshConnection::ProxyType proxyType, QString proxyServer,
@@ -63,19 +82,11 @@ SshConnection::SshConnection(QObject* parent, QString host, int port, bool accep
// As we put a 512KB buffer on the stack later on, we need a bigger stack space.
setStackSize (sizeof (char) * 1024 * 1024 * 2);
#endif
- tcpProxySocket = NULL;
- tcpNetworkProxy = NULL;
- sshProxy= NULL;
- sshProxyReady=false;
- nextPid=0;
- my_ssh_session=0;
- connected=false;
-
- breakLoop=false;
+ initFunction();
this->host=host;
this->port=port;
this->user=user;
- this->pass=pass;
+ this->password=pass;
this->key=key;
this->autoLogin=autoLogin;
this->acceptUnknownServers=acceptUnknownServers;
@@ -87,10 +98,10 @@ SshConnection::SshConnection(QObject* parent, QString host, int port, bool accep
this->proxyPort=proxyPort;
this->proxyLogin=proxyLogin;
this->proxyPassword=proxyPassword;
- reverseTunnel=false;
kerberos=krbLogin;
+ reverseTunnel=false;
+ //not implemented yet
kerberos=false;
-
if(!guiInteractor)
{
guiInteractor=new SshConnectionGuiInteraction(parent);
@@ -108,17 +119,11 @@ SshConnection::SshConnection(QObject* parent, QString host, int port, bool accep
#if defined ( Q_OS_DARWIN )
setStackSize (sizeof (char) * 1024 * 1024 * 2);
#endif
- nextPid=0;
- my_ssh_session=0;
- tcpProxySocket = NULL;
- tcpNetworkProxy = NULL;
- sshProxy= NULL;
- sshProxyReady=false;
- breakLoop=false;
+ initFunction();
this->host=host;
this->port=port;
this->user=user;
- this->pass=pass;
+ this->password=pass;
this->key=key;
this->autoLogin=autoLogin;
this->acceptUnknownServers=acceptUnknownServers;
@@ -132,6 +137,8 @@ SshConnection::SshConnection(QObject* parent, QString host, int port, bool accep
this->proxyKey=proxyKey;
this->localProxyPort=localProxyPort;
this->kerberos=krbLogin;
+//not implemented yet
+ this->kerberos=false;
reverseTunnelLocalHost=localHost;
reverseTunnelLocalPort=localPort;
reverseTunnelCreator=creator;
@@ -151,7 +158,10 @@ SshConnection::~SshConnection()
#ifdef DEBUG
qDebug()<<"SshConnection, instance "<<this<<" waiting for thread to finish";
#endif
- wait();
+ if(!reverseTunnel)
+ wait(15000);
+ else
+ wait(5000);
#ifdef DEBUG
qDebug()<<"SshConnection, instance "<<this<<" thread finished";
#endif
@@ -164,6 +174,11 @@ SshConnection::~SshConnection()
ssh_free(my_ssh_session);
my_ssh_session=0;
}
+ if (useProxy && proxyType==PROXYSSH && sshProxy)
+ {
+ delete sshProxy;
+ sshProxy=0;
+ }
qDebug()<<"ssh connection destructor";
}
@@ -174,10 +189,105 @@ void SshConnection::slotSignalInteractionRecived(SshConnection* requester)
}
+bool SshConnection::isDisconnecting()
+{
+ bool disconnecting;
+ disconnectFlagMutex.lock();
+ disconnecting=disconnectSessionFlag;
+ disconnectFlagMutex.unlock();
+ return disconnecting;
+}
+
+bool SshConnection::isSessionConnected()
+{
+ bool connected;
+ isConnectedMutex.lock();
+ connected=isConnectedFlag;
+ isConnectedMutex.unlock();
+ return connected;
+}
+
+bool SshConnection::isProxyFailed()
+{
+ bool failed;
+ isProxyFailedMutex.lock();
+ failed=isProxyFailedFlag;
+ isProxyFailedMutex.unlock();
+ return failed;
+}
+
+bool SshConnection::isProxyReady()
+{
+ bool ready;
+ isProxyReadyMutex.lock();
+ ready=isProxyReadyFlag;
+ isProxyReadyMutex.unlock();
+ return ready;
+}
+
+
+void SshConnection::slotProxyError(int, QString)
+{
+ isProxyFailedMutex.lock();
+ isProxyFailedFlag=true;
+ isProxyFailedMutex.unlock();
+}
+
+void SshConnection::slotProxyTunnelFailed(bool, QString error, int)
+{
+ isProxyFailedMutex.lock();
+ isProxyFailedFlag=true;
+ isProxyFailedMutex.unlock();
+ emit signalError(CONNECTION, error);
+}
+
+void SshConnection::slotProxyTunnelOk(int)
+{
+ isProxyReadyMutex.lock();
+ isProxyReadyFlag=true;
+ isProxyReadyMutex.unlock();
+}
+
+void SshConnection::slotProxyConnected(QString )
+{
+#ifdef DEBUG
+ qDebug()<<"sshproxy connected";
+#endif
+ localProxyPort=PROXYTUNNELPORT;
+ while ( X2GoApplication::isPortBusy ( localProxyPort ) )
+ ++localProxyPort;
+ sshProxy->startTunnel ( host, port, "localhost",localProxyPort,false,this, SLOT ( slotProxyTunnelOk(int)),
+ SLOT ( slotProxyTunnelFailed(bool,QString,int)));
+}
+
+
void SshConnection::run()
{
- disconnectSessionFlag=false;
-#warning implement ssh proxy code
+ if(useProxy && proxyType==PROXYSSH && !reverseTunnel)
+ {
+
+ if(proxySameLogin)
+ proxyLogin=user;
+ if(proxySamePass)
+ proxyPassword=password;
+ sshProxy=new SshConnection(0, proxyServer, proxyPort,acceptUnknownServers,
+ proxyLogin, proxyPassword, proxyKey, proxyAutoLogin, kerberos, false);
+ connect (sshProxy, SIGNAL(signalError(int,QString)), this, SIGNAL(signalError(int,QString)));
+ connect (sshProxy, SIGNAL(signalConnectionOk(QString)), this, SLOT(slotProxyConnected(QString)));
+ sshProxy->start();
+ while(! isProxyReady())
+ {
+ if(isProxyFailed())
+ return;
+ if(isDisconnecting())
+ return;
+ this->usleep(200);
+ }
+#ifdef DEBUG
+ qDebug()<<"sshproxy ready";
+#endif
+ }
+
if ( !isLibSshInited )
{
qDebug()<<"initing libssh"<<endl;
@@ -191,6 +301,8 @@ void SshConnection::run()
}
isLibSshInited=true;
}
+ if(isDisconnecting())
+ return;
#ifdef SSH_DEBUG
int verbosity=SSH_LOG_PACKET;
@@ -211,6 +323,8 @@ void SshConnection::run()
emit signalIoError ( reverseTunnelCreator, err, "" );
return;
}
+ if(isDisconnecting())
+ return;
#ifdef Q_OS_WIN
ssh_options_set ( my_ssh_session, SSH_OPTIONS_SSH_DIR, (mainWnd->getHomeDirectory()+"/ssh").toAscii());
@@ -239,6 +353,8 @@ void SshConnection::run()
my_ssh_session=0;
return;
}
+ if(isDisconnecting())
+ return;
ssh_options_set( my_ssh_session, SSH_OPTIONS_FD, &proxysocket);
ssh_set_fd_toread( my_ssh_session);
}
@@ -257,6 +373,8 @@ void SshConnection::run()
my_ssh_session=0;
return;
}
+ if(isDisconnecting())
+ return;
QString errMsg;
int state=serverAuth ( errMsg );
if ( state != SSH_SERVER_KNOWN_OK )
@@ -268,8 +386,9 @@ void SshConnection::run()
my_ssh_session=0;
return;
}
+ if(isDisconnecting())
+ return;
- ssh_options_set ( my_ssh_session, SSH_OPTIONS_USER, user.toAscii() );
#ifdef Q_OS_WIN
ssh_options_set ( my_ssh_session, SSH_OPTIONS_SSH_DIR, (QDir::homePath()+"/ssh").toAscii());
#endif
@@ -277,7 +396,9 @@ void SshConnection::run()
{
qDebug()<<"SSH session connected";
emit signalConnectionOk(host);
- connected=true;
+ isConnectedMutex.lock();
+ isConnectedFlag=true;
+ isConnectedMutex.unlock();
}
else
{
@@ -296,6 +417,8 @@ void SshConnection::run()
my_ssh_session=0;
return;
}
+ if(isDisconnecting())
+ return;
#ifndef Q_OS_WIN
@@ -429,13 +552,17 @@ int SshConnection::serverAuth(QString& errorMsg)
bool SshConnection::userAuth()
{
+ if(useProxy && proxyType==PROXYSSH && proxySameLogin && sshProxy)
+ {
+ user=sshProxy->get_user();
+ }
if(user.length()<=0)
{
if (guiInteractor->input(this, tr("Enter user name for connection to ")+"<b>"+host+"</b>",tr("User:"),
user,QLineEdit::Password)!=MessageBox::OK)
return false;
- ssh_options_set ( my_ssh_session, SSH_OPTIONS_USER, user.toAscii() );
}
+ ssh_options_set ( my_ssh_session, SSH_OPTIONS_USER, user.toAscii() );
if ( autoLogin )
if ( userAuthAuto() )
return true;
@@ -452,6 +579,8 @@ bool SshConnection::userAuthAuto()
int rc = ssh_userauth_autopubkey ( my_ssh_session, "" );
while(rc != SSH_AUTH_SUCCESS)
{
+ if(isDisconnecting())
+ return false;
if(guiInteractor->input(this, tr("Enter passphrase to decrypt a key for ")+"<b>"+user+"@"+host+"</b>",tr("Passphrase:"),
keyPhrase,QLineEdit::Password)!=MessageBox::OK)
return false;
@@ -487,6 +616,8 @@ bool SshConnection::userAuthWithKey()
ssh_private_key prkey=privatekey_from_file(my_ssh_session, keyName.toAscii(), 0,"");
while(!prkey)
{
+ if(isDisconnecting())
+ return false;
if(guiInteractor->input(this, tr("Enter passphrase to decrypt a key for ")+"<b>"+user+"@"+host+"</b>",
tr("Passphrase:"), keyPhrase, QLineEdit::Password)!=MessageBox::OK)
break;
@@ -531,23 +662,30 @@ bool SshConnection::userAuthWithKey()
bool SshConnection::userAuthWithPass()
{
- if(pass.length()<=0)
+ if(useProxy && proxyType==PROXYSSH && proxySamePass && sshProxy)
+ {
+ password=sshProxy->get_password();
+ }
+
+ if(password.length()<=0)
if(guiInteractor->input(this, tr("Enter password for ")+"<b>"+user+"@"+host+"</b>",tr("Password:"),
- pass, QLineEdit::Password)!=MessageBox::OK)
+ password, QLineEdit::Password)!=MessageBox::OK)
return false;
- int rc = ssh_userauth_password ( my_ssh_session, NULL, pass.toAscii() );
+ int rc = ssh_userauth_password ( my_ssh_session, NULL, password.toAscii() );
while ( rc != SSH_AUTH_SUCCESS )
{
+ if(isDisconnecting())
+ return false;
if(guiInteractor->input(this, tr("Enter password for ")+"<b>"+user+"@"+host+"</b>",tr("Password:"),
- pass, QLineEdit::Password)!=MessageBox::OK)
+ password, QLineEdit::Password)!=MessageBox::OK)
{
QString err=ssh_get_error ( my_ssh_session );
authErrors<<err;
return false;
}
- rc = ssh_userauth_password ( my_ssh_session, NULL, pass.toAscii() );
+ rc = ssh_userauth_password ( my_ssh_session, NULL, password.toAscii() );
}
return true;
@@ -695,19 +833,10 @@ void SshConnection::channelLoop()
int retval;
int maxsock=-1;
- disconnectFlagMutex.lock();
- bool disconnect=disconnectSessionFlag;
- disconnectFlagMutex.unlock();
- if ( disconnect )
+ if ( isDisconnecting() )
{
- if (useProxy && proxyType==PROXYSSH && sshProxy)
- {
- delete sshProxy;
- sshProxy=0;
- }
-
#ifdef DEBUG
if ( !reverseTunnel )
qDebug()<<"Disconnecting..."<<endl;
@@ -1012,7 +1141,7 @@ void SshConnection::addCopyRequest(SshProcess* creator, QString src, QString dst
SshConnection* SshConnection::reverseTunnelConnection(SshProcess* creator, int remotePort, QString localHost, int localPort)
{
- SshConnection* con=new SshConnection (this, host, port, acceptUnknownServers, user, pass,
+ SshConnection* con=new SshConnection (this, host, port, acceptUnknownServers, user, password,
key, autoLogin, kerberos, remotePort,localHost,
localPort, creator, useProxy, proxyType, proxyServer, proxyPort, proxyLogin,
proxyPassword, proxyKey, proxyAutoLogin, localProxyPort );
@@ -1038,3 +1167,20 @@ int SshConnection::executeCommand(const QString& command, QObject* receiver, con
processes<<proc;
return proc->pid;
}
+
+int SshConnection::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(signalSshFinished(bool,QString,int)), receiver, slotFinished);
+ }
+ if(receiver && slotTunnelOk)
+ {
+ connect(proc, SIGNAL(signalSshTunnelOk(int)), receiver, slotTunnelOk);
+ }
+ proc->startTunnel(forwardHost, forwardPort, localHost, localPort, reverse);
+ processes<<proc;
+ return proc->pid;
+}
diff --git a/sshconnection.h b/sshconnection.h
index 80e16ca..56ab21e 100644
--- a/sshconnection.h
+++ b/sshconnection.h
@@ -37,8 +37,11 @@ class SshConnectionGuiInteraction;
class SshConnection: public QThread
{
+ X2GO_RO_PROPERTY(QString, password)
+ X2GO_RO_PROPERTY(QString, user)
+ X2GO_PROPERTY(bool, proxySameLogin)
+ X2GO_PROPERTY(bool, proxySamePass)
Q_OBJECT
- X2GO_RO_PROPERTY(bool, connected)
public:
enum ProxyType {PROXYSSH, PROXYHTTP};
enum Error {CONNECTION, SERVERAUTH, USERAUTH};
@@ -57,6 +60,9 @@ public:
SshConnection* reverseTunnelConnection(SshProcess* creator, int remotePort,
QString localHost, int localPort);
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);
+ bool isSessionConnected();
@@ -92,8 +98,6 @@ private:
QString keyPhrase;
QString host;
int port;
- QString user;
- QString pass;
QString key;
bool useProxy;
QString proxyServer;
@@ -116,8 +120,9 @@ private:
QTcpSocket *tcpProxySocket;
QNetworkProxy *tcpNetworkProxy;
SshConnection* sshProxy;
- bool sshProxyReady;
- bool breakLoop;
+ bool isConnectedFlag;
+ bool isProxyReadyFlag;
+ bool isProxyFailedFlag;
static bool isLibSshInited;
static SshConnectionGuiInteraction* guiInteractor;
@@ -125,6 +130,9 @@ private:
QMutex copyRequestMutex;
QMutex disconnectFlagMutex;
QMutex reverseTunnelConnectionsMutex;
+ QMutex isConnectedMutex;
+ QMutex isProxyReadyMutex;
+ QMutex isProxyFailedMutex;
private:
SshConnection(QObject* parent, QString host, int port, bool acceptUnknownServers, QString user,
@@ -133,7 +141,7 @@ private:
bool useProxy=false, ProxyType proxyType=PROXYSSH, QString proxyServer=QString::null, quint16 proxyPort=0,
QString proxyLogin=QString::null, QString proxyPassword=QString::null, QString proxyKey=QString::null,
bool proxyAutoLogin=false, int localProxyPort=0);
-
+ void initFunction();
bool sshConnect();
bool userAuthWithPass();
bool userAuthAuto();
@@ -143,10 +151,17 @@ private:
void finalize(int item);
int serverAuth(QString& errorMsg);
void copy();
+ bool isDisconnecting();
+ bool isProxyReady();
+ bool isProxyFailed();
protected:
void run();
private slots:
void slotSignalInteractionRecived(SshConnection* requester);
+ void slotProxyError(int id, QString error);
+ void slotProxyConnected(QString);
+ void slotProxyTunnelFailed(bool status, QString error, int pid);
+ void slotProxyTunnelOk(int pid);
signals:
void signalError(int, QString);
void signalIoError(SshProcess* caller, QString error, QString lastSessionError);
diff --git a/sshconnectionguiinteraction.cpp b/sshconnectionguiinteraction.cpp
index 3c061f8..a9bc99c 100644
--- a/sshconnectionguiinteraction.cpp
+++ b/sshconnectionguiinteraction.cpp
@@ -136,7 +136,7 @@ void SshConnectionGuiInteraction::slotCheckRequests()
echoMode=req.echoMode;
pixPath=req.pixPath;
id=req.id;
- requester=req.requester;
+ requester=req.requester;
break;
}
mutex.unlock();
diff --git a/x2goapplication.cpp b/x2goapplication.cpp
index ffc6992..fe67f1c 100644
--- a/x2goapplication.cpp
+++ b/x2goapplication.cpp
@@ -37,6 +37,82 @@
#include "sshconnection.h"
#include "sessionform.h"
+
+
+bool X2GoApplication::isPortBusy(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 );
+
+ if ( tcpSocket.waitForConnected ( 1000 ) )
+ {
+ tcpSocket.close();
+ return true;
+ }
+ return false;
+}
+
+
+
+
+
X2GoApplication::X2GoApplication(int& argc, char** argv, int flags): QApplication(argc, argv, flags)
{
addTranslator (desktopNames, "KDE", "KDE");
diff --git a/x2goapplication.h b/x2goapplication.h
index 03ca252..73a3b8c 100644
--- a/x2goapplication.h
+++ b/x2goapplication.h
@@ -83,6 +83,7 @@ public:
return &profiles;
}
void updateProfiles();
+ static bool isPortBusy(int port);
public slots:
void slotInitApplication();
private:
diff --git a/x2gobroker.cpp b/x2gobroker.cpp
index 80a1bf7..110d46f 100644
--- a/x2gobroker.cpp
+++ b/x2gobroker.cpp
@@ -31,6 +31,15 @@
#include "profile.h"
#include "x2gosession.h"
+
+QString X2GoBroker::get_password()
+{
+ if(brokerType==SSH && sshConnection)
+ password=sshConnection->get_password();
+ return password;
+}
+
+
X2GoBroker::X2GoBroker(QObject* parent): QObject(parent)
{
http=0;
@@ -56,7 +65,7 @@ X2GoBroker::X2GoBroker(QObject* parent): QObject(parent)
if(url.port()!=-1)
port=url.port();
sshConnection=new SshConnection(this, url.host(), port, cfg->get_autoAddToKnownHosts().get_value().toBool(),
- user, pass, cfg->get_brokerSSHKey().get_value().toString(),
+ user, password, cfg->get_brokerSSHKey().get_value().toString(),
cfg->get_defaultBrockerAutoLogin().get_value().toBool());
connect(sshConnection, SIGNAL(signalConnectionOk(QString)), this, SLOT(slotSshConnectionOk()));
connect(sshConnection, SIGNAL(signalError(int,QString)), this,
@@ -116,8 +125,8 @@ void X2GoBroker::getLoginData()
if(cfg->get_brokerSSHKey().get_value().toString().length()>0)
return;
}
- pass=QString::null;
- MessageBox::Buttons res=MessageBox::input(tr("Enter password for authentication on broker"),tr("Password:"),pass, QLineEdit::Password);
+ password=QString::null;
+ MessageBox::Buttons res=MessageBox::input(tr("Enter password for authentication on broker"),tr("Password:"),password, QLineEdit::Password);
if(res!=MessageBox::OK)
{
brokerAbort=true;
@@ -134,7 +143,7 @@ void X2GoBroker::slotGetUserSessions()
QTextStream ( &req ) <<
"task=listsessions&"<<
"user="<<user<<"&"<<
- "password="<<pass<<"&"<<
+ "password="<<password<<"&"<<
"authid="<<authId;
httpSessionAnswer.close();
httpSessionAnswer.setData ( 0,0 );
@@ -142,7 +151,7 @@ void X2GoBroker::slotGetUserSessions()
}
if(brokerType==SSH)
{
- if(!sshConnection->get_connected())
+ if(!sshConnection->isSessionConnected())
{
QTimer::singleShot(100, this, SLOT(slotGetUserSessions()));
return;
@@ -164,7 +173,7 @@ void X2GoBroker::selectProfile(Profile* profile)
"task=selectsession&"<<
"sid="<<profile->get_profileId()<<"&"<<
"user="<<user<<"&"<<
- "password="<<pass<<"&"<<
+ "password="<<password<<"&"<<
"authid="<<authId;
httpSessionAnswer.close();
httpSessionAnswer.setData ( 0,0 );
diff --git a/x2gobroker.h b/x2gobroker.h
index c1d3828..7814e2b 100644
--- a/x2gobroker.h
+++ b/x2gobroker.h
@@ -43,11 +43,12 @@ public:
virtual ~X2GoBroker();
void selectProfile(Profile* profile);
void profileSelected( bool success, QString answer, int pid, Profile* profile);
+ QString get_password();
private:
enum {SSH,HTTP} brokerType;
QString user;
- QString pass;
QString authId;
+ QString password;
QHttp* http;
QUrl url;
QBuffer httpCmdAnswer;
diff --git a/x2gosession.cpp b/x2gosession.cpp
index 6610b49..3db3356 100644
--- a/x2gosession.cpp
+++ b/x2gosession.cpp
@@ -44,8 +44,6 @@ void X2GoSession::slotStartSession()
{
status=STARTING;
emit signalStatusChanged(status);
- if(sshConnection)
- delete sshConnection;
if(X2GoApplication::instance()->get_broker())
X2GoApplication::instance()->get_broker()->selectProfile(profile);
else
@@ -54,14 +52,22 @@ void X2GoSession::slotStartSession()
}
void X2GoSession::startSession()
{
+ if(sshConnection)
+ delete sshConnection;
+ QString proxyPassword;
+ if(X2GoApplication::instance()->get_broker() && profile->get_useBrokerPassForProxy())
+ proxyPassword=X2GoApplication::instance()->get_broker()->get_password();
sshConnection=new SshConnection(this, profile->get_server(), profile->get_SSHPort(),
X2GoApplication::instance()->get_clientConfig()->get_autoAddToKnownHosts().get_value().toBool(),
profile->get_user(),
QString::null/*pass*/, profile->get_key(),profile->get_autoLogin(), false /*krblogin*/,
profile->get_proxy(), profile->get_proxyType(), profile->get_proxyHost(), profile->get_proxyPort(),
- profile->get_proxyLogin(), QString::null/*proxyPassword*/, profile->get_proxyKey(),
+ profile->get_proxyLogin(), proxyPassword, profile->get_proxyKey(),
profile->get_proxyAutoLogin());
+ sshConnection->set_proxySameLogin(profile->get_proxySameLogin());
+ sshConnection->set_proxySamePass(profile->get_proxySamePass());
+
connect(sshConnection, SIGNAL(signalConnectionOk(QString)), this, SLOT(slotSshConnectionOk(QString)));
connect(sshConnection, SIGNAL(signalError(int,QString)), this, SLOT(slotSshConnectionFailed(int,QString)));
sshConnection->start();
@@ -72,10 +78,15 @@ void X2GoSession::slotSshConnectionFailed(int, QString)
{
status=NOTRUNNING;
emit signalStatusChanged(status);
+ if(sshConnection)
+ {
+ delete sshConnection;
+ sshConnection=0;
+ }
}
void X2GoSession::slotSshConnectionOk(QString)
{
-
+ qDebug()<<"SSH Connection established";
}
hooks/post-receive
--
x2goclient2.git (X2Go Client 2 (rewrite of x2goclient.git))
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 "x2goclient2.git" (X2Go Client 2 (rewrite of x2goclient.git)).