From 7c264e7d852e58d52e389bf15a630c5f2757c956 Mon Sep 17 00:00:00 2001 From: Kasen IO Date: Mon, 15 Jun 2020 22:51:51 -0400 Subject: [PATCH 01/15] First pass at adding domain metadata exporter. --- .../resources/describe-settings.json | 26 +++++++++++++++- .../resources/metadata_exporter/index.html | 14 +++++++++ domain-server/src/DomainMetadata.cpp | 19 ++++++++++++ domain-server/src/DomainMetadata.h | 4 +++ domain-server/src/DomainServer.cpp | 31 +++++++++++++++++-- domain-server/src/DomainServer.h | 4 ++- libraries/networking/src/DomainHandler.h | 9 +++++- 7 files changed, 101 insertions(+), 6 deletions(-) create mode 100644 domain-server/resources/metadata_exporter/index.html diff --git a/domain-server/resources/describe-settings.json b/domain-server/resources/describe-settings.json index 284dd344e7..6dd8e64981 100644 --- a/domain-server/resources/describe-settings.json +++ b/domain-server/resources/describe-settings.json @@ -54,7 +54,23 @@ "default": true, "type": "checkbox", "advanced": true - } + }, + { + "name": "enable_metadata_exporter", + "label": "Enable Metadata HTTP Availability", + "help": "Allows your domain's metadata to be accessible on the public internet via direct HTTP connection to the domain server.", + "default": true, + "type": "checkbox", + "advanced": true + }, + { + "name": "metadata_exporter_port", + "label": "Metadata Exporter HTTP Port", + "help": "This is the port where the Metaverse exporter accepts connections. It listens both on IPv4 and IPv6 and can be accessed remotely, so you should make sure to restrict access with a firewall as needed.", + "default": "9704", + "type": "int", + "advanced": true + }, ] }, { @@ -210,6 +226,14 @@ "help": "Must match the password entered above for change to be saved.", "value-hidden": true }, + { + "name": "approved_safe_urls", + "label": "Approved Script and QML URLs", + "help": "These URLs will be sent to the Interface as safe URLs to allow through the whitelist if the Interface has this security option enabled.", + "placeholder": "0", + "default": "1", + "advanced": false + }, { "name": "maximum_user_capacity", "label": "Maximum User Capacity", diff --git a/domain-server/resources/metadata_exporter/index.html b/domain-server/resources/metadata_exporter/index.html new file mode 100644 index 0000000000..acc7aae23a --- /dev/null +++ b/domain-server/resources/metadata_exporter/index.html @@ -0,0 +1,14 @@ + + + Vircadia Metadata exporter + + + +

Vircadia Metadata exporter

+ +

If you can see this page, this means that your domain's metadata is available to be exported.

+

+ Metadata +

+ + diff --git a/domain-server/src/DomainMetadata.cpp b/domain-server/src/DomainMetadata.cpp index 2540858742..26dbc16184 100644 --- a/domain-server/src/DomainMetadata.cpp +++ b/domain-server/src/DomainMetadata.cpp @@ -4,6 +4,7 @@ // // Created by Zach Pomerantz on 5/25/2016. // Copyright 2016 High Fidelity, Inc. +// Copyright 2020 Vircadia contributors. // // Distributed under the Apache License, Version 2.0. // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html @@ -14,10 +15,13 @@ #include #include #include +#include #include "DomainServer.h" #include "DomainServerNodeData.h" +Q_LOGGING_CATEGORY(domain_metadata_exporter, "hifi.domain_server.metadata_exporter") + const QString DomainMetadata::USERS = "users"; const QString DomainMetadata::Users::NUM_TOTAL = "num_users"; const QString DomainMetadata::Users::NUM_ANON = "num_anon_users"; @@ -215,3 +219,18 @@ void DomainMetadata::sendDescriptors() { #endif } } + +bool DomainMetadata::handleHTTPRequest(HTTPConnection* connection, const QUrl& url, bool skipSubHandler) { + const QString URI_METADATA = "/metadata"; + const QString EXPORTER_MIME_TYPE = "text/plain"; + + qCDebug(domain_metadata_exporter) << "Request on URL " << url; + + if (url.path() == URI_METADATA) { + QString domainMetadataJSON = QString("{\"domain\":%1}").arg(QString(QJsonDocument(get(DESCRIPTORS)).toJson(QJsonDocument::Compact))); + connection->respond(HTTPConnection::StatusCode200, domainMetadataJSON.toUtf8(), qPrintable(EXPORTER_MIME_TYPE)); + return true; + } + + return false; +} diff --git a/domain-server/src/DomainMetadata.h b/domain-server/src/DomainMetadata.h index ed4e324464..85422692b9 100644 --- a/domain-server/src/DomainMetadata.h +++ b/domain-server/src/DomainMetadata.h @@ -15,6 +15,7 @@ #include #include +#include "HTTPManager.h" class DomainMetadata : public QObject { Q_OBJECT @@ -43,6 +44,9 @@ public: DomainMetadata(QObject* domainServer); DomainMetadata() = delete; + + bool handleHTTPRequest(HTTPConnection* connection, const QUrl& url, bool skipSubHandler = false) override; + bool handleHTTPSRequest(HTTPSConnection* connection, const QUrl& url, bool skipSubHandler = false) override; // Get cached metadata QJsonObject get(); diff --git a/domain-server/src/DomainServer.cpp b/domain-server/src/DomainServer.cpp index 49b319e31d..1f7df37fc6 100644 --- a/domain-server/src/DomainServer.cpp +++ b/domain-server/src/DomainServer.cpp @@ -70,7 +70,6 @@ const QString DomainServer::REPLACEMENT_FILE_EXTENSION = ".replace"; const int MIN_PORT = 1; const int MAX_PORT = 65535; - int const DomainServer::EXIT_CODE_REBOOT = 234923; #if USE_STABLE_GLOBAL_SERVICES @@ -334,6 +333,7 @@ DomainServer::DomainServer(int argc, char* argv[]) : _nodePingMonitorTimer->start(NODE_PING_MONITOR_INTERVAL_MSECS); initializeExporter(); + initializeMetadataExporter(); } void DomainServer::parseCommandLine(int argc, char* argv[]) { @@ -427,6 +427,11 @@ DomainServer::~DomainServer() { _contentManager->aboutToFinish(); _contentManager->terminate(); } + + if (_httpMetadataExporterManager) { + _httpMetadataExporterManager->close(); + delete _httpMetadataExporterManager; + } if (_httpExporterManager) { _httpExporterManager->close(); @@ -3045,8 +3050,7 @@ void DomainServer::updateUpstreamNodes() { updateReplicationNodes(Upstream); } -void DomainServer::initializeExporter() -{ +void DomainServer::initializeExporter() { static const QString ENABLE_EXPORTER = "monitoring.enable_prometheus_exporter"; static const QString EXPORTER_PORT = "monitoring.prometheus_exporter_port"; @@ -3066,6 +3070,27 @@ void DomainServer::initializeExporter() } } +void DomainServer::initializeMetadataExporter() +{ + static const QString ENABLE_EXPORTER = "metaverse.enable_metadata_exporter"; + static const QString EXPORTER_PORT = "metaverse.metadata_exporter_port"; + + bool isMetadataExporterEnabled = _settingsManager.valueOrDefaultValueForKeyPath(ENABLE_EXPORTER).toBool(); + int metadataExporterPort = _settingsManager.valueOrDefaultValueForKeyPath(EXPORTER_PORT).toInt(); + + if (exporterPort < MIN_PORT || exporterPort > MAX_PORT) { + qCWarning(domain_server) << "Metadata exporter port " << metadataExporterPort << " is out of range."; + isMetadataExporterEnabled = false; + } + + qCDebug(domain_server) << "Setting up Metadata exporter."; + + if (isMetadataExporterEnabled && !_httpMetadataExporterManager) { + qCInfo(domain_server) << "Starting Metadata exporter on port " << metadataExporterPort; + _httpMetadataExporterManager = new HTTPManager(QHostAddress::Any, (quint16)metadataExporterPort, QString("%1/resources/metadata_exporter/").arg(QCoreApplication::applicationDirPath()), &_metadata); + } +} + void DomainServer::updateReplicatedNodes() { // Make sure we have downstream nodes in our list static const QString REPLICATED_USERS_KEY = "users"; diff --git a/domain-server/src/DomainServer.h b/domain-server/src/DomainServer.h index 7c0fa5fb15..0334404863 100644 --- a/domain-server/src/DomainServer.h +++ b/domain-server/src/DomainServer.h @@ -73,7 +73,6 @@ public: static int const EXIT_CODE_REBOOT; bool handleHTTPRequest(HTTPConnection* connection, const QUrl& url, bool skipSubHandler = false) override; - bool handleHTTPSRequest(HTTPSConnection* connection, const QUrl& url, bool skipSubHandler = false) override; static const QString REPLACEMENT_FILE_EXTENSION; @@ -140,6 +139,7 @@ private slots: void updateDownstreamNodes(); void updateUpstreamNodes(); void initializeExporter(); + void initializeMetadataExporter(); void tokenGrantFinished(); void profileRequestFinished(); @@ -240,6 +240,8 @@ private: HTTPManager _httpManager; HTTPManager* _httpExporterManager { nullptr }; + HTTPManager* _httpMetadataExporterManager; + std::unique_ptr _httpsManager; QHash _allAssignments; diff --git a/libraries/networking/src/DomainHandler.h b/libraries/networking/src/DomainHandler.h index 178c56c34a..50ebc1edbc 100644 --- a/libraries/networking/src/DomainHandler.h +++ b/libraries/networking/src/DomainHandler.h @@ -72,7 +72,14 @@ const quint16 DOMAIN_SERVER_EXPORTER_PORT = .value("VIRCADIA_DOMAIN_SERVER_EXPORTER_PORT") .toUInt() : 9703; - + +const quint16 DOMAIN_SERVER_METADATA_EXPORTER_PORT = + QProcessEnvironment::systemEnvironment() + .contains("DOMAIN_SERVER_METADATA_EXPORTER_PORT") + ? QProcessEnvironment::systemEnvironment() + .value("DOMAIN_SERVER_METADATA_EXPORTER_PORT") + .toUInt() + : 9704; const int MAX_SILENT_DOMAIN_SERVER_CHECK_INS = 5; From 269f0ac6002cd0933d9b9973285b3449982fcb31 Mon Sep 17 00:00:00 2001 From: Kasen IO Date: Mon, 15 Jun 2020 23:49:54 -0400 Subject: [PATCH 02/15] Latest condition. --- domain-server/src/DomainMetadata.cpp | 5 +++-- domain-server/src/DomainMetadata.h | 7 ++++--- domain-server/src/DomainServer.cpp | 7 +++---- domain-server/src/DomainServer.h | 2 ++ 4 files changed, 12 insertions(+), 9 deletions(-) diff --git a/domain-server/src/DomainMetadata.cpp b/domain-server/src/DomainMetadata.cpp index 26dbc16184..f9f79d0846 100644 --- a/domain-server/src/DomainMetadata.cpp +++ b/domain-server/src/DomainMetadata.cpp @@ -10,6 +10,7 @@ // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html #include "DomainMetadata.h" +#include "HTTPConnection.h" #include #include @@ -220,14 +221,14 @@ void DomainMetadata::sendDescriptors() { } } -bool DomainMetadata::handleHTTPRequest(HTTPConnection* connection, const QUrl& url, bool skipSubHandler) { +bool DomainMetadataExporter::handleHTTPRequest(HTTPConnection* connection, const QUrl& url, bool skipSubHandler) { + QString domainMetadataJSON = QString("{\"domain\":%1}").arg(QString(QJsonDocument(get(DESCRIPTORS)).toJson(QJsonDocument::Compact))); const QString URI_METADATA = "/metadata"; const QString EXPORTER_MIME_TYPE = "text/plain"; qCDebug(domain_metadata_exporter) << "Request on URL " << url; if (url.path() == URI_METADATA) { - QString domainMetadataJSON = QString("{\"domain\":%1}").arg(QString(QJsonDocument(get(DESCRIPTORS)).toJson(QJsonDocument::Compact))); connection->respond(HTTPConnection::StatusCode200, domainMetadataJSON.toUtf8(), qPrintable(EXPORTER_MIME_TYPE)); return true; } diff --git a/domain-server/src/DomainMetadata.h b/domain-server/src/DomainMetadata.h index 85422692b9..eade025a0a 100644 --- a/domain-server/src/DomainMetadata.h +++ b/domain-server/src/DomainMetadata.h @@ -17,6 +17,10 @@ #include #include "HTTPManager.h" +class DomainMetadataExporter : public HTTPRequestHandler { + bool handleHTTPRequest(HTTPConnection* connection, const QUrl& url, bool skipSubHandler = false); +}; + class DomainMetadata : public QObject { Q_OBJECT @@ -45,9 +49,6 @@ public: DomainMetadata(QObject* domainServer); DomainMetadata() = delete; - bool handleHTTPRequest(HTTPConnection* connection, const QUrl& url, bool skipSubHandler = false) override; - bool handleHTTPSRequest(HTTPSConnection* connection, const QUrl& url, bool skipSubHandler = false) override; - // Get cached metadata QJsonObject get(); QJsonObject get(const QString& group); diff --git a/domain-server/src/DomainServer.cpp b/domain-server/src/DomainServer.cpp index 1f7df37fc6..d244fc99c6 100644 --- a/domain-server/src/DomainServer.cpp +++ b/domain-server/src/DomainServer.cpp @@ -3070,15 +3070,14 @@ void DomainServer::initializeExporter() { } } -void DomainServer::initializeMetadataExporter() -{ +void DomainServer::initializeMetadataExporter() { static const QString ENABLE_EXPORTER = "metaverse.enable_metadata_exporter"; static const QString EXPORTER_PORT = "metaverse.metadata_exporter_port"; bool isMetadataExporterEnabled = _settingsManager.valueOrDefaultValueForKeyPath(ENABLE_EXPORTER).toBool(); int metadataExporterPort = _settingsManager.valueOrDefaultValueForKeyPath(EXPORTER_PORT).toInt(); - if (exporterPort < MIN_PORT || exporterPort > MAX_PORT) { + if (metadataExporterPort < MIN_PORT || metadataExporterPort > MAX_PORT) { qCWarning(domain_server) << "Metadata exporter port " << metadataExporterPort << " is out of range."; isMetadataExporterEnabled = false; } @@ -3087,7 +3086,7 @@ void DomainServer::initializeMetadataExporter() if (isMetadataExporterEnabled && !_httpMetadataExporterManager) { qCInfo(domain_server) << "Starting Metadata exporter on port " << metadataExporterPort; - _httpMetadataExporterManager = new HTTPManager(QHostAddress::Any, (quint16)metadataExporterPort, QString("%1/resources/metadata_exporter/").arg(QCoreApplication::applicationDirPath()), &_metadata); + _httpMetadataExporterManager = new HTTPManager(QHostAddress::Any, (quint16)metadataExporterPort, QString("%1/resources/metadata_exporter/").arg(QCoreApplication::applicationDirPath()), &_metadataExporter); } } diff --git a/domain-server/src/DomainServer.h b/domain-server/src/DomainServer.h index 0334404863..34555861af 100644 --- a/domain-server/src/DomainServer.h +++ b/domain-server/src/DomainServer.h @@ -73,6 +73,7 @@ public: static int const EXIT_CODE_REBOOT; bool handleHTTPRequest(HTTPConnection* connection, const QUrl& url, bool skipSubHandler = false) override; + bool handleHTTPSRequest(HTTPSConnection* connection, const QUrl& url, bool skipSubHandler = false) override; static const QString REPLACEMENT_FILE_EXTENSION; @@ -237,6 +238,7 @@ private: DomainGatekeeper _gatekeeper; DomainServerExporter _exporter; + DomainMetadata _metadataExporter; HTTPManager _httpManager; HTTPManager* _httpExporterManager { nullptr }; From 19ff5bfd4f6ffa817bf64e0f477b247f50a630d7 Mon Sep 17 00:00:00 2001 From: Kasen IO Date: Tue, 16 Jun 2020 00:53:06 -0400 Subject: [PATCH 03/15] uno error. --- domain-server/src/DomainMetadata.cpp | 2 +- domain-server/src/DomainMetadata.h | 8 +++----- domain-server/src/DomainServer.h | 2 +- 3 files changed, 5 insertions(+), 7 deletions(-) diff --git a/domain-server/src/DomainMetadata.cpp b/domain-server/src/DomainMetadata.cpp index f9f79d0846..b920ab022b 100644 --- a/domain-server/src/DomainMetadata.cpp +++ b/domain-server/src/DomainMetadata.cpp @@ -221,7 +221,7 @@ void DomainMetadata::sendDescriptors() { } } -bool DomainMetadataExporter::handleHTTPRequest(HTTPConnection* connection, const QUrl& url, bool skipSubHandler) { +bool DomainMetadata::handleHTTPRequest(HTTPConnection* connection, const QUrl& url, bool skipSubHandler) { QString domainMetadataJSON = QString("{\"domain\":%1}").arg(QString(QJsonDocument(get(DESCRIPTORS)).toJson(QJsonDocument::Compact))); const QString URI_METADATA = "/metadata"; const QString EXPORTER_MIME_TYPE = "text/plain"; diff --git a/domain-server/src/DomainMetadata.h b/domain-server/src/DomainMetadata.h index eade025a0a..4c4f8ecf3c 100644 --- a/domain-server/src/DomainMetadata.h +++ b/domain-server/src/DomainMetadata.h @@ -17,11 +17,7 @@ #include #include "HTTPManager.h" -class DomainMetadataExporter : public HTTPRequestHandler { - bool handleHTTPRequest(HTTPConnection* connection, const QUrl& url, bool skipSubHandler = false); -}; - -class DomainMetadata : public QObject { +class DomainMetadata : public QObject, public HTTPRequestHandler { Q_OBJECT public: @@ -53,6 +49,8 @@ public: QJsonObject get(); QJsonObject get(const QString& group); + bool handleHTTPRequest(HTTPConnection* connection, const QUrl& url, bool skipSubHandler = false); + public slots: void descriptorsChanged(); void securityChanged(bool send); diff --git a/domain-server/src/DomainServer.h b/domain-server/src/DomainServer.h index 34555861af..a4a47f5f46 100644 --- a/domain-server/src/DomainServer.h +++ b/domain-server/src/DomainServer.h @@ -242,7 +242,7 @@ private: HTTPManager _httpManager; HTTPManager* _httpExporterManager { nullptr }; - HTTPManager* _httpMetadataExporterManager; + HTTPManager* _httpMetadataExporterManager { nullptr }; std::unique_ptr _httpsManager; From 8052259489d3a3df6af899f4397d058f70ea2b50 Mon Sep 17 00:00:00 2001 From: HifiExperiments Date: Wed, 17 Jun 2020 17:47:50 -0700 Subject: [PATCH 04/15] get domainmetadata stuff compiling --- domain-server/src/DomainMetadata.cpp | 13 +------------ domain-server/src/DomainMetadata.h | 5 ++--- domain-server/src/DomainServer.cpp | 11 +++++++++-- domain-server/src/DomainServer.h | 1 - 4 files changed, 12 insertions(+), 18 deletions(-) diff --git a/domain-server/src/DomainMetadata.cpp b/domain-server/src/DomainMetadata.cpp index b920ab022b..262d4ea0f1 100644 --- a/domain-server/src/DomainMetadata.cpp +++ b/domain-server/src/DomainMetadata.cpp @@ -54,22 +54,11 @@ const QString DomainMetadata::Descriptors::TAGS = "tags"; // // it is meant to be sent to and consumed by an external API -DomainMetadata::DomainMetadata(QObject* domainServer) : QObject(domainServer) { +DomainMetadata::DomainMetadata() { // set up the structure necessary for casting during parsing _metadata[USERS] = QVariantMap {}; _metadata[DESCRIPTORS] = QVariantMap {}; - assert(dynamic_cast(domainServer)); - DomainServer* server = static_cast(domainServer); - - // update the metadata when a user (dis)connects - connect(server, &DomainServer::userConnected, this, &DomainMetadata::usersChanged); - connect(server, &DomainServer::userDisconnected, this, &DomainMetadata::usersChanged); - - // update the metadata when security changes - connect(&server->_settingsManager, &DomainServerSettingsManager::updateNodePermissions, - this, static_cast(&DomainMetadata::securityChanged)); - // initialize the descriptors securityChanged(false); descriptorsChanged(); diff --git a/domain-server/src/DomainMetadata.h b/domain-server/src/DomainMetadata.h index 4c4f8ecf3c..ba6b1b88a6 100644 --- a/domain-server/src/DomainMetadata.h +++ b/domain-server/src/DomainMetadata.h @@ -42,8 +42,8 @@ public: static const QString TAGS; }; - DomainMetadata(QObject* domainServer); - DomainMetadata() = delete; + DomainMetadata(); + ~DomainMetadata() = default; // Get cached metadata QJsonObject get(); @@ -54,7 +54,6 @@ public: public slots: void descriptorsChanged(); void securityChanged(bool send); - void securityChanged() { securityChanged(true); } void usersChanged(); protected: diff --git a/domain-server/src/DomainServer.cpp b/domain-server/src/DomainServer.cpp index d244fc99c6..7ff0459f21 100644 --- a/domain-server/src/DomainServer.cpp +++ b/domain-server/src/DomainServer.cpp @@ -268,10 +268,17 @@ DomainServer::DomainServer(int argc, char* argv[]) : } // send signal to DomainMetadata when descriptors changed - _metadata = new DomainMetadata(this); + _metadata = new DomainMetadata(); connect(&_settingsManager, &DomainServerSettingsManager::settingsUpdated, _metadata, &DomainMetadata::descriptorsChanged); + // update the metadata when a user (dis)connects + connect(this, &DomainServer::userConnected, _metadata, &DomainMetadata::usersChanged); + connect(this, &DomainServer::userDisconnected, _metadata, &DomainMetadata::usersChanged); + + // update the metadata when security changes + connect(&_settingsManager, &DomainServerSettingsManager::updateNodePermissions, [this] { _metadata->securityChanged(true); }); + qDebug() << "domain-server is running"; static const QString AC_SUBNET_WHITELIST_SETTING_PATH = "security.ac_subnet_whitelist"; @@ -3086,7 +3093,7 @@ void DomainServer::initializeMetadataExporter() { if (isMetadataExporterEnabled && !_httpMetadataExporterManager) { qCInfo(domain_server) << "Starting Metadata exporter on port " << metadataExporterPort; - _httpMetadataExporterManager = new HTTPManager(QHostAddress::Any, (quint16)metadataExporterPort, QString("%1/resources/metadata_exporter/").arg(QCoreApplication::applicationDirPath()), &_metadataExporter); + _httpMetadataExporterManager = new HTTPManager(QHostAddress::Any, (quint16)metadataExporterPort, QString("%1/resources/metadata_exporter/").arg(QCoreApplication::applicationDirPath()), _metadata); } } diff --git a/domain-server/src/DomainServer.h b/domain-server/src/DomainServer.h index a4a47f5f46..c27500d5ce 100644 --- a/domain-server/src/DomainServer.h +++ b/domain-server/src/DomainServer.h @@ -238,7 +238,6 @@ private: DomainGatekeeper _gatekeeper; DomainServerExporter _exporter; - DomainMetadata _metadataExporter; HTTPManager _httpManager; HTTPManager* _httpExporterManager { nullptr }; From 1da1dd20c383cbf28a53360b1a6301403e3285a4 Mon Sep 17 00:00:00 2001 From: HifiExperiments Date: Wed, 17 Jun 2020 20:18:05 -0700 Subject: [PATCH 05/15] try to fix crash --- domain-server/src/DomainMetadata.cpp | 2 +- domain-server/src/DomainMetadata.h | 2 +- domain-server/src/DomainServer.cpp | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/domain-server/src/DomainMetadata.cpp b/domain-server/src/DomainMetadata.cpp index 262d4ea0f1..755f3ec148 100644 --- a/domain-server/src/DomainMetadata.cpp +++ b/domain-server/src/DomainMetadata.cpp @@ -54,7 +54,7 @@ const QString DomainMetadata::Descriptors::TAGS = "tags"; // // it is meant to be sent to and consumed by an external API -DomainMetadata::DomainMetadata() { +DomainMetadata::DomainMetadata(QObject* domainServer) : QObject(domainServer) { // set up the structure necessary for casting during parsing _metadata[USERS] = QVariantMap {}; _metadata[DESCRIPTORS] = QVariantMap {}; diff --git a/domain-server/src/DomainMetadata.h b/domain-server/src/DomainMetadata.h index ba6b1b88a6..6fae29248d 100644 --- a/domain-server/src/DomainMetadata.h +++ b/domain-server/src/DomainMetadata.h @@ -42,7 +42,7 @@ public: static const QString TAGS; }; - DomainMetadata(); + DomainMetadata(QObject* domainServer); ~DomainMetadata() = default; // Get cached metadata diff --git a/domain-server/src/DomainServer.cpp b/domain-server/src/DomainServer.cpp index 7ff0459f21..3f70d95421 100644 --- a/domain-server/src/DomainServer.cpp +++ b/domain-server/src/DomainServer.cpp @@ -268,7 +268,7 @@ DomainServer::DomainServer(int argc, char* argv[]) : } // send signal to DomainMetadata when descriptors changed - _metadata = new DomainMetadata(); + _metadata = new DomainMetadata(this); connect(&_settingsManager, &DomainServerSettingsManager::settingsUpdated, _metadata, &DomainMetadata::descriptorsChanged); From f712fc7735b7861851e0180463fd18203d669661 Mon Sep 17 00:00:00 2001 From: Kasen IO Date: Thu, 18 Jun 2020 16:43:59 -0400 Subject: [PATCH 06/15] Export to JSON, JSON formatting. --- domain-server/resources/describe-settings.json | 16 ++++++++-------- domain-server/src/DomainMetadata.cpp | 2 +- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/domain-server/resources/describe-settings.json b/domain-server/resources/describe-settings.json index 6dd8e64981..be40611f14 100644 --- a/domain-server/resources/describe-settings.json +++ b/domain-server/resources/describe-settings.json @@ -54,7 +54,7 @@ "default": true, "type": "checkbox", "advanced": true - }, + }, { "name": "enable_metadata_exporter", "label": "Enable Metadata HTTP Availability", @@ -64,13 +64,13 @@ "advanced": true }, { - "name": "metadata_exporter_port", - "label": "Metadata Exporter HTTP Port", - "help": "This is the port where the Metaverse exporter accepts connections. It listens both on IPv4 and IPv6 and can be accessed remotely, so you should make sure to restrict access with a firewall as needed.", - "default": "9704", - "type": "int", - "advanced": true - }, + "name": "metadata_exporter_port", + "label": "Metadata Exporter HTTP Port", + "help": "This is the port where the Metaverse exporter accepts connections. It listens both on IPv4 and IPv6 and can be accessed remotely, so you should make sure to restrict access with a firewall as needed.", + "default": "9704", + "type": "int", + "advanced": true + } ] }, { diff --git a/domain-server/src/DomainMetadata.cpp b/domain-server/src/DomainMetadata.cpp index 755f3ec148..e30cefa1db 100644 --- a/domain-server/src/DomainMetadata.cpp +++ b/domain-server/src/DomainMetadata.cpp @@ -213,7 +213,7 @@ void DomainMetadata::sendDescriptors() { bool DomainMetadata::handleHTTPRequest(HTTPConnection* connection, const QUrl& url, bool skipSubHandler) { QString domainMetadataJSON = QString("{\"domain\":%1}").arg(QString(QJsonDocument(get(DESCRIPTORS)).toJson(QJsonDocument::Compact))); const QString URI_METADATA = "/metadata"; - const QString EXPORTER_MIME_TYPE = "text/plain"; + const QString EXPORTER_MIME_TYPE = "application/json"; qCDebug(domain_metadata_exporter) << "Request on URL " << url; From f1d731da11655f1b64b2950608e90d9c012afb5b Mon Sep 17 00:00:00 2001 From: Kasen IO Date: Tue, 30 Jun 2020 00:25:27 -0400 Subject: [PATCH 07/15] Add users to the export. --- domain-server/src/DomainMetadata.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/domain-server/src/DomainMetadata.cpp b/domain-server/src/DomainMetadata.cpp index e30cefa1db..f8d8d2d989 100644 --- a/domain-server/src/DomainMetadata.cpp +++ b/domain-server/src/DomainMetadata.cpp @@ -211,7 +211,10 @@ void DomainMetadata::sendDescriptors() { } bool DomainMetadata::handleHTTPRequest(HTTPConnection* connection, const QUrl& url, bool skipSubHandler) { - QString domainMetadataJSON = QString("{\"domain\":%1}").arg(QString(QJsonDocument(get(DESCRIPTORS)).toJson(QJsonDocument::Compact))); + QJsonArray metadataArray; + metadataArray << get(DESCRIPTORS); + metadataArray << get(USERS); + QString domainMetadataJSON = QString("{\"domain\":%1}").arg(QString(QJsonDocument(metadataArray).toJson(QJsonDocument::Compact))); const QString URI_METADATA = "/metadata"; const QString EXPORTER_MIME_TYPE = "application/json"; From 1c545dffca5355bbc8f04524fe000bc4d5cf9967 Mon Sep 17 00:00:00 2001 From: kasenvr <52365539+kasenvr@users.noreply.github.com> Date: Mon, 20 Jul 2020 14:25:52 -0400 Subject: [PATCH 08/15] Apply suggestions from code review Co-authored-by: David Rowe --- domain-server/resources/metadata_exporter/index.html | 4 ++-- domain-server/src/DomainMetadata.h | 3 +-- domain-server/src/DomainServer.cpp | 4 ++-- 3 files changed, 5 insertions(+), 6 deletions(-) diff --git a/domain-server/resources/metadata_exporter/index.html b/domain-server/resources/metadata_exporter/index.html index acc7aae23a..c75cc711e8 100644 --- a/domain-server/resources/metadata_exporter/index.html +++ b/domain-server/resources/metadata_exporter/index.html @@ -1,10 +1,10 @@ - Vircadia Metadata exporter + Vircadia Metadata Exporter -

Vircadia Metadata exporter

+

Vircadia Metadata Exporter

If you can see this page, this means that your domain's metadata is available to be exported.

diff --git a/domain-server/src/DomainMetadata.h b/domain-server/src/DomainMetadata.h index 6fae29248d..70f17348df 100644 --- a/domain-server/src/DomainMetadata.h +++ b/domain-server/src/DomainMetadata.h @@ -44,12 +44,11 @@ public: DomainMetadata(QObject* domainServer); ~DomainMetadata() = default; - // Get cached metadata QJsonObject get(); QJsonObject get(const QString& group); - bool handleHTTPRequest(HTTPConnection* connection, const QUrl& url, bool skipSubHandler = false); + bool handleHTTPRequest(HTTPConnection* connection, const QUrl& url, bool skipSubHandler = false) override; public slots: void descriptorsChanged(); diff --git a/domain-server/src/DomainServer.cpp b/domain-server/src/DomainServer.cpp index 1d61449897..bad9c96e6b 100644 --- a/domain-server/src/DomainServer.cpp +++ b/domain-server/src/DomainServer.cpp @@ -3079,14 +3079,14 @@ void DomainServer::initializeMetadataExporter() { int metadataExporterPort = _settingsManager.valueOrDefaultValueForKeyPath(EXPORTER_PORT).toInt(); if (metadataExporterPort < MIN_PORT || metadataExporterPort > MAX_PORT) { - qCWarning(domain_server) << "Metadata exporter port " << metadataExporterPort << " is out of range."; + qCWarning(domain_server) << "Metadata exporter port" << metadataExporterPort << "is out of range."; isMetadataExporterEnabled = false; } qCDebug(domain_server) << "Setting up Metadata exporter."; if (isMetadataExporterEnabled && !_httpMetadataExporterManager) { - qCInfo(domain_server) << "Starting Metadata exporter on port " << metadataExporterPort; + qCInfo(domain_server) << "Starting Metadata exporter on port" << metadataExporterPort; _httpMetadataExporterManager = new HTTPManager(QHostAddress::Any, (quint16)metadataExporterPort, QString("%1/resources/metadata_exporter/").arg(QCoreApplication::applicationDirPath()), _metadata); } } From e8d9fe852e5996168630c7c42dc22b7b82f30460 Mon Sep 17 00:00:00 2001 From: Kasen IO Date: Tue, 21 Jul 2020 00:49:14 -0400 Subject: [PATCH 09/15] Adjust lines for length. --- domain-server/src/DomainServer.cpp | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/domain-server/src/DomainServer.cpp b/domain-server/src/DomainServer.cpp index bad9c96e6b..d7b813dd7d 100644 --- a/domain-server/src/DomainServer.cpp +++ b/domain-server/src/DomainServer.cpp @@ -3067,7 +3067,13 @@ void DomainServer::initializeExporter() { if (isExporterEnabled && !_httpExporterManager) { qCInfo(domain_server) << "Starting Prometheus exporter on port " << exporterPort; - _httpExporterManager = new HTTPManager(QHostAddress::Any, (quint16)exporterPort, QString("%1/resources/prometheus_exporter/").arg(QCoreApplication::applicationDirPath()), &_exporter); + _httpExporterManager = new HTTPManager + ( + QHostAddress::Any, + (quint16)exporterPort, + QString("%1/resources/prometheus_exporter/").arg(QCoreApplication::applicationDirPath()), + &_exporter + ); } } @@ -3087,7 +3093,13 @@ void DomainServer::initializeMetadataExporter() { if (isMetadataExporterEnabled && !_httpMetadataExporterManager) { qCInfo(domain_server) << "Starting Metadata exporter on port" << metadataExporterPort; - _httpMetadataExporterManager = new HTTPManager(QHostAddress::Any, (quint16)metadataExporterPort, QString("%1/resources/metadata_exporter/").arg(QCoreApplication::applicationDirPath()), _metadata); + _httpMetadataExporterManager = new HTTPManager + ( + QHostAddress::Any, + (quint16)metadataExporterPort, + QString("%1/resources/metadata_exporter/").arg(QCoreApplication::applicationDirPath()), + _metadata + ); } } From eef1e3b93e3d04af82f23eca3e59d62af6010d5a Mon Sep 17 00:00:00 2001 From: kasenvr <52365539+kasenvr@users.noreply.github.com> Date: Tue, 21 Jul 2020 01:30:56 -0400 Subject: [PATCH 10/15] Update index.html --- domain-server/resources/metadata_exporter/index.html | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/domain-server/resources/metadata_exporter/index.html b/domain-server/resources/metadata_exporter/index.html index c75cc711e8..a22d50fe22 100644 --- a/domain-server/resources/metadata_exporter/index.html +++ b/domain-server/resources/metadata_exporter/index.html @@ -1,3 +1,15 @@ + + Vircadia Metadata Exporter From b7e4362553e6207694858e78ceb1acc5dab8ad54 Mon Sep 17 00:00:00 2001 From: Kasen IO Date: Wed, 19 Aug 2020 00:01:47 -0400 Subject: [PATCH 11/15] Make empty values no longer null, add name property, rename "Hosts" -> "Managers" --- .../resources/describe-settings.json | 14 ++++-- domain-server/src/DomainMetadata.cpp | 47 +++++++++++++------ domain-server/src/DomainMetadata.h | 3 +- 3 files changed, 45 insertions(+), 19 deletions(-) diff --git a/domain-server/resources/describe-settings.json b/domain-server/resources/describe-settings.json index 9b3b716a4a..fbbeb391ba 100644 --- a/domain-server/resources/describe-settings.json +++ b/domain-server/resources/describe-settings.json @@ -162,6 +162,12 @@ "restart": false, "help": "This data will be queryable from your server. It may be collected by High Fidelity and used to share your domain with others.", "settings": [ + { + "name": "world_name", + "label": "Name", + "advanced": true, + "help": "The name of your domain (256 character limit)." + }, { "name": "description", "label": "Description", @@ -199,16 +205,16 @@ ] }, { - "name": "hosts", - "label": "Hosts", + "name": "managers", + "label": "Server Managers / Administrators", "advanced": true, "type": "table", "can_add_new_rows": true, - "help": "Usernames of hosts who can reliably show your domain to new visitors.", + "help": "Usernames of managers that administrate the domain.", "numbered": false, "columns": [ { - "name": "host", + "name": "manager", "label": "Username", "can_set": true } diff --git a/domain-server/src/DomainMetadata.cpp b/domain-server/src/DomainMetadata.cpp index f8d8d2d989..cfdbf249be 100644 --- a/domain-server/src/DomainMetadata.cpp +++ b/domain-server/src/DomainMetadata.cpp @@ -34,18 +34,21 @@ const QString DomainMetadata::Users::HOSTNAMES = "user_hostnames"; // } const QString DomainMetadata::DESCRIPTORS = "descriptors"; +const QString DomainMetadata::Descriptors::NAME = "world_name"; const QString DomainMetadata::Descriptors::DESCRIPTION = "description"; const QString DomainMetadata::Descriptors::CAPACITY = "capacity"; // parsed from security const QString DomainMetadata::Descriptors::RESTRICTION = "restriction"; // parsed from ACL const QString DomainMetadata::Descriptors::MATURITY = "maturity"; -const QString DomainMetadata::Descriptors::HOSTS = "hosts"; +const QString DomainMetadata::Descriptors::MANAGERS = "managers"; const QString DomainMetadata::Descriptors::TAGS = "tags"; // descriptors metadata will appear as (JSON): -// { "description": String, // capped description +// { +// "name": String, // capped name +// "description": String, // capped description // "capacity": Number, // "restriction": String, // enum of either open, hifi, or acl // "maturity": String, // enum corresponding to ESRB ratings -// "hosts": [ String ], // capped list of usernames +// "managers": [ String ], // capped list of usernames // "tags": [ String ], // capped list of tags // } @@ -82,12 +85,27 @@ void DomainMetadata::descriptorsChanged() { static const QString DESCRIPTORS_GROUP_KEYPATH = "descriptors"; auto descriptorsMap = static_cast(parent())->_settingsManager.valueForKeyPath(DESCRIPTORS).toMap(); - // copy simple descriptors (description/maturity) - state[Descriptors::DESCRIPTION] = descriptorsMap[Descriptors::DESCRIPTION]; - state[Descriptors::MATURITY] = descriptorsMap[Descriptors::MATURITY]; + // copy simple descriptors (name/description/maturity) + if (!descriptorsMap[Descriptors::NAME].isNull()) { + state[Descriptors::NAME] = descriptorsMap[Descriptors::NAME]; + } else { + state[Descriptors::NAME] = ""; + } - // copy array descriptors (hosts/tags) - state[Descriptors::HOSTS] = descriptorsMap[Descriptors::HOSTS].toList(); + if (!descriptorsMap[Descriptors::DESCRIPTION].isNull()) { + state[Descriptors::DESCRIPTION] = descriptorsMap[Descriptors::DESCRIPTION]; + } else { + state[Descriptors::DESCRIPTION] = ""; + } + + if (!descriptorsMap[Descriptors::MATURITY].isNull()) { + state[Descriptors::MATURITY] = descriptorsMap[Descriptors::MATURITY]; + } else { + state[Descriptors::MATURITY] = ""; + } + + // copy array descriptors (managers/tags) + state[Descriptors::MANAGERS] = descriptorsMap[Descriptors::MANAGERS].toList(); state[Descriptors::TAGS] = descriptorsMap[Descriptors::TAGS].toList(); // parse capacity @@ -211,19 +229,20 @@ void DomainMetadata::sendDescriptors() { } bool DomainMetadata::handleHTTPRequest(HTTPConnection* connection, const QUrl& url, bool skipSubHandler) { - QJsonArray metadataArray; - metadataArray << get(DESCRIPTORS); - metadataArray << get(USERS); - QString domainMetadataJSON = QString("{\"domain\":%1}").arg(QString(QJsonDocument(metadataArray).toJson(QJsonDocument::Compact))); + QString domainMetadataJSON = QString("{\"domain\":%1, \"users\":%2}") + .arg(QString(QJsonDocument(get(DESCRIPTORS)).toJson(QJsonDocument::Compact))) + .arg(QString(QJsonDocument(get(USERS)).toJson(QJsonDocument::Compact))); const QString URI_METADATA = "/metadata"; const QString EXPORTER_MIME_TYPE = "application/json"; - qCDebug(domain_metadata_exporter) << "Request on URL " << url; - if (url.path() == URI_METADATA) { connection->respond(HTTPConnection::StatusCode200, domainMetadataJSON.toUtf8(), qPrintable(EXPORTER_MIME_TYPE)); return true; } +#if DEV_BUILD || PR_BUILD + qCDebug(domain_metadata_exporter) << "Metadata request on URL " << url; +#endif + return false; } diff --git a/domain-server/src/DomainMetadata.h b/domain-server/src/DomainMetadata.h index 70f17348df..d366bd2020 100644 --- a/domain-server/src/DomainMetadata.h +++ b/domain-server/src/DomainMetadata.h @@ -34,11 +34,12 @@ public: static const QString DESCRIPTORS; class Descriptors { public: + static const QString NAME; static const QString DESCRIPTION; static const QString CAPACITY; static const QString RESTRICTION; static const QString MATURITY; - static const QString HOSTS; + static const QString MANAGERS; static const QString TAGS; }; From a079afbb73e44a8af56e301ebef3aac03cf9e5a5 Mon Sep 17 00:00:00 2001 From: Kalila L Date: Fri, 21 Aug 2020 13:40:38 -0400 Subject: [PATCH 12/15] Update metadata exporting. --- .../resources/describe-settings.json | 30 ++++++++++++++++++- domain-server/src/DomainMetadata.cpp | 27 +++++++++++++++-- domain-server/src/DomainMetadata.h | 3 ++ 3 files changed, 56 insertions(+), 4 deletions(-) diff --git a/domain-server/resources/describe-settings.json b/domain-server/resources/describe-settings.json index fbbeb391ba..3551104f75 100644 --- a/domain-server/resources/describe-settings.json +++ b/domain-server/resources/describe-settings.json @@ -174,6 +174,28 @@ "advanced": true, "help": "A description of your domain (256 character limit)." }, + { + "name": "thumbnail", + "label": "World Thumbnail", + "advanced": true, + "help": "A link to the thumbnail that is publicly accessible from the internet." + }, + { + "name": "images", + "label": "World Images", + "advanced": true, + "type": "table", + "can_add_new_rows": true, + "help": "URLs to images that visually describe your world to potential visitors.", + "numbered": false, + "columns": [ + { + "name": "image", + "label": "Image URL", + "can_set": true + } + ] + }, { "name": "maturity", "label": "Maturity", @@ -204,9 +226,15 @@ } ] }, + { + "name": "contact_info", + "label": "World Administrative Contact", + "advanced": true, + "help": "Contact information to reach server administrators for assistance (256 character limit)." + }, { "name": "managers", - "label": "Server Managers / Administrators", + "label": "World Managers / Administrators", "advanced": true, "type": "table", "can_add_new_rows": true, diff --git a/domain-server/src/DomainMetadata.cpp b/domain-server/src/DomainMetadata.cpp index cfdbf249be..53e3cce1ec 100644 --- a/domain-server/src/DomainMetadata.cpp +++ b/domain-server/src/DomainMetadata.cpp @@ -36,18 +36,25 @@ const QString DomainMetadata::Users::HOSTNAMES = "user_hostnames"; const QString DomainMetadata::DESCRIPTORS = "descriptors"; const QString DomainMetadata::Descriptors::NAME = "world_name"; const QString DomainMetadata::Descriptors::DESCRIPTION = "description"; +const QString DomainMetadata::Descriptors::THUMBNAIL = "thumbnail"; +const QString DomainMetadata::Descriptors::IMAGES = "images"; const QString DomainMetadata::Descriptors::CAPACITY = "capacity"; // parsed from security const QString DomainMetadata::Descriptors::RESTRICTION = "restriction"; // parsed from ACL const QString DomainMetadata::Descriptors::MATURITY = "maturity"; +const QString DomainMetadata::Descriptors::CONTACT = "contact_info"; const QString DomainMetadata::Descriptors::MANAGERS = "managers"; const QString DomainMetadata::Descriptors::TAGS = "tags"; + // descriptors metadata will appear as (JSON): // { -// "name": String, // capped name +// "world_name": String, // capped name // "description": String, // capped description +// "thumbnail": String, // capped thumbnail URL +// "images": [ String ], // capped list of image URLs // "capacity": Number, // "restriction": String, // enum of either open, hifi, or acl // "maturity": String, // enum corresponding to ESRB ratings +// "contact_info": [ String ], // capped list of usernames // "managers": [ String ], // capped list of usernames // "tags": [ String ], // capped list of tags // } @@ -85,7 +92,7 @@ void DomainMetadata::descriptorsChanged() { static const QString DESCRIPTORS_GROUP_KEYPATH = "descriptors"; auto descriptorsMap = static_cast(parent())->_settingsManager.valueForKeyPath(DESCRIPTORS).toMap(); - // copy simple descriptors (name/description/maturity) + // copy simple descriptors if (!descriptorsMap[Descriptors::NAME].isNull()) { state[Descriptors::NAME] = descriptorsMap[Descriptors::NAME]; } else { @@ -98,13 +105,27 @@ void DomainMetadata::descriptorsChanged() { state[Descriptors::DESCRIPTION] = ""; } + if (!descriptorsMap[Descriptors::THUMBNAIL].isNull()) { + state[Descriptors::THUMBNAIL] = descriptorsMap[Descriptors::THUMBNAIL]; + } else { + state[Descriptors::THUMBNAIL] = ""; + } + if (!descriptorsMap[Descriptors::MATURITY].isNull()) { state[Descriptors::MATURITY] = descriptorsMap[Descriptors::MATURITY]; } else { state[Descriptors::MATURITY] = ""; } + + if (!descriptorsMap[Descriptors::CONTACT].isNull()) { + state[Descriptors::CONTACT] = descriptorsMap[Descriptors::CONTACT]; + } else { + state[Descriptors::CONTACT] = ""; + } - // copy array descriptors (managers/tags) + // copy array descriptors + state[Descriptors::THUMBNAIL] = descriptorsMap[Descriptors::THUMBNAIL].toList(); + state[Descriptors::IMAGES] = descriptorsMap[Descriptors::IMAGES].toList(); state[Descriptors::MANAGERS] = descriptorsMap[Descriptors::MANAGERS].toList(); state[Descriptors::TAGS] = descriptorsMap[Descriptors::TAGS].toList(); diff --git a/domain-server/src/DomainMetadata.h b/domain-server/src/DomainMetadata.h index d366bd2020..24dcba909d 100644 --- a/domain-server/src/DomainMetadata.h +++ b/domain-server/src/DomainMetadata.h @@ -36,9 +36,12 @@ public: public: static const QString NAME; static const QString DESCRIPTION; + static const QString THUMBNAIL; + static const QString IMAGES; static const QString CAPACITY; static const QString RESTRICTION; static const QString MATURITY; + static const QString CONTACT; static const QString MANAGERS; static const QString TAGS; }; From c81365f4f0d925c81eac92446bef0a35a070b1a0 Mon Sep 17 00:00:00 2001 From: Kalila L Date: Fri, 21 Aug 2020 13:47:59 -0400 Subject: [PATCH 13/15] Update description for Prometheus exporter. --- domain-server/resources/describe-settings.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/domain-server/resources/describe-settings.json b/domain-server/resources/describe-settings.json index 3551104f75..7c8783bb82 100644 --- a/domain-server/resources/describe-settings.json +++ b/domain-server/resources/describe-settings.json @@ -114,7 +114,7 @@ { "name": "enable_prometheus_exporter", "label": "Enable Prometheus Exporter", - "help": "Enable a Prometheus exporter to make it possible to gather the stats that are available at Nodes tab with a Prometheus server. This makes it possible to keep track of long-term domain statistics for graphing, troubleshooting, and performance monitoring.", + "help": "Enable a Prometheus exporter to make it possible to gather stats about the mixers that are available in the Nodes tab with a Prometheus server. This makes it possible to keep track of long-term domain statistics for graphing, troubleshooting, and performance monitoring.", "default": false, "type": "checkbox", "advanced": true From a24b8f0fc6004d6fca455cc89624985eb95b1215 Mon Sep 17 00:00:00 2001 From: Kalila L Date: Fri, 21 Aug 2020 14:08:50 -0400 Subject: [PATCH 14/15] Missed a spot, was wiping thumbnail string and replacing with an array. --- domain-server/src/DomainMetadata.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/domain-server/src/DomainMetadata.cpp b/domain-server/src/DomainMetadata.cpp index 53e3cce1ec..981d82ee3b 100644 --- a/domain-server/src/DomainMetadata.cpp +++ b/domain-server/src/DomainMetadata.cpp @@ -124,7 +124,6 @@ void DomainMetadata::descriptorsChanged() { } // copy array descriptors - state[Descriptors::THUMBNAIL] = descriptorsMap[Descriptors::THUMBNAIL].toList(); state[Descriptors::IMAGES] = descriptorsMap[Descriptors::IMAGES].toList(); state[Descriptors::MANAGERS] = descriptorsMap[Descriptors::MANAGERS].toList(); state[Descriptors::TAGS] = descriptorsMap[Descriptors::TAGS].toList(); From ebecbcc7f70511b98b16d5da0a24eb40cf99d753 Mon Sep 17 00:00:00 2001 From: Kalila L Date: Fri, 21 Aug 2020 22:00:06 -0400 Subject: [PATCH 15/15] Update JSON structure for metadata. --- domain-server/src/DomainMetadata.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/domain-server/src/DomainMetadata.cpp b/domain-server/src/DomainMetadata.cpp index 981d82ee3b..35bcd10c91 100644 --- a/domain-server/src/DomainMetadata.cpp +++ b/domain-server/src/DomainMetadata.cpp @@ -230,7 +230,7 @@ void DomainMetadata::maybeUpdateUsers() { } void DomainMetadata::sendDescriptors() { - QString domainUpdateJSON = QString("{\"domain\":%1}").arg(QString(QJsonDocument(get(DESCRIPTORS)).toJson(QJsonDocument::Compact))); + QString domainUpdateJSON = QString("{\"domain\":{\"meta\":%1}").arg(QString(QJsonDocument(get(DESCRIPTORS)).toJson(QJsonDocument::Compact))); const QUuid& domainID = DependencyManager::get()->getSessionUUID(); if (!domainID.isNull()) { static const QString DOMAIN_UPDATE = "/api/v1/domains/%1"; @@ -249,7 +249,7 @@ void DomainMetadata::sendDescriptors() { } bool DomainMetadata::handleHTTPRequest(HTTPConnection* connection, const QUrl& url, bool skipSubHandler) { - QString domainMetadataJSON = QString("{\"domain\":%1, \"users\":%2}") + QString domainMetadataJSON = QString("{\"domain\":{\"meta\":%1}, \"users\":%2}") .arg(QString(QJsonDocument(get(DESCRIPTORS)).toJson(QJsonDocument::Compact))) .arg(QString(QJsonDocument(get(USERS)).toJson(QJsonDocument::Compact))); const QString URI_METADATA = "/metadata";