Determine which IP address to use for sshfs
Summary: There is currently an issue where the device doesn't send the correct IP address for sshfs when a VPN is present. Instead of asking the device to find and send its address, we can store it from when the device link is created then reuse it. Test Plan: All unit tests pass. In these different situations: - without a VPN - with a VPN running - with a VPN started then stopped (the tun interface might still be there) Try to remotely browse the device. It should work in all cases. Reviewers: #kde_connect, albertvaka Reviewed By: #kde_connect, albertvaka Subscribers: albertvaka, apol, nicolasfella, sredman Tags: #kde_connect Differential Revision: https://phabricator.kde.org/D6730
This commit is contained in:
parent
c864267f04
commit
25b86c6c7f
5 changed files with 29 additions and 1 deletions
|
@ -56,6 +56,9 @@ void LanDeviceLink::reset(QSslSocket* socket, ConnectionStarted connectionSource
|
||||||
|
|
||||||
mConnectionSource = connectionSource;
|
mConnectionSource = connectionSource;
|
||||||
|
|
||||||
|
QHostAddress addr = socket->peerAddress();
|
||||||
|
mHostAddress = (addr.protocol() == QAbstractSocket::IPv6Protocol) ? QHostAddress(addr.toIPv4Address()) : addr;
|
||||||
|
|
||||||
QString certString = KdeConnectConfig::instance()->getDeviceProperty(deviceId(), QStringLiteral("certificate"));
|
QString certString = KdeConnectConfig::instance()->getDeviceProperty(deviceId(), QStringLiteral("certificate"));
|
||||||
DeviceLink::setPairStatus(certString.isEmpty()? PairStatus::NotPaired : PairStatus::Paired);
|
DeviceLink::setPairStatus(certString.isEmpty()? PairStatus::NotPaired : PairStatus::Paired);
|
||||||
}
|
}
|
||||||
|
|
|
@ -54,12 +54,15 @@ public:
|
||||||
|
|
||||||
bool linkShouldBeKeptAlive() override;
|
bool linkShouldBeKeptAlive() override;
|
||||||
|
|
||||||
|
QHostAddress hostAddress() const { return mHostAddress; }
|
||||||
|
|
||||||
private Q_SLOTS:
|
private Q_SLOTS:
|
||||||
void dataReceived();
|
void dataReceived();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
SocketLineReader* mSocketLineReader;
|
SocketLineReader* mSocketLineReader;
|
||||||
ConnectionStarted mConnectionSource;
|
ConnectionStarted mConnectionSource;
|
||||||
|
QHostAddress mHostAddress;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -35,6 +35,7 @@
|
||||||
#include "kdeconnectplugin.h"
|
#include "kdeconnectplugin.h"
|
||||||
#include "pluginloader.h"
|
#include "pluginloader.h"
|
||||||
#include "backends/devicelink.h"
|
#include "backends/devicelink.h"
|
||||||
|
#include "backends/lan/landevicelink.h"
|
||||||
#include "backends/linkprovider.h"
|
#include "backends/linkprovider.h"
|
||||||
#include "networkpackage.h"
|
#include "networkpackage.h"
|
||||||
#include "kdeconnectconfig.h"
|
#include "kdeconnectconfig.h"
|
||||||
|
@ -380,6 +381,17 @@ void Device::cleanUnneededLinks() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
QHostAddress Device::getLocalIpAddress() const
|
||||||
|
{
|
||||||
|
for (DeviceLink* dl : m_deviceLinks) {
|
||||||
|
LanDeviceLink* ldl = dynamic_cast<LanDeviceLink*>(dl);
|
||||||
|
if (ldl) {
|
||||||
|
return ldl->hostAddress();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return QHostAddress::Null;
|
||||||
|
}
|
||||||
|
|
||||||
Device::DeviceType Device::str2type(const QString &deviceType) {
|
Device::DeviceType Device::str2type(const QString &deviceType) {
|
||||||
if (deviceType == QLatin1String("desktop")) return Desktop;
|
if (deviceType == QLatin1String("desktop")) return Desktop;
|
||||||
if (deviceType == QLatin1String("laptop")) return Laptop;
|
if (deviceType == QLatin1String("laptop")) return Laptop;
|
||||||
|
|
|
@ -25,6 +25,7 @@
|
||||||
#include <QString>
|
#include <QString>
|
||||||
#include <QVector>
|
#include <QVector>
|
||||||
#include <QSet>
|
#include <QSet>
|
||||||
|
#include <QHostAddress>
|
||||||
|
|
||||||
#include "networkpackage.h"
|
#include "networkpackage.h"
|
||||||
#include "backends/devicelink.h"
|
#include "backends/devicelink.h"
|
||||||
|
@ -103,6 +104,8 @@ public:
|
||||||
int protocolVersion() { return m_protocolVersion; }
|
int protocolVersion() { return m_protocolVersion; }
|
||||||
QStringList supportedPlugins() const { return m_supportedPlugins.toList(); }
|
QStringList supportedPlugins() const { return m_supportedPlugins.toList(); }
|
||||||
|
|
||||||
|
QHostAddress getLocalIpAddress() const;
|
||||||
|
|
||||||
public Q_SLOTS:
|
public Q_SLOTS:
|
||||||
///sends a @p np package to the device
|
///sends a @p np package to the device
|
||||||
///virtual for testing purposes.
|
///virtual for testing purposes.
|
||||||
|
|
|
@ -113,10 +113,17 @@ void Mounter::onPakcageReceived(const NetworkPackage& np)
|
||||||
if (np.has(QStringLiteral("multiPaths"))) path = '/';
|
if (np.has(QStringLiteral("multiPaths"))) path = '/';
|
||||||
else path = np.get<QString>(QStringLiteral("path"));
|
else path = np.get<QString>(QStringLiteral("path"));
|
||||||
|
|
||||||
|
QHostAddress addr = m_sftp->device()->getLocalIpAddress();
|
||||||
|
if (addr == QHostAddress::Null) {
|
||||||
|
qCDebug(KDECONNECT_PLUGIN_SFTP) << "Device doesn't have a LanDeviceLink, unable to get IP address";
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
QString ip = addr.toString();
|
||||||
|
|
||||||
const QStringList arguments = QStringList()
|
const QStringList arguments = QStringList()
|
||||||
<< QStringLiteral("%1@%2:%3").arg(
|
<< QStringLiteral("%1@%2:%3").arg(
|
||||||
np.get<QString>(QStringLiteral("user")),
|
np.get<QString>(QStringLiteral("user")),
|
||||||
np.get<QString>(QStringLiteral("ip")),
|
ip,
|
||||||
path)
|
path)
|
||||||
<< m_mountPoint
|
<< m_mountPoint
|
||||||
<< QStringLiteral("-p") << np.get<QString>(QStringLiteral("port"))
|
<< QStringLiteral("-p") << np.get<QString>(QStringLiteral("port"))
|
||||||
|
|
Loading…
Reference in a new issue