QML-only write access for 'private/' Settings keys

This commit is contained in:
humbletim 2019-07-25 21:50:58 -04:00
parent 6ae75ecafe
commit d334a2e5e2
3 changed files with 21 additions and 3 deletions

View file

@ -3393,7 +3393,7 @@ void Application::onDesktopRootContextCreated(QQmlContext* surfaceContext) {
surfaceContext->setContextProperty("Window", DependencyManager::get<WindowScriptingInterface>().data());
surfaceContext->setContextProperty("Desktop", DependencyManager::get<DesktopScriptingInterface>().data());
surfaceContext->setContextProperty("MenuInterface", MenuScriptingInterface::getInstance());
surfaceContext->setContextProperty("Settings", SettingsScriptingInterface::getInstance());
surfaceContext->setContextProperty("Settings", new QMLSettingsScriptingInterface(surfaceContext));
surfaceContext->setContextProperty("ScriptDiscoveryService", DependencyManager::get<ScriptEngines>().data());
surfaceContext->setContextProperty("AvatarBookmarks", DependencyManager::get<AvatarBookmarks>().data());
surfaceContext->setContextProperty("LocationBookmarks", DependencyManager::get<LocationBookmarks>().data());
@ -3509,7 +3509,7 @@ void Application::setupQmlSurface(QQmlContext* surfaceContext, bool setAdditiona
surfaceContext->setContextProperty("offscreenFlags", flags);
surfaceContext->setContextProperty("AddressManager", DependencyManager::get<AddressManager>().data());
surfaceContext->setContextProperty("Settings", SettingsScriptingInterface::getInstance());
surfaceContext->setContextProperty("Settings", new QMLSettingsScriptingInterface(surfaceContext));
surfaceContext->setContextProperty("MenuInterface", MenuScriptingInterface::getInstance());
surfaceContext->setContextProperty("Performance", new PerformanceScriptingInterface());

View file

@ -11,6 +11,7 @@
#include "SettingsScriptingInterface.h"
#include <QtScript/QScriptContext>
#include <SettingHandle.h>
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());

View file

@ -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