aboutsummaryrefslogtreecommitdiffstats
path: root/src/libs/ssh
diff options
context:
space:
mode:
authorChristian Kandeler <christian.kandeler@theqtcompany.com>2015-04-14 15:47:55 +0200
committerChristian Kandeler <christian.kandeler@theqtcompany.com>2015-04-15 13:06:29 +0000
commitbde83c30bf051425af6c19a417ad8c87bac68345 (patch)
tree64dc45f3b3f12ac82ae2b66a2f0d6ec5473e518e /src/libs/ssh
parentaee5668b623eb9040378ddd20a3ebed118fc7cd5 (diff)
SSH: Fix TCP/IP forwarding support.
We hardcoded the remote host to the SSH server for some reason, and the originating port was bogus as well. Change-Id: I8f6700bc12f4374302dd3bfc035c9c9f060f56ef Reviewed-by: Caspar Romot <cro@icd.ee> Reviewed-by: Christian Kandeler <christian.kandeler@theqtcompany.com>
Diffstat (limited to 'src/libs/ssh')
-rw-r--r--src/libs/ssh/sshchannelmanager.cpp8
-rw-r--r--src/libs/ssh/sshchannelmanager_p.h5
-rw-r--r--src/libs/ssh/sshconnection.cpp10
-rw-r--r--src/libs/ssh/sshconnection.h3
-rw-r--r--src/libs/ssh/sshconnection_p.h3
-rw-r--r--src/libs/ssh/sshdirecttcpiptunnel.cpp24
-rw-r--r--src/libs/ssh/sshdirecttcpiptunnel.h6
-rw-r--r--src/libs/ssh/sshdirecttcpiptunnel_p.h11
8 files changed, 39 insertions, 31 deletions
diff --git a/src/libs/ssh/sshchannelmanager.cpp b/src/libs/ssh/sshchannelmanager.cpp
index 50d20518be5..2a198a43fb8 100644
--- a/src/libs/ssh/sshchannelmanager.cpp
+++ b/src/libs/ssh/sshchannelmanager.cpp
@@ -170,11 +170,11 @@ QSsh::SftpChannel::Ptr SshChannelManager::createSftpChannel()
return sftp;
}
-SshDirectTcpIpTunnel::Ptr SshChannelManager::createTunnel(quint16 remotePort,
- const SshConnectionInfo &connectionInfo)
+SshDirectTcpIpTunnel::Ptr SshChannelManager::createTunnel(const QString &originatingHost,
+ quint16 originatingPort, const QString &remoteHost, quint16 remotePort)
{
- SshDirectTcpIpTunnel::Ptr tunnel(new SshDirectTcpIpTunnel(m_nextLocalChannelId++, remotePort,
- connectionInfo, m_sendFacility));
+ SshDirectTcpIpTunnel::Ptr tunnel(new SshDirectTcpIpTunnel(m_nextLocalChannelId++,
+ originatingHost, originatingPort, remoteHost, remotePort, m_sendFacility));
insertChannel(tunnel->d, tunnel);
return tunnel;
}
diff --git a/src/libs/ssh/sshchannelmanager_p.h b/src/libs/ssh/sshchannelmanager_p.h
index 636fa218cde..0763e3f7a07 100644
--- a/src/libs/ssh/sshchannelmanager_p.h
+++ b/src/libs/ssh/sshchannelmanager_p.h
@@ -37,7 +37,6 @@
namespace QSsh {
class SftpChannel;
-class SshConnectionInfo;
class SshDirectTcpIpTunnel;
class SshRemoteProcess;
@@ -56,8 +55,8 @@ public:
QSharedPointer<SshRemoteProcess> createRemoteProcess(const QByteArray &command);
QSharedPointer<SshRemoteProcess> createRemoteShell();
QSharedPointer<SftpChannel> createSftpChannel();
- QSharedPointer<SshDirectTcpIpTunnel> createTunnel(quint16 remotePort,
- const SshConnectionInfo &connectionInfo);
+ QSharedPointer<SshDirectTcpIpTunnel> createTunnel(const QString &originatingHost,
+ quint16 originatingPort, const QString &remoteHost, quint16 remotePort);
int channelCount() const;
enum CloseAllMode { CloseAllRegular, CloseAllAndReset };
diff --git a/src/libs/ssh/sshconnection.cpp b/src/libs/ssh/sshconnection.cpp
index d86cc562e2f..9a3cd8eb2f0 100644
--- a/src/libs/ssh/sshconnection.cpp
+++ b/src/libs/ssh/sshconnection.cpp
@@ -184,10 +184,11 @@ QSharedPointer<SftpChannel> SshConnection::createSftpChannel()
return d->createSftpChannel();
}
-SshDirectTcpIpTunnel::Ptr SshConnection::createTunnel(quint16 remotePort)
+SshDirectTcpIpTunnel::Ptr SshConnection::createTunnel(const QString &originatingHost,
+ quint16 originatingPort, const QString &remoteHost, quint16 remotePort)
{
QSSH_ASSERT_AND_RETURN_VALUE(state() == Connected, SshDirectTcpIpTunnel::Ptr());
- return d->createTunnel(remotePort);
+ return d->createTunnel(originatingHost, originatingPort, remoteHost, remotePort);
}
int SshConnection::closeAllChannels()
@@ -828,9 +829,10 @@ QSharedPointer<SftpChannel> SshConnectionPrivate::createSftpChannel()
return m_channelManager->createSftpChannel();
}
-SshDirectTcpIpTunnel::Ptr SshConnectionPrivate::createTunnel(quint16 remotePort)
+SshDirectTcpIpTunnel::Ptr SshConnectionPrivate::createTunnel(const QString &originatingHost,
+ quint16 originatingPort, const QString &remoteHost, quint16 remotePort)
{
- return m_channelManager->createTunnel(remotePort, m_conn->connectionInfo());
+ return m_channelManager->createTunnel(originatingHost, originatingPort, remoteHost, remotePort);
}
const quint64 SshConnectionPrivate::InvalidSeqNr = static_cast<quint64>(-1);
diff --git a/src/libs/ssh/sshconnection.h b/src/libs/ssh/sshconnection.h
index db08eb34336..3d8f355eff6 100644
--- a/src/libs/ssh/sshconnection.h
+++ b/src/libs/ssh/sshconnection.h
@@ -127,7 +127,8 @@ public:
QSharedPointer<SshRemoteProcess> createRemoteProcess(const QByteArray &command);
QSharedPointer<SshRemoteProcess> createRemoteShell();
QSharedPointer<SftpChannel> createSftpChannel();
- QSharedPointer<SshDirectTcpIpTunnel> createTunnel(quint16 remotePort);
+ QSharedPointer<SshDirectTcpIpTunnel> createTunnel(const QString &originatingHost,
+ quint16 originatingPort, const QString &remoteHost, quint16 remotePort);
// -1 if an error occurred, number of channels closed otherwise.
int closeAllChannels();
diff --git a/src/libs/ssh/sshconnection_p.h b/src/libs/ssh/sshconnection_p.h
index 31c20fbc997..8e73df838a6 100644
--- a/src/libs/ssh/sshconnection_p.h
+++ b/src/libs/ssh/sshconnection_p.h
@@ -89,7 +89,8 @@ public:
QSharedPointer<SshRemoteProcess> createRemoteProcess(const QByteArray &command);
QSharedPointer<SshRemoteProcess> createRemoteShell();
QSharedPointer<SftpChannel> createSftpChannel();
- QSharedPointer<SshDirectTcpIpTunnel> createTunnel(quint16 remotePort);
+ QSharedPointer<SshDirectTcpIpTunnel> createTunnel(const QString &originatingHost,
+ quint16 originatingPort, const QString &remoteHost, quint16 remotePort);
SshStateInternal state() const { return m_state; }
SshError error() const { return m_error; }
diff --git a/src/libs/ssh/sshdirecttcpiptunnel.cpp b/src/libs/ssh/sshdirecttcpiptunnel.cpp
index 57277233e29..8f7be398476 100644
--- a/src/libs/ssh/sshdirecttcpiptunnel.cpp
+++ b/src/libs/ssh/sshdirecttcpiptunnel.cpp
@@ -38,11 +38,14 @@
namespace QSsh {
namespace Internal {
-SshDirectTcpIpTunnelPrivate::SshDirectTcpIpTunnelPrivate(quint32 channelId, quint16 remotePort,
- const SshConnectionInfo &connectionInfo, SshSendFacility &sendFacility)
+SshDirectTcpIpTunnelPrivate::SshDirectTcpIpTunnelPrivate(quint32 channelId,
+ const QString &originatingHost, quint16 originatingPort, const QString &remoteHost,
+ quint16 remotePort, SshSendFacility &sendFacility)
: AbstractSshChannel(channelId, sendFacility),
- m_remotePort(remotePort),
- m_connectionInfo(connectionInfo)
+ m_originatingHost(originatingHost),
+ m_originatingPort(originatingPort),
+ m_remoteHost(remoteHost),
+ m_remotePort(remotePort)
{
connect(this, SIGNAL(eof()), SLOT(handleEof()));
}
@@ -112,9 +115,11 @@ void SshDirectTcpIpTunnelPrivate::handleEof()
using namespace Internal;
-SshDirectTcpIpTunnel::SshDirectTcpIpTunnel(quint32 channelId, quint16 remotePort,
- const SshConnectionInfo &connectionInfo, SshSendFacility &sendFacility)
- : d(new SshDirectTcpIpTunnelPrivate(channelId, remotePort, connectionInfo, sendFacility))
+SshDirectTcpIpTunnel::SshDirectTcpIpTunnel(quint32 channelId, const QString &originatingHost,
+ quint16 originatingPort, const QString &remoteHost, quint16 remotePort,
+ SshSendFacility &sendFacility)
+ : d(new SshDirectTcpIpTunnelPrivate(channelId, originatingHost, originatingPort, remoteHost,
+ remotePort, sendFacility))
{
connect(d, SIGNAL(initialized()), SIGNAL(initialized()), Qt::QueuedConnection);
connect(d, SIGNAL(readyRead()), SIGNAL(readyRead()), Qt::QueuedConnection);
@@ -156,9 +161,8 @@ void SshDirectTcpIpTunnel::initialize()
try {
QIODevice::open(QIODevice::ReadWrite);
d->m_sendFacility.sendDirectTcpIpPacket(d->localChannelId(), d->initialWindowSize(),
- d->maxPacketSize(), d->m_connectionInfo.peerAddress.toString().toUtf8(),
- d->m_remotePort, d->m_connectionInfo.localAddress.toString().toUtf8(),
- d->m_connectionInfo.localPort);
+ d->maxPacketSize(), d->m_remoteHost.toUtf8(), d->m_remotePort,
+ d->m_originatingHost.toUtf8(), d->m_originatingPort);
d->setChannelState(AbstractSshChannel::SessionRequested);
d->m_timeoutTimer.start(d->ReplyTimeout);
} catch (const Botan::Exception &e) { // Won't happen, but let's play it safe.
diff --git a/src/libs/ssh/sshdirecttcpiptunnel.h b/src/libs/ssh/sshdirecttcpiptunnel.h
index 4ee86d66e60..5c3f5e1c1cc 100644
--- a/src/libs/ssh/sshdirecttcpiptunnel.h
+++ b/src/libs/ssh/sshdirecttcpiptunnel.h
@@ -37,7 +37,6 @@
#include <QSharedPointer>
namespace QSsh {
-class SshConnectionInfo;
namespace Internal {
class SshChannelManager;
@@ -71,8 +70,9 @@ signals:
void tunnelClosed();
private:
- SshDirectTcpIpTunnel(quint32 channelId, quint16 remotePort,
- const SshConnectionInfo &connectionInfo, Internal::SshSendFacility &sendFacility);
+ SshDirectTcpIpTunnel(quint32 channelId, const QString &originatingHost,
+ quint16 originatingPort, const QString &remoteHost, quint16 remotePort,
+ Internal::SshSendFacility &sendFacility);
// QIODevice stuff
qint64 readData(char *data, qint64 maxlen);
diff --git a/src/libs/ssh/sshdirecttcpiptunnel_p.h b/src/libs/ssh/sshdirecttcpiptunnel_p.h
index bf77097e60d..17e9162d1e5 100644
--- a/src/libs/ssh/sshdirecttcpiptunnel_p.h
+++ b/src/libs/ssh/sshdirecttcpiptunnel_p.h
@@ -32,8 +32,6 @@
#include "sshchannel_p.h"
-#include "sshconnection.h"
-
namespace QSsh {
class SshDirectTcpIpTunnel;
@@ -46,8 +44,9 @@ class SshDirectTcpIpTunnelPrivate : public AbstractSshChannel
friend class QSsh::SshDirectTcpIpTunnel;
public:
- explicit SshDirectTcpIpTunnelPrivate(quint32 channelId, quint16 remotePort,
- const SshConnectionInfo &connectionInfo, SshSendFacility &sendFacility);
+ explicit SshDirectTcpIpTunnelPrivate(quint32 channelId, const QString &originatingHost,
+ quint16 originatingPort, const QString &remoteHost, quint16 remotePort,
+ SshSendFacility &sendFacility);
signals:
void initialized();
@@ -71,8 +70,10 @@ private:
void closeHook();
+ const QString m_originatingHost;
+ const quint16 m_originatingPort;
+ const QString m_remoteHost;
const quint16 m_remotePort;
- const SshConnectionInfo m_connectionInfo;
QByteArray m_data;
};