From 4cbbd24c7e1f7bc92edb650ebf83e68f86c36826 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Tue, 19 Jan 2016 13:04:05 -0800 Subject: [PATCH] complete handling of immediate temp name grab --- domain-server/src/DomainServer.cpp | 71 +++++++++++++++---- domain-server/src/DomainServer.h | 3 + .../src/DomainServerSettingsManager.cpp | 7 +- .../src/DomainServerSettingsManager.h | 4 +- libraries/networking/src/LimitedNodeList.cpp | 2 - libraries/shared/src/LogHandler.cpp | 2 + libraries/shared/src/LogHandler.h | 3 +- 7 files changed, 70 insertions(+), 22 deletions(-) diff --git a/domain-server/src/DomainServer.cpp b/domain-server/src/DomainServer.cpp index bc0eed3ded..40ab9150a2 100644 --- a/domain-server/src/DomainServer.cpp +++ b/domain-server/src/DomainServer.cpp @@ -242,16 +242,49 @@ void DomainServer::optionallyGetTemporaryName(const QStringList& arguments) { callbackParameters.errorCallbackMethod = "handleTempDomainError"; accountManager.sendRequest("/api/v1/domains/temporary", AccountManagerAuth::None, - QNetworkAccessManager::GetOperation, callbackParameters); + QNetworkAccessManager::PostOperation, callbackParameters); } } void DomainServer::handleTempDomainSuccess(QNetworkReply& requestReply) { QJsonObject jsonObject = QJsonDocument::fromJson(requestReply.readAll()).object(); + + // grab the information for the new domain + static const QString DATA_KEY = "data"; + static const QString DOMAIN_KEY = "domain"; + static const QString ID_KEY = "id"; + static const QString NAME_KEY = "name"; + + auto domainObject = jsonObject[DATA_KEY].toObject()[DOMAIN_KEY].toObject(); + if (!domainObject.isEmpty()) { + auto id = domainObject[ID_KEY].toString(); + auto name = domainObject[NAME_KEY].toString(); + + qInfo() << "Received new temporary domain name" << name; + qDebug() << "The temporary domain ID is" << id; + + // store the new domain ID and auto network setting immediately + QString newSettingsJSON = QString("{\"metaverse\": { \"id\": \"%1\", \"automatic_networking\": \"full\"}}").arg(id); + auto settingsDocument = QJsonDocument::fromJson(newSettingsJSON.toUtf8()); + _settingsManager.recurseJSONObjectAndOverwriteSettings(settingsDocument.object()); + + // store the new ID and auto networking setting on disk + _settingsManager.persistToFile(); + + // change our domain ID immediately + DependencyManager::get()->setSessionUUID(QUuid { id }); + + // change our automatic networking settings so that we're communicating with the ICE server + setupICEHeartbeatForFullNetworking(); + + } else { + qWarning() << "There were problems parsing the API response containing a temporary domain name. Please try again" + << "via domain-server relaunch or from the domain-server settings."; + } } void DomainServer::handleTempDomainError(QNetworkReply& requestReply) { - qWarning() << "A temporary name was requested but there was an error creating one. Try again via domain-server relaunch" + qWarning() << "A temporary name was requested but there was an error creating one. Please try again via domain-server relaunch" << "or from the domain-server settings."; } @@ -417,19 +450,7 @@ void DomainServer::setupAutomaticNetworking() { _settingsManager.valueOrDefaultValueForKeyPath(METAVERSE_AUTOMATIC_NETWORKING_KEY_PATH).toString(); if (_automaticNetworkingSetting == FULL_AUTOMATIC_NETWORKING_VALUE) { - // call our sendHeartbeatToIceServer immediately anytime a local or public socket changes - connect(nodeList.data(), &LimitedNodeList::localSockAddrChanged, - this, &DomainServer::sendHeartbeatToIceServer); - connect(nodeList.data(), &LimitedNodeList::publicSockAddrChanged, - this, &DomainServer::sendHeartbeatToIceServer); - - // we need this DS to know what our public IP is - start trying to figure that out now - nodeList->startSTUNPublicSocketUpdate(); - - // setup a timer to heartbeat with the ice-server every so often - QTimer* iceHeartbeatTimer = new QTimer(this); - connect(iceHeartbeatTimer, &QTimer::timeout, this, &DomainServer::sendHeartbeatToIceServer); - iceHeartbeatTimer->start(ICE_HEARBEAT_INTERVAL_MSECS); + } if (!didSetupAccountManagerWithAccessToken()) { @@ -479,6 +500,26 @@ void DomainServer::setupAutomaticNetworking() { dataHeartbeatTimer->start(DOMAIN_SERVER_DATA_WEB_HEARTBEAT_MSECS); } +void DomainServer::setupICEHeartbeatForFullNetworking() { + auto limitedNodeList = DependencyManager::get(); + + // call our sendHeartbeatToIceServer immediately anytime a local or public socket changes + connect(limitedNodeList.data(), &LimitedNodeList::localSockAddrChanged, + this, &DomainServer::sendHeartbeatToIceServer); + connect(limitedNodeList.data(), &LimitedNodeList::publicSockAddrChanged, + this, &DomainServer::sendHeartbeatToIceServer); + + // we need this DS to know what our public IP is - start trying to figure that out now + limitedNodeList->startSTUNPublicSocketUpdate(); + + if (!_iceHeartbeatTimer) { + // setup a timer to heartbeat with the ice-server every so often + _iceHeartbeatTimer = new QTimer { this }; + connect(_iceHeartbeatTimer, &QTimer::timeout, this, &DomainServer::sendHeartbeatToIceServer); + _iceHeartbeatTimer->start(ICE_HEARBEAT_INTERVAL_MSECS); + } +} + void DomainServer::loginFailed() { qDebug() << "Login to data server has failed. domain-server will now quit"; QMetaObject::invokeMethod(this, "quit", Qt::QueuedConnection); diff --git a/domain-server/src/DomainServer.h b/domain-server/src/DomainServer.h index 78459164d0..a4892b446b 100644 --- a/domain-server/src/DomainServer.h +++ b/domain-server/src/DomainServer.h @@ -90,6 +90,7 @@ private: bool resetAccountManagerAccessToken(); void setupAutomaticNetworking(); + void setupICEHeartbeatForFullNetworking(); void sendHeartbeatToDataServer(const QString& networkAddress); unsigned int countConnectedUsers(); @@ -149,6 +150,8 @@ private: DomainServerSettingsManager _settingsManager; HifiSockAddr _iceServerSocket; + + QTimer* _iceHeartbeatTimer { nullptr }; // this looks like it dangles when created but it's parented to the DomainServer friend class DomainGatekeeper; }; diff --git a/domain-server/src/DomainServerSettingsManager.cpp b/domain-server/src/DomainServerSettingsManager.cpp index 888df219dd..9190e4f99f 100644 --- a/domain-server/src/DomainServerSettingsManager.cpp +++ b/domain-server/src/DomainServerSettingsManager.cpp @@ -193,7 +193,7 @@ bool DomainServerSettingsManager::handleAuthenticatedHTTPRequest(HTTPConnection qDebug() << "DomainServerSettingsManager postedObject -" << postedObject; // we recurse one level deep below each group for the appropriate setting - recurseJSONObjectAndOverwriteSettings(postedObject, _configMap.getUserConfig()); + recurseJSONObjectAndOverwriteSettings(postedObject); // store whatever the current _settingsMap is to file persistToFile(); @@ -407,8 +407,9 @@ QJsonObject DomainServerSettingsManager::settingDescriptionFromGroup(const QJson return QJsonObject(); } -void DomainServerSettingsManager::recurseJSONObjectAndOverwriteSettings(const QJsonObject& postedObject, - QVariantMap& settingsVariant) { +void DomainServerSettingsManager::recurseJSONObjectAndOverwriteSettings(const QJsonObject& postedObject) { + auto& settingsVariant = _configMap.getUserConfig(); + // Iterate on the setting groups foreach(const QString& rootKey, postedObject.keys()) { QJsonValue rootValue = postedObject[rootKey]; diff --git a/domain-server/src/DomainServerSettingsManager.h b/domain-server/src/DomainServerSettingsManager.h index 7f71a89da5..d6dd5070a9 100644 --- a/domain-server/src/DomainServerSettingsManager.h +++ b/domain-server/src/DomainServerSettingsManager.h @@ -46,7 +46,7 @@ private slots: private: QJsonObject responseObjectForType(const QString& typeValue, bool isAuthenticated = false); - void recurseJSONObjectAndOverwriteSettings(const QJsonObject& postedObject, QVariantMap& settingsVariant); + void recurseJSONObjectAndOverwriteSettings(const QJsonObject& postedObject); void updateSetting(const QString& key, const QJsonValue& newValue, QVariantMap& settingMap, const QJsonObject& settingDescription); @@ -56,6 +56,8 @@ private: double _descriptionVersion; QJsonArray _descriptionArray; HifiConfigVariantMap _configMap; + + friend class DomainServer; }; #endif // hifi_DomainServerSettingsManager_h diff --git a/libraries/networking/src/LimitedNodeList.cpp b/libraries/networking/src/LimitedNodeList.cpp index 0b194b017e..67406286a4 100644 --- a/libraries/networking/src/LimitedNodeList.cpp +++ b/libraries/networking/src/LimitedNodeList.cpp @@ -788,8 +788,6 @@ void LimitedNodeList::processSTUNResponse(std::unique_ptr packe } void LimitedNodeList::startSTUNPublicSocketUpdate() { - assert(!_initialSTUNTimer); - if (!_initialSTUNTimer) { // if we don't know the STUN IP yet we need to have ourselves be called once it is known if (_stunSockAddr.getAddress().isNull()) { diff --git a/libraries/shared/src/LogHandler.cpp b/libraries/shared/src/LogHandler.cpp index 7dd1aceb3d..c1cf969f36 100644 --- a/libraries/shared/src/LogHandler.cpp +++ b/libraries/shared/src/LogHandler.cpp @@ -42,6 +42,8 @@ LogHandler::LogHandler() : const char* stringForLogType(LogMsgType msgType) { switch (msgType) { + case LogInfo: + return "INFO"; case LogDebug: return "DEBUG"; case LogWarning: diff --git a/libraries/shared/src/LogHandler.h b/libraries/shared/src/LogHandler.h index a74a6287d7..ee8e426c34 100644 --- a/libraries/shared/src/LogHandler.h +++ b/libraries/shared/src/LogHandler.h @@ -22,11 +22,12 @@ const int VERBOSE_LOG_INTERVAL_SECONDS = 5; enum LogMsgType { + LogInfo = QtInfoMsg, LogDebug = QtDebugMsg, LogWarning = QtWarningMsg, LogCritical = QtCriticalMsg, LogFatal = QtFatalMsg, - LogSuppressed + LogSuppressed = 100 }; /// Handles custom message handling and sending of stats/logs to Logstash instance