#include "terminal_policy.h" #include #include #include namespace vdi { QString applyTerminalPolicy(const QJsonObject& config, const QString& path, const std::function& apply) { auto integer=[&config](const char* key,int min,int max) { const auto v=config.value(key); return v.isDouble() && std::isfinite(v.toDouble()) && std::floor(v.toDouble())==v.toDouble() && v.toDouble()>=min && v.toDouble()<=max; }; if (!integer("policyProtocol",1,1) || !integer("configVersion",1,2147483647) || !integer("heartbeatInterval",15,60) || !integer("commandPollInterval",3,30) || !integer("desktopRefreshInterval",5,120) || !config.value("deploymentId").isString() || config.value("deploymentId").toString().size()>100 || (config.value("deploymentId").toString().isEmpty() != (config.value("configVersion").toInt()==1))) return QStringLiteral("invalid_policy"); if (!apply) return QStringLiteral("runtime_unavailable"); QJsonObject safe; for (const auto* key:{"policyProtocol","configVersion","deploymentId","heartbeatInterval","commandPollInterval","desktopRefreshInterval"}) safe[key]=config.value(key); QSaveFile file(path); if (!file.open(QIODevice::WriteOnly) || !file.setPermissions(QFileDevice::ReadOwner|QFileDevice::WriteOwner)) return QStringLiteral("persist_failed"); const auto bytes=QJsonDocument(safe).toJson(); if (file.write(bytes)!=bytes.size() || !file.commit()) return QStringLiteral("persist_failed"); apply(config.value("heartbeatInterval").toInt(),config.value("commandPollInterval").toInt(),config.value("desktopRefreshInterval").toInt()); return {}; } }