diff options
author | Christian Kandeler <christian.kandeler@theqtcompany.com> | 2015-04-14 15:47:55 +0200 |
---|---|---|
committer | Christian Kandeler <christian.kandeler@theqtcompany.com> | 2015-04-15 13:06:29 +0000 |
commit | bde83c30bf051425af6c19a417ad8c87bac68345 (patch) | |
tree | 64dc45f3b3f12ac82ae2b66a2f0d6ec5473e518e /src/libs/ssh | |
parent | aee5668b623eb9040378ddd20a3ebed118fc7cd5 (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.cpp | 8 | ||||
-rw-r--r-- | src/libs/ssh/sshchannelmanager_p.h | 5 | ||||
-rw-r--r-- | src/libs/ssh/sshconnection.cpp | 10 | ||||
-rw-r--r-- | src/libs/ssh/sshconnection.h | 3 | ||||
-rw-r--r-- | src/libs/ssh/sshconnection_p.h | 3 | ||||
-rw-r--r-- | src/libs/ssh/sshdirecttcpiptunnel.cpp | 24 | ||||
-rw-r--r-- | src/libs/ssh/sshdirecttcpiptunnel.h | 6 | ||||
-rw-r--r-- | src/libs/ssh/sshdirecttcpiptunnel_p.h | 11 |
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; }; |