From 8eff3b1e83b11b31f0ca25817bbbd9dd07229717 Mon Sep 17 00:00:00 2001 From: howard-stearns Date: Tue, 24 Jan 2017 16:14:41 -0800 Subject: [PATCH] restructure initialization so that server can do server-like things to get the filter program from file --- assignment-client/src/entities/EntityServer.cpp | 8 ++++---- assignment-client/src/entities/EntityServer.h | 3 +++ libraries/entities/src/EntityTree.cpp | 10 +++++----- libraries/entities/src/EntityTree.h | 10 ++++------ 4 files changed, 16 insertions(+), 15 deletions(-) diff --git a/assignment-client/src/entities/EntityServer.cpp b/assignment-client/src/entities/EntityServer.cpp index e5c22c3d34..84d9b198ea 100644 --- a/assignment-client/src/entities/EntityServer.cpp +++ b/assignment-client/src/entities/EntityServer.cpp @@ -286,11 +286,11 @@ void EntityServer::readAdditionalConfiguration(const QJsonObject& settingsSectio tree->setEntityScriptSourceWhitelist(""); } - QString entityEditFilter; - if (readOptionString("entityEditFilter", settingsSectionObject, entityEditFilter)) { - tree->setEntityEditFilter(entityEditFilter); + if (readOptionString("entityEditFilter", settingsSectionObject, _entityEditFilter)) { + // FIXME: Fetch script from file synchronously. We don't want the server processing edits while a restarting entity server is fetching from a DOS'd source. + _entityEditFilterEngine.evaluate(_entityEditFilter); + tree->initEntityEditFilterEngine(&_entityEditFilterEngine); } - tree->initEntityEditFilterEngine(); // whether supplied or not. } void EntityServer::nodeAdded(SharedNodePointer node) { diff --git a/assignment-client/src/entities/EntityServer.h b/assignment-client/src/entities/EntityServer.h index 0486a97ede..469ac21dd9 100644 --- a/assignment-client/src/entities/EntityServer.h +++ b/assignment-client/src/entities/EntityServer.h @@ -76,6 +76,9 @@ private: QReadWriteLock _viewerSendingStatsLock; QMap> _viewerSendingStats; + + QString _entityEditFilter; + QScriptEngine _entityEditFilterEngine; }; #endif // hifi_EntityServer_h diff --git a/libraries/entities/src/EntityTree.cpp b/libraries/entities/src/EntityTree.cpp index 9d5d14402d..b4d209033f 100644 --- a/libraries/entities/src/EntityTree.cpp +++ b/libraries/entities/src/EntityTree.cpp @@ -918,15 +918,15 @@ void EntityTree::fixupTerseEditLogging(EntityItemProperties& properties, QListglobalObject(); _entityEditFilterFunction = global.property("filter"); _hasEntityEditFilter = _entityEditFilterFunction.isFunction(); } bool EntityTree::filterProperties(EntityItemProperties& propertiesIn, EntityItemProperties& propertiesOut, bool& wasChanged) { - if (!_hasEntityEditFilter) { + if (!_hasEntityEditFilter || !_entityEditFilterEngine) { propertiesOut = propertiesIn; wasChanged = false; // not changed return true; // allowed @@ -934,7 +934,7 @@ bool EntityTree::filterProperties(EntityItemProperties& propertiesIn, EntityItem auto oldProperties = propertiesIn.getDesiredProperties(); auto specifiedProperties = propertiesIn.getChangedProperties(); propertiesIn.setDesiredProperties(specifiedProperties); - QScriptValue inputValues = propertiesIn.copyToScriptValue(&_entityEditFilterEngine, false, true, true); + QScriptValue inputValues = propertiesIn.copyToScriptValue(_entityEditFilterEngine, false, true, true); propertiesIn.setDesiredProperties(oldProperties); auto in = QJsonValue::fromVariant(inputValues.toVariant()); // grab json copy now, because the inputValues might be side effected by the filter. diff --git a/libraries/entities/src/EntityTree.h b/libraries/entities/src/EntityTree.h index 29c51560fa..a643c481cc 100644 --- a/libraries/entities/src/EntityTree.h +++ b/libraries/entities/src/EntityTree.h @@ -65,7 +65,6 @@ public: void setEntityMaxTmpLifetime(float maxTmpEntityLifetime) { _maxTmpEntityLifetime = maxTmpEntityLifetime; } void setEntityScriptSourceWhitelist(const QString& entityScriptSourceWhitelist); - void setEntityEditFilter(const QString& entityEditFilter) { _entityEditFilter = entityEditFilter; } /// Implements our type specific root element factory virtual OctreeElementPointer createNewElement(unsigned char* octalCode = NULL) override; @@ -263,7 +262,7 @@ public: void notifyNewCollisionSoundURL(const QString& newCollisionSoundURL, const EntityItemID& entityID); - void initEntityEditFilterEngine(); + void initEntityEditFilterEngine(QScriptEngine* engine); static const float DEFAULT_MAX_TMP_ENTITY_LIFETIME; @@ -353,11 +352,10 @@ protected: float _maxTmpEntityLifetime { DEFAULT_MAX_TMP_ENTITY_LIFETIME }; bool filterProperties(EntityItemProperties& propertiesIn, EntityItemProperties& propertiesOut, bool& wasChanged); - QString _entityEditFilter; bool _hasEntityEditFilter{ false }; - QScriptEngine _entityEditFilterEngine; - QScriptValue _entityEditFilterFunction; - QScriptValue _nullObjectForFilter; + QScriptEngine* _entityEditFilterEngine{}; + QScriptValue _entityEditFilterFunction{}; + QScriptValue _nullObjectForFilter{}; QStringList _entityScriptSourceWhitelist; };