diff --git a/client/secure_qsettings.h b/client/secure_qsettings.h index 7421ce01..89147fc1 100644 --- a/client/secure_qsettings.h +++ b/client/secure_qsettings.h @@ -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(); diff --git a/client/settings.cpp b/client/settings.cpp index 4757dba6..f3fb57a7 100644 --- a/client/settings.cpp +++ b/client/settings.cpp @@ -1,4 +1,8 @@ #include "settings.h" + +#include "QThread" +#include "QCoreApplication" + #include "utilities.h" #include "version.h" @@ -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; @@ -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 { @@ -233,7 +237,7 @@ QString Settings::routeModeString(RouteMode mode) const Settings::RouteMode Settings::routeMode() const { - return static_cast(m_settings.value("Conf/routeMode", 0).toInt()); + return static_cast(value("Conf/routeMode", 0).toInt()); } bool Settings::addVpnSite(RouteMode mode, const QString &site, const QString &ip) @@ -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() @@ -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)); + } +} diff --git a/client/settings.h b/client/settings.h index f530f6c5..50a28dc4 100644 --- a/client/settings.h +++ b/client/settings.h @@ -29,11 +29,11 @@ public: 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 @@ -45,11 +45,11 @@ public: 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 { @@ -78,25 +78,25 @@ public: // 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); @@ -110,15 +110,15 @@ public: 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 = ""); @@ -132,11 +132,11 @@ public: 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; @@ -145,13 +145,13 @@ public: // 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[]; @@ -171,20 +171,20 @@ public: 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(); @@ -193,7 +193,10 @@ signals: 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