various changes, idk, added a whitelist filter to ent script filter
Showing the changes to libraries/script-engine/src/ScriptEngine.cpp (1 of 7 files). Show all
Unified · Split
| @@ -252,7 +252,7 @@ QString ScriptEngine::getContext() const { · 251 unmodified lines | ||
| 252 | 252 | return "unknown"; |
| 253 | 253 | } |
| 254 | 254 | |
| 255 | −bool ScriptEngine::isDebugMode() const { | |
| 255 | +bool ScriptEngine::isDebugMode() const { | |
| 256 | 256 | #if defined(DEBUG) |
| 257 | 257 | return true; |
| 258 | 258 | #else |
| @@ -769,6 +769,11 @@ void ScriptEngine::init() { · 510 unmodified lines | ||
| 769 | 769 | #if DEV_BUILD || PR_BUILD |
| 770 | 770 | registerGlobalObject("StackTest", new StackTestScriptingInterface(this)); |
| 771 | 771 | #endif |
| 772 | + | |
| 773 | + globalObject().setProperty("KALILA", "isWaifu"); | |
| 774 | + globalObject().setProperty("Kute", newFunction([](QScriptContext* context, QScriptEngine* engine) -> QScriptValue { | |
| 775 | + return context->argument(0).toString().toLower() == "kalila" ? true : false; | |
| 776 | + })); | |
| 772 | 777 | } |
| 773 | 778 | |
| 774 | 779 | void ScriptEngine::registerValue(const QString& valueName, QScriptValue value) { |
| @@ -2252,6 +2257,7 @@ void ScriptEngine::entityScriptContentAvailable(const EntityItemID& entityID, co · 1477 unmodified lines | ||
| 2252 | 2257 | BaseScriptEngine sandbox; |
| 2253 | 2258 | sandbox.setProcessEventsInterval(SANDBOX_TIMEOUT); |
| 2254 | 2259 | QScriptValue testConstructor, exception; |
| 2260 | + if (atoi(getenv("UNSAFE_ENTITY_SCRIPTS") ? getenv("UNSAFE_ENTITY_SCRIPTS") : "0")) | |
| 2255 | 2261 | { |
| 2256 | 2262 | QTimer timeout; |
| 2257 | 2263 | timeout.setSingleShot(true); |
| @@ -2274,13 +2280,57 @@ void ScriptEngine::entityScriptContentAvailable(const EntityItemID& entityID, co · 16 unmodified lines | ||
| 2274 | 2280 | exception = testConstructor; |
| 2275 | 2281 | } |
| 2276 | 2282 | } |
| 2283 | + else { | |
| 2284 | + // IF YOU FUCK UP, DELETE FROM HERE TO... | |
| 2285 | + QList<QString> safeURLS = { "https://animedeck.com/", "http://animedeck.com/" }; | |
| 2286 | + safeURLS += qEnvironmentVariable("EXTRA_WHITELIST").split(QRegExp("\\s*,\\s*"), QString::SkipEmptyParts); | |
| 2287 | + | |
| 2288 | + bool isInWhitelist = false; // assume unsafe | |
| 2289 | + for (const auto& str : safeURLS) { | |
| 2290 | + // qDebug() << "CHECKING" << entityID.toString() << scriptOrURL << "AGAINST" << str; | |
| 2291 | + qDebug() << "SCRIPTOURL STARTSWITH" << scriptOrURL << "TESTING AGAINST" << str << "RESULTS IN" | |
| 2292 | + << scriptOrURL.startsWith(str); | |
| 2293 | + if (scriptOrURL.startsWith(str)) { | |
| 2294 | + isInWhitelist = true; | |
| 2295 | + break; // bail early since we found a match | |
| 2296 | + } | |
| 2297 | + } | |
| 2298 | + if (!isInWhitelist) { | |
| 2299 | + qDebug() << "(disabled entity script)" << entityID.toString() << scriptOrURL; | |
| 2300 | + exception = makeError("UNSAFE_ENTITY_SCRIPTS == 0"); | |
| 2301 | + } else { | |
| 2302 | + QTimer timeout; | |
| 2303 | + timeout.setSingleShot(true); | |
| 2304 | + timeout.start(SANDBOX_TIMEOUT); | |
| 2305 | + connect(&timeout, &QTimer::timeout, [=, &sandbox] { | |
| 2306 | + qCDebug(scriptengine) << "ScriptEngine::entityScriptContentAvailable timeout"; | |
| 2307 | + | |
| 2308 | + // Guard against infinite loops and non-performant code | |
| 2309 | + sandbox.raiseException( | |
| 2310 | + sandbox.makeError(QString("Timed out (entity constructors are limited to %1ms)").arg(SANDBOX_TIMEOUT))); | |
| 2311 | + }); | |
| 2312 | + | |
| 2313 | + testConstructor = sandbox.evaluate(program); | |
| 2314 | + | |
| 2315 | + if (sandbox.hasUncaughtException()) { | |
| 2316 | + exception = sandbox.cloneUncaughtException(QString("(preflight %1)").arg(entityID.toString())); | |
| 2317 | + sandbox.clearExceptions(); | |
| 2318 | + } else if (testConstructor.isError()) { | |
| 2319 | + exception = testConstructor; | |
| 2320 | + } | |
| 2321 | + } | |
| 2322 | + // DELETE UP TO HERE, THEN UNCOMMENT BELOW. | |
| 2323 | + | |
| 2324 | + // qDebug() << "(disabled entity script)" << entityID.toString() << scriptOrURL; | |
| 2325 | + // exception = makeError("UNSAFE_ENTITY_SCRIPTS == 0"); | |
| 2326 | + } | |
| 2277 | 2327 | |
| 2278 | 2328 | if (exception.isError()) { |
| 2279 | − // create a local copy using makeError to decouple from the sandbox engine | |
| 2280 | − exception = makeError(exception); | |
| 2281 | − setError(formatException(exception, _enableExtendedJSExceptions.get()), EntityScriptStatus::ERROR_RUNNING_SCRIPT); | |
| 2282 | − emit unhandledException(exception); | |
| 2283 | − return; | |
| 2329 | + // create a local copy using makeError to decouple from the sandbox engine | |
| 2330 | + exception = makeError(exception); | |
| 2331 | + setError(formatException(exception, _enableExtendedJSExceptions.get()), EntityScriptStatus::ERROR_RUNNING_SCRIPT); | |
| 2332 | + emit unhandledException(exception); | |
| 2333 | + return; | |
| 2284 | 2334 | } |
| 2285 | 2335 | |
| 2286 | 2336 | // CONSTRUCTOR VIABILITY |
| @@ -2648,4 +2698,3 @@ void ScriptEngine::callEntityScriptMethod(const EntityItemID& entityID, const QS · 361 unmodified lines | ||
| 2648 | 2698 | } |
| 2649 | 2699 | } |
| 2650 | 2700 | } |
| 2651 | − | |