Make SshSettings thread safe

Change-Id: Iac07ee51574c348a22c6a966eb2113c53402b88d
Reviewed-by: hjk <hjk@qt.io>
Reviewed-by: Artem Sokolovskii <artem.sokolovskii@qt.io>
Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org>
This commit is contained in:
Jarek Kobus
2021-12-28 12:07:52 +01:00
parent f7a585fad9
commit 7a45f7f01f

View File

@@ -28,6 +28,7 @@
#include <utils/environment.h> #include <utils/environment.h>
#include <utils/hostosinfo.h> #include <utils/hostosinfo.h>
#include <QReadWriteLock>
#include <QSettings> #include <QSettings>
using namespace Utils; using namespace Utils;
@@ -44,6 +45,7 @@ struct SshSettings
FilePath askpassFilePath; FilePath askpassFilePath;
FilePath keygenFilePath; FilePath keygenFilePath;
QSsh::SshSettings::SearchPathRetriever searchPathRetriever = [] { return FilePaths(); }; QSsh::SshSettings::SearchPathRetriever searchPathRetriever = [] { return FilePaths(); };
QReadWriteLock lock;
}; };
} // namespace Internal } // namespace Internal
@@ -72,6 +74,7 @@ static QString keygenFilePathKey() { return QString("KeygenFilePath"); }
void SshSettings::loadSettings(QSettings *settings) void SshSettings::loadSettings(QSettings *settings)
{ {
QWriteLocker locker(&sshSettings->lock);
AccessSettingsGroup g(settings); AccessSettingsGroup g(settings);
QVariant value = settings->value(connectionSharingKey()); QVariant value = settings->value(connectionSharingKey());
if (value.isValid() && !HostOsInfo::isWindowsHost()) if (value.isValid() && !HostOsInfo::isWindowsHost())
@@ -89,6 +92,7 @@ void SshSettings::loadSettings(QSettings *settings)
void SshSettings::storeSettings(QSettings *settings) void SshSettings::storeSettings(QSettings *settings)
{ {
QReadLocker locker(&sshSettings->lock);
AccessSettingsGroup g(settings); AccessSettingsGroup g(settings);
settings->setValue(connectionSharingKey(), sshSettings->useConnectionSharing); settings->setValue(connectionSharingKey(), sshSettings->useConnectionSharing);
settings->setValue(connectionSharingTimeoutKey(), settings->setValue(connectionSharingTimeoutKey(),
@@ -101,19 +105,27 @@ void SshSettings::storeSettings(QSettings *settings)
void SshSettings::setConnectionSharingEnabled(bool share) void SshSettings::setConnectionSharingEnabled(bool share)
{ {
QWriteLocker locker(&sshSettings->lock);
sshSettings->useConnectionSharing = share; sshSettings->useConnectionSharing = share;
} }
bool SshSettings::connectionSharingEnabled() { return sshSettings->useConnectionSharing; } bool SshSettings::connectionSharingEnabled()
{
QReadLocker locker(&sshSettings->lock);
return sshSettings->useConnectionSharing;
}
void SshSettings::setConnectionSharingTimeout(int timeInMinutes) void SshSettings::setConnectionSharingTimeout(int timeInMinutes)
{ {
QWriteLocker locker(&sshSettings->lock);
sshSettings->connectionSharingTimeOutInMinutes = timeInMinutes; sshSettings->connectionSharingTimeOutInMinutes = timeInMinutes;
} }
int SshSettings::connectionSharingTimeout() int SshSettings::connectionSharingTimeout()
{ {
QReadLocker locker(&sshSettings->lock);
return sshSettings->connectionSharingTimeOutInMinutes; return sshSettings->connectionSharingTimeOutInMinutes;
} }
// Keep read locker locked while calling this method
static FilePath filePathValue(const FilePath &value, const QStringList &candidateFileNames) static FilePath filePathValue(const FilePath &value, const QStringList &candidateFileNames)
{ {
if (!value.isEmpty()) if (!value.isEmpty())
@@ -128,24 +140,45 @@ static FilePath filePathValue(const FilePath &value, const QStringList &candidat
return FilePath(); return FilePath();
} }
// Keep read locker locked while calling this method
static FilePath filePathValue(const FilePath &value, const QString &candidateFileName) static FilePath filePathValue(const FilePath &value, const QString &candidateFileName)
{ {
return filePathValue(value, QStringList(candidateFileName)); return filePathValue(value, QStringList(candidateFileName));
} }
void SshSettings::setSshFilePath(const FilePath &ssh) { sshSettings->sshFilePath = ssh; } void SshSettings::setSshFilePath(const FilePath &ssh)
FilePath SshSettings::sshFilePath() { return filePathValue(sshSettings->sshFilePath, "ssh"); } {
QWriteLocker locker(&sshSettings->lock);
sshSettings->sshFilePath = ssh;
}
void SshSettings::setSftpFilePath(const FilePath &sftp) { sshSettings->sftpFilePath = sftp; } FilePath SshSettings::sshFilePath()
FilePath SshSettings::sftpFilePath() { return filePathValue(sshSettings->sftpFilePath, "sftp"); } {
QReadLocker locker(&sshSettings->lock);
return filePathValue(sshSettings->sshFilePath, "ssh");
}
void SshSettings::setSftpFilePath(const FilePath &sftp)
{
QWriteLocker locker(&sshSettings->lock);
sshSettings->sftpFilePath = sftp;
}
FilePath SshSettings::sftpFilePath()
{
QReadLocker locker(&sshSettings->lock);
return filePathValue(sshSettings->sftpFilePath, "sftp");
}
void SshSettings::setAskpassFilePath(const FilePath &askPass) void SshSettings::setAskpassFilePath(const FilePath &askPass)
{ {
QWriteLocker locker(&sshSettings->lock);
sshSettings->askpassFilePath = askPass; sshSettings->askpassFilePath = askPass;
} }
FilePath SshSettings::askpassFilePath() FilePath SshSettings::askpassFilePath()
{ {
QReadLocker locker(&sshSettings->lock);
FilePath candidate; FilePath candidate;
candidate = sshSettings->askpassFilePath; candidate = sshSettings->askpassFilePath;
if (candidate.isEmpty()) if (candidate.isEmpty())
@@ -155,16 +188,19 @@ FilePath SshSettings::askpassFilePath()
void SshSettings::setKeygenFilePath(const FilePath &keygen) void SshSettings::setKeygenFilePath(const FilePath &keygen)
{ {
QWriteLocker locker(&sshSettings->lock);
sshSettings->keygenFilePath = keygen; sshSettings->keygenFilePath = keygen;
} }
FilePath SshSettings::keygenFilePath() FilePath SshSettings::keygenFilePath()
{ {
QReadLocker locker(&sshSettings->lock);
return filePathValue(sshSettings->keygenFilePath, "ssh-keygen"); return filePathValue(sshSettings->keygenFilePath, "ssh-keygen");
} }
void SshSettings::setExtraSearchPathRetriever(const SearchPathRetriever &pathRetriever) void SshSettings::setExtraSearchPathRetriever(const SearchPathRetriever &pathRetriever)
{ {
QWriteLocker locker(&sshSettings->lock);
sshSettings->searchPathRetriever = pathRetriever; sshSettings->searchPathRetriever = pathRetriever;
} }