restructure initialization so that server can do server-like things to get

the filter program from file
This commit is contained in:
howard-stearns 2017-01-24 16:14:41 -08:00
parent c25072c1db
commit 8eff3b1e83
4 changed files with 16 additions and 15 deletions
assignment-client/src/entities
libraries/entities/src

View file

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

View file

@ -76,6 +76,9 @@ private:
QReadWriteLock _viewerSendingStatsLock;
QMap<QUuid, QMap<QUuid, ViewerSendingStats>> _viewerSendingStats;
QString _entityEditFilter;
QScriptEngine _entityEditFilterEngine;
};
#endif // hifi_EntityServer_h

View file

@ -918,15 +918,15 @@ void EntityTree::fixupTerseEditLogging(EntityItemProperties& properties, QList<Q
}
}
void EntityTree::initEntityEditFilterEngine() {
_entityEditFilterEngine.evaluate(_entityEditFilter);
auto global = _entityEditFilterEngine.globalObject();
void EntityTree::initEntityEditFilterEngine(QScriptEngine* engine) {
_entityEditFilterEngine = engine;
auto global = _entityEditFilterEngine->globalObject();
_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.

View file

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