Skip to content

Commit

Permalink
Merge pull request #493 from amnezia-vpn/bugfix/secureqsettings-deadl…
Browse files Browse the repository at this point in the history
…ock-2

now value and setValue of secureQSettings are always called in the main thread
  • Loading branch information
pokamest committed Jan 11, 2024
2 parents 7a435f7 + 645cf52 commit 77be816
Show file tree
Hide file tree
Showing 3 changed files with 67 additions and 31 deletions.
6 changes: 4 additions & 2 deletions client/secure_qsettings.h
Original file line number Diff line number Diff line change
Expand Up @@ -14,12 +14,14 @@ constexpr const char *keyChainName = "AmneziaVPN-Keychain";

class SecureQSettings : public QObject
{
Q_OBJECT

public:
explicit SecureQSettings(const QString &organization, const QString &application = QString(),
QObject *parent = nullptr);

QVariant value(const QString &key, const QVariant &defaultValue = QVariant()) const;
void setValue(const QString &key, const QVariant &value);
Q_INVOKABLE QVariant value(const QString &key, const QVariant &defaultValue = QVariant()) const;
Q_INVOKABLE void setValue(const QString &key, const QVariant &value);
void remove(const QString &key);
void sync();

Expand Down
47 changes: 39 additions & 8 deletions client/settings.cpp
Original file line number Diff line number Diff line change
@@ -1,4 +1,8 @@
#include "settings.h"

#include "QThread"
#include "QCoreApplication"

#include "utilities.h"
#include "version.h"

Expand All @@ -12,10 +16,10 @@ Settings::Settings(QObject *parent) : QObject(parent), m_settings(ORGANIZATION_N
{
// Import old settings
if (serversCount() == 0) {
QString user = m_settings.value("Server/userName").toString();
QString password = m_settings.value("Server/password").toString();
QString serverName = m_settings.value("Server/serverName").toString();
int port = m_settings.value("Server/serverPort").toInt();
QString user = value("Server/userName").toString();
QString password = value("Server/password").toString();
QString serverName = value("Server/serverName").toString();
int port = value("Server/serverPort").toInt();

if (!user.isEmpty() && !password.isEmpty() && !serverName.isEmpty()) {
QJsonObject server;
Expand Down Expand Up @@ -211,7 +215,7 @@ QString Settings::nextAvailableServerName() const

void Settings::setSaveLogs(bool enabled)
{
m_settings.setValue("Conf/saveLogs", enabled);
setValue("Conf/saveLogs", enabled);
if (!isSaveLogs()) {
Logger::deInit();
} else {
Expand All @@ -233,7 +237,7 @@ QString Settings::routeModeString(RouteMode mode) const

Settings::RouteMode Settings::routeMode() const
{
return static_cast<RouteMode>(m_settings.value("Conf/routeMode", 0).toInt());
return static_cast<RouteMode>(value("Conf/routeMode", 0).toInt());
}

bool Settings::addVpnSite(RouteMode mode, const QString &site, const QString &ip)
Expand Down Expand Up @@ -321,12 +325,12 @@ void Settings::removeAllVpnSites(RouteMode mode)

QString Settings::primaryDns() const
{
return m_settings.value("Conf/primaryDns", cloudFlareNs1).toString();
return value("Conf/primaryDns", cloudFlareNs1).toString();
}

QString Settings::secondaryDns() const
{
return m_settings.value("Conf/secondaryDns", cloudFlareNs2).toString();
return value("Conf/secondaryDns", cloudFlareNs2).toString();
}

void Settings::clearSettings()
Expand All @@ -351,3 +355,30 @@ ServerCredentials Settings::serverCredentials(int index) const

return credentials;
}

QVariant Settings::value(const QString &key, const QVariant &defaultValue) const
{
QVariant returnValue;
if (QThread::currentThread() == QCoreApplication::instance()->thread()) {
returnValue = m_settings.value(key, defaultValue);
} else {
QMetaObject::invokeMethod(&m_settings, "value",
Qt::BlockingQueuedConnection,
Q_RETURN_ARG(QVariant, returnValue),
Q_ARG(const QString&, key),
Q_ARG(const QVariant&, defaultValue));
}
return returnValue;
}

void Settings::setValue(const QString &key, const QVariant &value)
{
if (QThread::currentThread() == QCoreApplication::instance()->thread()) {
m_settings.setValue(key, value);
} else {
QMetaObject::invokeMethod(&m_settings, "setValue",
Qt::BlockingQueuedConnection,
Q_ARG(const QString&, key),
Q_ARG(const QVariant&, value));
}
}
45 changes: 24 additions & 21 deletions client/settings.h
Original file line number Diff line number Diff line change
Expand Up @@ -29,11 +29,11 @@ class Settings : public QObject

QJsonArray serversArray() const
{
return QJsonDocument::fromJson(m_settings.value("Servers/serversList").toByteArray()).array();
return QJsonDocument::fromJson(value("Servers/serversList").toByteArray()).array();
}
void setServersArray(const QJsonArray &servers)
{
m_settings.setValue("Servers/serversList", QJsonDocument(servers).toJson());
setValue("Servers/serversList", QJsonDocument(servers).toJson());
}

// Servers section
Expand All @@ -45,11 +45,11 @@ class Settings : public QObject

int defaultServerIndex() const
{
return m_settings.value("Servers/defaultServerIndex", 0).toInt();
return value("Servers/defaultServerIndex", 0).toInt();
}
void setDefaultServer(int index)
{
m_settings.setValue("Servers/defaultServerIndex", index);
setValue("Servers/defaultServerIndex", index);
}
QJsonObject defaultServer() const
{
Expand Down Expand Up @@ -78,25 +78,25 @@ class Settings : public QObject
// App settings section
bool isAutoConnect() const
{
return m_settings.value("Conf/autoConnect", false).toBool();
return value("Conf/autoConnect", false).toBool();
}
void setAutoConnect(bool enabled)
{
m_settings.setValue("Conf/autoConnect", enabled);
setValue("Conf/autoConnect", enabled);
}

bool isStartMinimized() const
{
return m_settings.value("Conf/startMinimized", false).toBool();
return value("Conf/startMinimized", false).toBool();
}
void setStartMinimized(bool enabled)
{
m_settings.setValue("Conf/startMinimized", enabled);
setValue("Conf/startMinimized", enabled);
}

bool isSaveLogs() const
{
return m_settings.value("Conf/saveLogs", false).toBool();
return value("Conf/saveLogs", false).toBool();
}
void setSaveLogs(bool enabled);

Expand All @@ -110,15 +110,15 @@ class Settings : public QObject
QString routeModeString(RouteMode mode) const;

RouteMode routeMode() const;
void setRouteMode(RouteMode mode) { m_settings.setValue("Conf/routeMode", mode); }
void setRouteMode(RouteMode mode) { setValue("Conf/routeMode", mode); }

QVariantMap vpnSites(RouteMode mode) const
{
return m_settings.value("Conf/" + routeModeString(mode)).toMap();
return value("Conf/" + routeModeString(mode)).toMap();
}
void setVpnSites(RouteMode mode, const QVariantMap &sites)
{
m_settings.setValue("Conf/" + routeModeString(mode), sites);
setValue("Conf/" + routeModeString(mode), sites);
m_settings.sync();
}
bool addVpnSite(RouteMode mode, const QString &site, const QString &ip = "");
Expand All @@ -132,11 +132,11 @@ class Settings : public QObject

bool useAmneziaDns() const
{
return m_settings.value("Conf/useAmneziaDns", true).toBool();
return value("Conf/useAmneziaDns", true).toBool();
}
void setUseAmneziaDns(bool enabled)
{
m_settings.setValue("Conf/useAmneziaDns", enabled);
setValue("Conf/useAmneziaDns", enabled);
}

QString primaryDns() const;
Expand All @@ -145,13 +145,13 @@ class Settings : public QObject
// QString primaryDns() const { return m_primaryDns; }
void setPrimaryDns(const QString &primaryDns)
{
m_settings.setValue("Conf/primaryDns", primaryDns);
setValue("Conf/primaryDns", primaryDns);
}

// QString secondaryDns() const { return m_secondaryDns; }
void setSecondaryDns(const QString &secondaryDns)
{
m_settings.setValue("Conf/secondaryDns", secondaryDns);
setValue("Conf/secondaryDns", secondaryDns);
}

static const char cloudFlareNs1[];
Expand All @@ -171,20 +171,20 @@ class Settings : public QObject

QLocale getAppLanguage()
{
return m_settings.value("Conf/appLanguage", QLocale()).toLocale();
return value("Conf/appLanguage", QLocale()).toLocale();
};
void setAppLanguage(QLocale locale)
{
m_settings.setValue("Conf/appLanguage", locale);
setValue("Conf/appLanguage", locale);
};

bool isScreenshotsEnabled() const
{
return m_settings.value("Conf/screenshotsEnabled", false).toBool();
return value("Conf/screenshotsEnabled", false).toBool();
}
void setScreenshotsEnabled(bool enabled)
{
m_settings.setValue("Conf/screenshotsEnabled", enabled);
setValue("Conf/screenshotsEnabled", enabled);
}

void clearSettings();
Expand All @@ -193,7 +193,10 @@ class Settings : public QObject
void saveLogsChanged();

private:
SecureQSettings m_settings;
QVariant value(const QString &key, const QVariant &defaultValue = QVariant()) const;
void setValue(const QString &key, const QVariant &value);

mutable SecureQSettings m_settings;
};

#endif // SETTINGS_H

0 comments on commit 77be816

Please sign in to comment.