vdi-cloud/terminal/kiosk-shell/src/terminal_policy.cpp

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