now value and setValue of secureQSettings are always called in the main thread

This commit is contained in:
vladimir.kuznetsov 2024-01-10 23:05:22 +07:00
parent c1b6149e49
commit 645cf52803
3 changed files with 67 additions and 31 deletions

View file

@ -14,12 +14,14 @@ constexpr const char *keyChainName = "AmneziaVPN-Keychain";
class SecureQSettings : public QObject class SecureQSettings : public QObject
{ {
Q_OBJECT
public: public:
explicit SecureQSettings(const QString &organization, const QString &application = QString(), explicit SecureQSettings(const QString &organization, const QString &application = QString(),
QObject *parent = nullptr); QObject *parent = nullptr);
QVariant value(const QString &key, const QVariant &defaultValue = QVariant()) const; Q_INVOKABLE QVariant value(const QString &key, const QVariant &defaultValue = QVariant()) const;
void setValue(const QString &key, const QVariant &value); Q_INVOKABLE void setValue(const QString &key, const QVariant &value);
void remove(const QString &key); void remove(const QString &key);
void sync(); void sync();

View file

@ -1,4 +1,8 @@
#include "settings.h" #include "settings.h"
#include "QThread"
#include "QCoreApplication"
#include "utilities.h" #include "utilities.h"
#include "version.h" #include "version.h"
@ -12,10 +16,10 @@ Settings::Settings(QObject *parent) : QObject(parent), m_settings(ORGANIZATION_N
{ {
// Import old settings // Import old settings
if (serversCount() == 0) { if (serversCount() == 0) {
QString user = m_settings.value("Server/userName").toString(); QString user = value("Server/userName").toString();
QString password = m_settings.value("Server/password").toString(); QString password = value("Server/password").toString();
QString serverName = m_settings.value("Server/serverName").toString(); QString serverName = value("Server/serverName").toString();
int port = m_settings.value("Server/serverPort").toInt(); int port = value("Server/serverPort").toInt();
if (!user.isEmpty() && !password.isEmpty() && !serverName.isEmpty()) { if (!user.isEmpty() && !password.isEmpty() && !serverName.isEmpty()) {
QJsonObject server; QJsonObject server;
@ -211,7 +215,7 @@ QString Settings::nextAvailableServerName() const
void Settings::setSaveLogs(bool enabled) void Settings::setSaveLogs(bool enabled)
{ {
m_settings.setValue("Conf/saveLogs", enabled); setValue("Conf/saveLogs", enabled);
if (!isSaveLogs()) { if (!isSaveLogs()) {
Logger::deInit(); Logger::deInit();
} else { } else {
@ -233,7 +237,7 @@ QString Settings::routeModeString(RouteMode mode) const
Settings::RouteMode Settings::routeMode() 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) bool Settings::addVpnSite(RouteMode mode, const QString &site, const QString &ip)
@ -321,12 +325,12 @@ void Settings::removeAllVpnSites(RouteMode mode)
QString Settings::primaryDns() const QString Settings::primaryDns() const
{ {
return m_settings.value("Conf/primaryDns", cloudFlareNs1).toString(); return value("Conf/primaryDns", cloudFlareNs1).toString();
} }
QString Settings::secondaryDns() const QString Settings::secondaryDns() const
{ {
return m_settings.value("Conf/secondaryDns", cloudFlareNs2).toString(); return value("Conf/secondaryDns", cloudFlareNs2).toString();
} }
void Settings::clearSettings() void Settings::clearSettings()
@ -351,3 +355,30 @@ ServerCredentials Settings::serverCredentials(int index) const
return credentials; 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));
}
}

View file

@ -29,11 +29,11 @@ public:
QJsonArray serversArray() const 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) void setServersArray(const QJsonArray &servers)
{ {
m_settings.setValue("Servers/serversList", QJsonDocument(servers).toJson()); setValue("Servers/serversList", QJsonDocument(servers).toJson());
} }
// Servers section // Servers section
@ -45,11 +45,11 @@ public:
int defaultServerIndex() const int defaultServerIndex() const
{ {
return m_settings.value("Servers/defaultServerIndex", 0).toInt(); return value("Servers/defaultServerIndex", 0).toInt();
} }
void setDefaultServer(int index) void setDefaultServer(int index)
{ {
m_settings.setValue("Servers/defaultServerIndex", index); setValue("Servers/defaultServerIndex", index);
} }
QJsonObject defaultServer() const QJsonObject defaultServer() const
{ {
@ -78,25 +78,25 @@ public:
// App settings section // App settings section
bool isAutoConnect() const bool isAutoConnect() const
{ {
return m_settings.value("Conf/autoConnect", false).toBool(); return value("Conf/autoConnect", false).toBool();
} }
void setAutoConnect(bool enabled) void setAutoConnect(bool enabled)
{ {
m_settings.setValue("Conf/autoConnect", enabled); setValue("Conf/autoConnect", enabled);
} }
bool isStartMinimized() const bool isStartMinimized() const
{ {
return m_settings.value("Conf/startMinimized", false).toBool(); return value("Conf/startMinimized", false).toBool();
} }
void setStartMinimized(bool enabled) void setStartMinimized(bool enabled)
{ {
m_settings.setValue("Conf/startMinimized", enabled); setValue("Conf/startMinimized", enabled);
} }
bool isSaveLogs() const bool isSaveLogs() const
{ {
return m_settings.value("Conf/saveLogs", false).toBool(); return value("Conf/saveLogs", false).toBool();
} }
void setSaveLogs(bool enabled); void setSaveLogs(bool enabled);
@ -110,15 +110,15 @@ public:
QString routeModeString(RouteMode mode) const; QString routeModeString(RouteMode mode) const;
RouteMode routeMode() 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 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) void setVpnSites(RouteMode mode, const QVariantMap &sites)
{ {
m_settings.setValue("Conf/" + routeModeString(mode), sites); setValue("Conf/" + routeModeString(mode), sites);
m_settings.sync(); m_settings.sync();
} }
bool addVpnSite(RouteMode mode, const QString &site, const QString &ip = ""); bool addVpnSite(RouteMode mode, const QString &site, const QString &ip = "");
@ -132,11 +132,11 @@ public:
bool useAmneziaDns() const bool useAmneziaDns() const
{ {
return m_settings.value("Conf/useAmneziaDns", true).toBool(); return value("Conf/useAmneziaDns", true).toBool();
} }
void setUseAmneziaDns(bool enabled) void setUseAmneziaDns(bool enabled)
{ {
m_settings.setValue("Conf/useAmneziaDns", enabled); setValue("Conf/useAmneziaDns", enabled);
} }
QString primaryDns() const; QString primaryDns() const;
@ -145,13 +145,13 @@ public:
// QString primaryDns() const { return m_primaryDns; } // QString primaryDns() const { return m_primaryDns; }
void setPrimaryDns(const QString &primaryDns) void setPrimaryDns(const QString &primaryDns)
{ {
m_settings.setValue("Conf/primaryDns", primaryDns); setValue("Conf/primaryDns", primaryDns);
} }
// QString secondaryDns() const { return m_secondaryDns; } // QString secondaryDns() const { return m_secondaryDns; }
void setSecondaryDns(const QString &secondaryDns) void setSecondaryDns(const QString &secondaryDns)
{ {
m_settings.setValue("Conf/secondaryDns", secondaryDns); setValue("Conf/secondaryDns", secondaryDns);
} }
static const char cloudFlareNs1[]; static const char cloudFlareNs1[];
@ -171,20 +171,20 @@ public:
QLocale getAppLanguage() QLocale getAppLanguage()
{ {
return m_settings.value("Conf/appLanguage", QLocale()).toLocale(); return value("Conf/appLanguage", QLocale()).toLocale();
}; };
void setAppLanguage(QLocale locale) void setAppLanguage(QLocale locale)
{ {
m_settings.setValue("Conf/appLanguage", locale); setValue("Conf/appLanguage", locale);
}; };
bool isScreenshotsEnabled() const bool isScreenshotsEnabled() const
{ {
return m_settings.value("Conf/screenshotsEnabled", false).toBool(); return value("Conf/screenshotsEnabled", false).toBool();
} }
void setScreenshotsEnabled(bool enabled) void setScreenshotsEnabled(bool enabled)
{ {
m_settings.setValue("Conf/screenshotsEnabled", enabled); setValue("Conf/screenshotsEnabled", enabled);
} }
void clearSettings(); void clearSettings();
@ -193,7 +193,10 @@ signals:
void saveLogsChanged(); void saveLogsChanged();
private: 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 #endif // SETTINGS_H