diff --git a/libnymea-core/debugserverhandler.cpp b/libnymea-core/debugserverhandler.cpp index d6db2f8a..b89adb70 100644 --- a/libnymea-core/debugserverhandler.cpp +++ b/libnymea-core/debugserverhandler.cpp @@ -303,6 +303,35 @@ HttpReply *DebugServerHandler::processDebugRequest(const QString &requestPath, c } } + if (requestPath.startsWith("/debug/settings/mqttpolicies")) { + QString settingsFileName = NymeaSettings(NymeaSettings::SettingsRoleMqttPolicies).fileName(); + qCDebug(dcDebugServer()) << "Loading" << settingsFileName; + QFile settingsFile(settingsFileName); + if (!settingsFile.exists()) { + qCWarning(dcDebugServer()) << "Could not read file for debug download" << settingsFileName << "file does not exist."; + HttpReply *reply = RestResource::createErrorReply(HttpReply::NotFound); + reply->setHeader(HttpReply::ContentTypeHeader, "text/html"); + reply->setPayload(createErrorXmlDocument(HttpReply::NotFound, tr("Could not find file \"%1\".").arg(settingsFileName))); + return reply; + } + + if (!settingsFile.open(QFile::ReadOnly)) { + qCWarning(dcDebugServer()) << "Could not read file for debug download" << settingsFileName; + HttpReply *reply = RestResource::createErrorReply(HttpReply::Forbidden); + reply->setHeader(HttpReply::ContentTypeHeader, "text/html"); + reply->setPayload(createErrorXmlDocument(HttpReply::NotFound, tr("Could not open file \"%1\".").arg(settingsFileName))); + return reply; + } + + QByteArray settingsFileData = settingsFile.readAll(); + settingsFile.close(); + + HttpReply *reply = RestResource::createSuccessReply(); + reply->setHeader(HttpReply::ContentTypeHeader, "text/plain"); + reply->setPayload(settingsFileData); + return reply; + } + if (requestPath.startsWith("/debug/ping")) { // Only one ping process should run if (m_pingProcess || m_pingReply) @@ -1413,6 +1442,56 @@ QByteArray DebugServerHandler::createDebugXmlDocument() writer.writeEndElement(); // div show-button-column writer.writeEndElement(); // div download-row + + // Download row MQTT policies + writer.writeStartElement("div"); + writer.writeAttribute("class", "download-row"); + + writer.writeStartElement("div"); + writer.writeAttribute("class", "download-name-column"); + //: The MQTT policies download description of the debug interface + writer.writeTextElement("p", tr("MQTT policies")); + writer.writeEndElement(); // div download-name-column + + writer.writeStartElement("div"); + writer.writeAttribute("class", "download-path-column"); + writer.writeTextElement("p", NymeaSettings(NymeaSettings::SettingsRoleMqttPolicies).fileName()); + writer.writeEndElement(); // div download-path-column + + writer.writeStartElement("div"); + writer.writeAttribute("class", "download-button-column"); + writer.writeStartElement("form"); + writer.writeAttribute("class", "download-button"); + writer.writeStartElement("button"); + writer.writeAttribute("class", "button"); + writer.writeAttribute("type", "button"); + if (!QFile::exists(NymeaSettings(NymeaSettings::SettingsRoleMqttPolicies).fileName())) { + writer.writeAttribute("disabled", "true"); + } + writer.writeAttribute("onClick", "downloadFile('/debug/settings/mqttpolicies', 'mqttpolicies.conf')"); + writer.writeCharacters(tr("Download")); + writer.writeEndElement(); // button + writer.writeEndElement(); // form + writer.writeEndElement(); // div download-button-column + + writer.writeStartElement("div"); + writer.writeAttribute("class", "show-button-column"); + writer.writeStartElement("form"); + writer.writeAttribute("class", "show-button"); + writer.writeStartElement("button"); + writer.writeAttribute("class", "button"); + writer.writeAttribute("type", "button"); + if (!QFile::exists(NymeaSettings(NymeaSettings::SettingsRoleMqttPolicies).fileName())) { + writer.writeAttribute("disabled", "true"); + } + writer.writeAttribute("onClick", "showFile('/debug/settings/mqttpolicies')"); + writer.writeCharacters(tr("Show")); + writer.writeEndElement(); // button + writer.writeEndElement(); // form + writer.writeEndElement(); // div show-button-column + + writer.writeEndElement(); // div download-row + writer.writeEndElement(); // downloads-section diff --git a/libnymea-core/jsonrpc/jsontypes.cpp b/libnymea-core/jsonrpc/jsontypes.cpp index 6908be9a..cb2a5c95 100644 --- a/libnymea-core/jsonrpc/jsontypes.cpp +++ b/libnymea-core/jsonrpc/jsontypes.cpp @@ -2215,6 +2215,9 @@ QPair JsonTypes::validateBasicType(const QVariant &variant) if (variant.canConvert(QVariant::String) && QVariant(variant).convert(QVariant::String)) { return report(true, ""); } + if (variant.canConvert(QVariant::StringList) && QVariant(variant).convert(QVariant::StringList)) { + return report(true, ""); + } if (variant.canConvert(QVariant::Int) && QVariant(variant).convert(QVariant::Int)) { return report(true, ""); } diff --git a/libnymea/libnymea.pro b/libnymea/libnymea.pro index 06babd67..103901b9 100644 --- a/libnymea/libnymea.pro +++ b/libnymea/libnymea.pro @@ -72,8 +72,8 @@ HEADERS += devicemanager.h \ plugintimer.h \ hardwaremanager.h \ nymeadbusservice.h \ - network/mqtt/mqttprovider.h \ - network/mqtt/mqttchannel.h + network/mqtt/mqttprovider.h \ + network/mqtt/mqttchannel.h SOURCES += devicemanager.cpp \ loggingcategories.cpp \ @@ -131,8 +131,8 @@ SOURCES += devicemanager.cpp \ plugintimer.cpp \ hardwaremanager.cpp \ nymeadbusservice.cpp \ - network/mqtt/mqttprovider.cpp \ - network/mqtt/mqttchannel.cpp + network/mqtt/mqttprovider.cpp \ + network/mqtt/mqttchannel.cpp # install plugininfo python script for libnymea-dev