From d334a2e5e2b1b808b5622a14d46eabd0dba278c4 Mon Sep 17 00:00:00 2001 From: humbletim Date: Thu, 25 Jul 2019 21:50:58 -0400 Subject: [PATCH] QML-only write access for 'private/' Settings keys --- interface/src/Application.cpp | 4 ++-- .../src/scripting/SettingsScriptingInterface.cpp | 9 +++++++++ interface/src/scripting/SettingsScriptingInterface.h | 11 ++++++++++- 3 files changed, 21 insertions(+), 3 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 0b56b2a4d7..a20d6dd440 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -3393,7 +3393,7 @@ void Application::onDesktopRootContextCreated(QQmlContext* surfaceContext) { surfaceContext->setContextProperty("Window", DependencyManager::get().data()); surfaceContext->setContextProperty("Desktop", DependencyManager::get().data()); surfaceContext->setContextProperty("MenuInterface", MenuScriptingInterface::getInstance()); - surfaceContext->setContextProperty("Settings", SettingsScriptingInterface::getInstance()); + surfaceContext->setContextProperty("Settings", new QMLSettingsScriptingInterface(surfaceContext)); surfaceContext->setContextProperty("ScriptDiscoveryService", DependencyManager::get().data()); surfaceContext->setContextProperty("AvatarBookmarks", DependencyManager::get().data()); surfaceContext->setContextProperty("LocationBookmarks", DependencyManager::get().data()); @@ -3509,7 +3509,7 @@ void Application::setupQmlSurface(QQmlContext* surfaceContext, bool setAdditiona surfaceContext->setContextProperty("offscreenFlags", flags); surfaceContext->setContextProperty("AddressManager", DependencyManager::get().data()); - surfaceContext->setContextProperty("Settings", SettingsScriptingInterface::getInstance()); + surfaceContext->setContextProperty("Settings", new QMLSettingsScriptingInterface(surfaceContext)); surfaceContext->setContextProperty("MenuInterface", MenuScriptingInterface::getInstance()); surfaceContext->setContextProperty("Performance", new PerformanceScriptingInterface()); diff --git a/interface/src/scripting/SettingsScriptingInterface.cpp b/interface/src/scripting/SettingsScriptingInterface.cpp index afafe1a350..a118f9cf4f 100644 --- a/interface/src/scripting/SettingsScriptingInterface.cpp +++ b/interface/src/scripting/SettingsScriptingInterface.cpp @@ -11,6 +11,7 @@ #include "SettingsScriptingInterface.h" +#include #include SettingsScriptingInterface* SettingsScriptingInterface::getInstance() { @@ -35,6 +36,14 @@ QVariant SettingsScriptingInterface::getValue(const QString& setting, const QVar } void SettingsScriptingInterface::setValue(const QString& setting, const QVariant& value) { + if (setting.startsWith("private/")) { + if (_restrictPrivateValues) { + qWarning() << "SettingsScriptingInterface::setValue -- restricted write: " << setting << value; + return; + } else { + qInfo() << "SettingsScriptingInterface::setValue -- allowing restricted write: " << setting << value; + } + } // Make a deep-copy of the string. // Dangling pointers can occur with QStrings that are implicitly shared from a QScriptEngine. QString deepCopy = QString::fromUtf16(setting.utf16()); diff --git a/interface/src/scripting/SettingsScriptingInterface.h b/interface/src/scripting/SettingsScriptingInterface.h index 25a8b627cb..633405dcc6 100644 --- a/interface/src/scripting/SettingsScriptingInterface.h +++ b/interface/src/scripting/SettingsScriptingInterface.h @@ -27,7 +27,6 @@ class SettingsScriptingInterface : public QObject { Q_OBJECT - SettingsScriptingInterface() { }; public: static SettingsScriptingInterface* getInstance(); @@ -64,6 +63,16 @@ public slots: * print("Value: " + (typeof value) + " " + JSON.stringify(value)); // object {"x":0,"y":10,"z":0} */ void setValue(const QString& setting, const QVariant& value); + +protected: + SettingsScriptingInterface(QObject* parent = nullptr) : QObject(parent) { }; + bool _restrictPrivateValues { true }; +}; + +class QMLSettingsScriptingInterface : public SettingsScriptingInterface { + Q_OBJECT +public: + QMLSettingsScriptingInterface(QObject* parent) : SettingsScriptingInterface(parent) { _restrictPrivateValues = false; } }; #endif // hifi_SettingsScriptingInterface_h