32 lines
1.7 KiB
C++
32 lines
1.7 KiB
C++
#include "terminal_policy.h"
|
|
#include <QJsonDocument>
|
|
#include <QSaveFile>
|
|
#include <cmath>
|
|
namespace vdi {
|
|
QString applyTerminalPolicy(const QJsonObject& config, const QString& path,
|
|
const std::function<void(int,int,int)>& 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 {};
|
|
}
|
|
}
|