From ba49fd2c6133ab6c649df51fc8181e39861d117f Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Thu, 4 Aug 2016 09:19:01 -0700 Subject: [PATCH 1/2] don't heartbeat immediately unless metaverse domain --- domain-server/src/DomainServer.cpp | 85 ++++++++++++++++++++---------- domain-server/src/DomainServer.h | 8 +++ 2 files changed, 65 insertions(+), 28 deletions(-) diff --git a/domain-server/src/DomainServer.cpp b/domain-server/src/DomainServer.cpp index 23e37efaf1..d352cb375f 100644 --- a/domain-server/src/DomainServer.cpp +++ b/domain-server/src/DomainServer.cpp @@ -117,9 +117,18 @@ DomainServer::DomainServer(int argc, char* argv[]) : _settingsManager.apiRefreshGroupInformation(); setupNodeListAndAssignments(); + + if (_type == MetaverseDomain) { + // if we have a metaverse domain, we'll need an access token to heartbeat handle auto-networking + resetAccountManagerAccessToken(); + } + setupAutomaticNetworking(); - if (!getID().isNull()) { + + if (!getID().isNull() && _type != NonMetaverse) { + // setup periodic heartbeats to metaverse API setupHeartbeatToMetaverse(); + // send the first heartbeat immediately sendHeartbeatToMetaverse(); } @@ -301,16 +310,22 @@ void DomainServer::handleTempDomainSuccess(QNetworkReply& requestReply) { // store the new ID and auto networking setting on disk _settingsManager.persistToFile(); - // change our domain ID immediately - DependencyManager::get()->setSessionUUID(QUuid { id }); - // store the new token to the account info auto accountManager = DependencyManager::get(); accountManager->setTemporaryDomain(id, key); + // change our domain ID immediately + DependencyManager::get()->setSessionUUID(QUuid { id }); + + // change our type to reflect that we are a temporary domain now + _type = MetaverseTemporaryDomain; + // update our heartbeats to use the correct id setupICEHeartbeatForFullNetworking(); setupHeartbeatToMetaverse(); + + // if we have a current ICE server address, update it in the API for the new temporary domain + sendICEServerAddressToMetaverseAPI(); } 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."; @@ -394,6 +409,16 @@ void DomainServer::setupNodeListAndAssignments() { const QVariant* idValueVariant = valueForKeyPath(settingsMap, METAVERSE_DOMAIN_ID_KEY_PATH); if (idValueVariant) { nodeList->setSessionUUID(idValueVariant->toString()); + + // if we have an ID, we'll assume we're a metaverse domain + // now see if we think we're a temp domain (we have an API key) or a full domain + const auto& temporaryDomainKey = DependencyManager::get()->getTemporaryDomainKey(getID()); + if (temporaryDomainKey.isEmpty()) { + _type = MetaverseDomain; + } else { + _type = MetaverseTemporaryDomain; + } + } else { nodeList->setSessionUUID(QUuid::createUuid()); // Use random UUID } @@ -477,42 +502,46 @@ bool DomainServer::resetAccountManagerAccessToken() { } void DomainServer::setupAutomaticNetworking() { - qDebug() << "Updating automatic networking setting in domain-server to" << _automaticNetworkingSetting; - - resetAccountManagerAccessToken(); _automaticNetworkingSetting = _settingsManager.valueOrDefaultValueForKeyPath(METAVERSE_AUTOMATIC_NETWORKING_KEY_PATH).toString(); - auto nodeList = DependencyManager::get(); - const QUuid& domainID = getID(); + qDebug() << "Configuring automatic networking in domain-server as" << _automaticNetworkingSetting; - if (_automaticNetworkingSetting == FULL_AUTOMATIC_NETWORKING_VALUE) { - setupICEHeartbeatForFullNetworking(); - } + if (_automaticNetworkingSetting != DISABLED_AUTOMATIC_NETWORKING_VALUE) { + const QUuid& domainID = getID(); - if (_automaticNetworkingSetting == IP_ONLY_AUTOMATIC_NETWORKING_VALUE || - _automaticNetworkingSetting == FULL_AUTOMATIC_NETWORKING_VALUE) { + if (_automaticNetworkingSetting == FULL_AUTOMATIC_NETWORKING_VALUE) { + setupICEHeartbeatForFullNetworking(); + } - if (!domainID.isNull()) { - qDebug() << "domain-server" << _automaticNetworkingSetting << "automatic networking enabled for ID" - << uuidStringWithoutCurlyBraces(domainID) << "via" << _oauthProviderURL.toString(); + if (_automaticNetworkingSetting == IP_ONLY_AUTOMATIC_NETWORKING_VALUE || + _automaticNetworkingSetting == FULL_AUTOMATIC_NETWORKING_VALUE) { - if (_automaticNetworkingSetting == IP_ONLY_AUTOMATIC_NETWORKING_VALUE) { - // send any public socket changes to the data server so nodes can find us at our new IP - connect(nodeList.data(), &LimitedNodeList::publicSockAddrChanged, - this, &DomainServer::performIPAddressUpdate); + if (!domainID.isNull()) { + qDebug() << "domain-server" << _automaticNetworkingSetting << "automatic networking enabled for ID" + << uuidStringWithoutCurlyBraces(domainID) << "via" << _oauthProviderURL.toString(); - // have the LNL enable public socket updating via STUN - nodeList->startSTUNPublicSocketUpdate(); + if (_automaticNetworkingSetting == IP_ONLY_AUTOMATIC_NETWORKING_VALUE) { + + auto nodeList = DependencyManager::get(); + + // send any public socket changes to the data server so nodes can find us at our new IP + connect(nodeList.data(), &LimitedNodeList::publicSockAddrChanged, + this, &DomainServer::performIPAddressUpdate); + + // have the LNL enable public socket updating via STUN + nodeList->startSTUNPublicSocketUpdate(); + } + } else { + qDebug() << "Cannot enable domain-server automatic networking without a domain ID." + << "Please add an ID to your config file or via the web interface."; + + return; } - } else { - qDebug() << "Cannot enable domain-server automatic networking without a domain ID." - << "Please add an ID to your config file or via the web interface."; - - return; } } + } void DomainServer::setupHeartbeatToMetaverse() { diff --git a/domain-server/src/DomainServer.h b/domain-server/src/DomainServer.h index 4004333789..06b3ed2c0a 100644 --- a/domain-server/src/DomainServer.h +++ b/domain-server/src/DomainServer.h @@ -42,6 +42,12 @@ public: DomainServer(int argc, char* argv[]); ~DomainServer(); + enum DomainType { + NonMetaverse, + MetaverseDomain, + MetaverseTemporaryDomain + }; + static int const EXIT_CODE_REBOOT; bool handleHTTPRequest(HTTPConnection* connection, const QUrl& url, bool skipSubHandler = false); @@ -195,6 +201,8 @@ private: int _numHeartbeatDenials { 0 }; bool _connectedToICEServer { false }; + DomainType _type { DomainType::NonMetaverse }; + friend class DomainGatekeeper; friend class DomainMetadata; }; From f3e30221f0553fe33ed772d06c0a95e0274edf30 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Thu, 4 Aug 2016 09:32:01 -0700 Subject: [PATCH 2/2] only force a new temp name if already a temp domain-server --- domain-server/src/DomainServer.cpp | 63 ++++++++++++++++-------------- 1 file changed, 33 insertions(+), 30 deletions(-) diff --git a/domain-server/src/DomainServer.cpp b/domain-server/src/DomainServer.cpp index d352cb375f..6c4b12d4c0 100644 --- a/domain-server/src/DomainServer.cpp +++ b/domain-server/src/DomainServer.cpp @@ -1168,42 +1168,45 @@ void DomainServer::handleMetaverseHeartbeatError(QNetworkReply& requestReply) { return; } - // check if we need to force a new temporary domain name - switch (requestReply.error()) { - // if we have a temporary domain with a bad token, we get a 401 - case QNetworkReply::NetworkError::AuthenticationRequiredError: { - static const QString DATA_KEY = "data"; - static const QString TOKEN_KEY = "api_key"; + // only attempt to grab a new temporary name if we're already a temporary domain server + if (_type == MetaverseTemporaryDomain) { + // check if we need to force a new temporary domain name + switch (requestReply.error()) { + // if we have a temporary domain with a bad token, we get a 401 + case QNetworkReply::NetworkError::AuthenticationRequiredError: { + static const QString DATA_KEY = "data"; + static const QString TOKEN_KEY = "api_key"; - QJsonObject jsonObject = QJsonDocument::fromJson(requestReply.readAll()).object(); - auto tokenFailure = jsonObject[DATA_KEY].toObject()[TOKEN_KEY]; + QJsonObject jsonObject = QJsonDocument::fromJson(requestReply.readAll()).object(); + auto tokenFailure = jsonObject[DATA_KEY].toObject()[TOKEN_KEY]; - if (!tokenFailure.isNull()) { - qWarning() << "Temporary domain name lacks a valid API key, and is being reset."; + if (!tokenFailure.isNull()) { + qWarning() << "Temporary domain name lacks a valid API key, and is being reset."; + } + break; } - break; + // if the domain does not (or no longer) exists, we get a 404 + case QNetworkReply::NetworkError::ContentNotFoundError: + qWarning() << "Domain not found, getting a new temporary domain."; + break; + // otherwise, we erred on something else, and should not force a temporary domain + default: + return; } - // if the domain does not (or no longer) exists, we get a 404 - case QNetworkReply::NetworkError::ContentNotFoundError: - qWarning() << "Domain not found, getting a new temporary domain."; - break; - // otherwise, we erred on something else, and should not force a temporary domain - default: - return; - } - // halt heartbeats until we have a token - _metaverseHeartbeatTimer->deleteLater(); - _metaverseHeartbeatTimer = nullptr; + // halt heartbeats until we have a token + _metaverseHeartbeatTimer->deleteLater(); + _metaverseHeartbeatTimer = nullptr; - // give up eventually to avoid flooding traffic - static const int MAX_ATTEMPTS = 5; - static int attempt = 0; - if (++attempt < MAX_ATTEMPTS) { - // get a new temporary name and token - getTemporaryName(true); - } else { - qWarning() << "Already attempted too many temporary domain requests. Please set a domain ID manually or restart."; + // give up eventually to avoid flooding traffic + static const int MAX_ATTEMPTS = 5; + static int attempt = 0; + if (++attempt < MAX_ATTEMPTS) { + // get a new temporary name and token + getTemporaryName(true); + } else { + qWarning() << "Already attempted too many temporary domain requests. Please set a domain ID manually or restart."; + } } }