From 1e9e2641247bd4d3da1639ec99662a1627e615fd Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Mon, 6 Jun 2016 10:50:36 -0700 Subject: [PATCH 01/10] Revert "Revert "refresh API info during re-connect - case 570"" This reverts commit b8c80e222286a16ef56a5ecfcf7c95aa04a9918e. --- libraries/networking/src/AddressManager.cpp | 44 ++++++++++++++++++--- libraries/networking/src/AddressManager.h | 9 ++++- libraries/networking/src/DomainHandler.cpp | 18 +++------ libraries/networking/src/DomainHandler.h | 10 ++--- libraries/networking/src/NodeList.cpp | 14 +++++-- 5 files changed, 67 insertions(+), 28 deletions(-) diff --git a/libraries/networking/src/AddressManager.cpp b/libraries/networking/src/AddressManager.cpp index 1b7ed11cce..9a3d147ead 100644 --- a/libraries/networking/src/AddressManager.cpp +++ b/libraries/networking/src/AddressManager.cpp @@ -144,12 +144,21 @@ bool AddressManager::handleUrl(const QUrl& lookupUrl, LookupTrigger trigger) { // 4. domain network address (IP or dns resolvable hostname) // use our regex'ed helpers to figure out what we're supposed to do with this - if (!handleUsername(lookupUrl.authority())) { + if (handleUsername(lookupUrl.authority())) { + // handled a username for lookup + + // in case we're failing to connect to where we thought this user was + // store their username as previous lookup so we can refresh their location via API + _previousLookup = lookupUrl; + } else { // we're assuming this is either a network address or global place name // check if it is a network address first bool hostChanged; if (handleNetworkAddress(lookupUrl.host() - + (lookupUrl.port() == -1 ? "" : ":" + QString::number(lookupUrl.port())), trigger, hostChanged)) { + + (lookupUrl.port() == -1 ? "" : ":" + QString::number(lookupUrl.port())), trigger, hostChanged)) { + + // a network address lookup clears the previous lookup since we don't expect to re-attempt it + _previousLookup.clear(); // If the host changed then we have already saved to history if (hostChanged) { @@ -165,10 +174,16 @@ bool AddressManager::handleUrl(const QUrl& lookupUrl, LookupTrigger trigger) { // we may have a path that defines a relative viewpoint - if so we should jump to that now handlePath(path, trigger); } else if (handleDomainID(lookupUrl.host())){ + // store this domain ID as the previous lookup in case we're failing to connect and want to refresh API info + _previousLookup = lookupUrl; + // no place name - this is probably a domain ID // try to look up the domain ID on the metaverse API attemptDomainIDLookup(lookupUrl.host(), lookupUrl.path(), trigger); } else { + // store this place name as the previous lookup in case we fail to connect and want to refresh API info + _previousLookup = lookupUrl; + // wasn't an address - lookup the place name // we may have a path that defines a relative viewpoint - pass that through the lookup so we can go to it after attemptPlaceNameLookup(lookupUrl.host(), lookupUrl.path(), trigger); @@ -180,9 +195,13 @@ bool AddressManager::handleUrl(const QUrl& lookupUrl, LookupTrigger trigger) { } else if (lookupUrl.toString().startsWith('/')) { qCDebug(networking) << "Going to relative path" << lookupUrl.path(); + // a path lookup clears the previous lookup since we don't expect to re-attempt it + _previousLookup.clear(); + // if this is a relative path then handle it as a relative viewpoint handlePath(lookupUrl.path(), trigger, true); emit lookupResultsFinished(); + return true; } @@ -276,7 +295,7 @@ void AddressManager::goToAddressFromObject(const QVariantMap& dataObject, const qCDebug(networking) << "Possible domain change required to connect to" << domainHostname << "on" << domainPort; - emit possibleDomainChangeRequired(domainHostname, domainPort); + emit possibleDomainChangeRequired(domainHostname, domainPort, domainID); } else { QString iceServerAddress = domainObject[DOMAIN_ICE_SERVER_ADDRESS_KEY].toString(); @@ -315,7 +334,10 @@ void AddressManager::goToAddressFromObject(const QVariantMap& dataObject, const QString overridePath = reply.property(OVERRIDE_PATH_KEY).toString(); if (!overridePath.isEmpty()) { - handlePath(overridePath, trigger); + // make sure we don't re-handle an overriden path if this was a refresh of info from API + if (trigger != LookupTrigger::AttemptedRefresh) { + handlePath(overridePath, trigger); + } } else { // take the path that came back const QString PLACE_PATH_KEY = "path"; @@ -598,7 +620,7 @@ bool AddressManager::setDomainInfo(const QString& hostname, quint16 port, Lookup DependencyManager::get()->flagTimeForConnectionStep(LimitedNodeList::ConnectionStep::HandleAddress); - emit possibleDomainChangeRequired(hostname, port); + emit possibleDomainChangeRequired(hostname, port, QUuid()); return hostChanged; } @@ -618,6 +640,13 @@ void AddressManager::goToUser(const QString& username) { QByteArray(), nullptr, requestParams); } +void AddressManager::refreshPreviousLookup() { + // if we have a non-empty previous lookup, fire it again now (but don't re-store it in the history) + if (!_previousLookup.isEmpty()) { + handleUrl(_previousLookup, LookupTrigger::AttemptedRefresh); + } +} + void AddressManager::copyAddress() { QApplication::clipboard()->setText(currentAddress().toString()); } @@ -629,7 +658,10 @@ void AddressManager::copyPath() { void AddressManager::addCurrentAddressToHistory(LookupTrigger trigger) { // if we're cold starting and this is called for the first address (from settings) we don't do anything - if (trigger != LookupTrigger::StartupFromSettings && trigger != LookupTrigger::DomainPathResponse) { + if (trigger != LookupTrigger::StartupFromSettings + && trigger != LookupTrigger::DomainPathResponse + && trigger != LookupTrigger::AttemptedRefresh) { + if (trigger == LookupTrigger::Back) { // we're about to push to the forward stack // if it's currently empty emit our signal to say that going forward is now possible diff --git a/libraries/networking/src/AddressManager.h b/libraries/networking/src/AddressManager.h index 643924ff5c..a3aaee3ba2 100644 --- a/libraries/networking/src/AddressManager.h +++ b/libraries/networking/src/AddressManager.h @@ -48,7 +48,8 @@ public: Forward, StartupFromSettings, DomainPathResponse, - Internal + Internal, + AttemptedRefresh }; bool isConnected(); @@ -89,6 +90,8 @@ public slots: void goToUser(const QString& username); + void refreshPreviousLookup(); + void storeCurrentAddress(); void copyAddress(); @@ -99,7 +102,7 @@ signals: void lookupResultIsOffline(); void lookupResultIsNotFound(); - void possibleDomainChangeRequired(const QString& newHostname, quint16 newPort); + void possibleDomainChangeRequired(const QString& newHostname, quint16 newPort, const QUuid& domainID); void possibleDomainChangeRequiredViaICEForID(const QString& iceServerHostname, const QUuid& domainID); void locationChangeRequired(const glm::vec3& newPosition, @@ -152,6 +155,8 @@ private: quint64 _lastBackPush = 0; QString _newHostLookupPath; + + QUrl _previousLookup; }; #endif // hifi_AddressManager_h diff --git a/libraries/networking/src/DomainHandler.cpp b/libraries/networking/src/DomainHandler.cpp index 4f85296f03..1efcfc7f27 100644 --- a/libraries/networking/src/DomainHandler.cpp +++ b/libraries/networking/src/DomainHandler.cpp @@ -28,16 +28,8 @@ DomainHandler::DomainHandler(QObject* parent) : QObject(parent), - _uuid(), _sockAddr(HifiSockAddr(QHostAddress::Null, DEFAULT_DOMAIN_SERVER_PORT)), - _assignmentUUID(), - _connectionToken(), - _iceDomainID(), - _iceClientID(), - _iceServerSockAddr(), _icePeer(this), - _isConnected(false), - _settingsObject(), _settingsTimer(this) { _sockAddr.setObjectName("DomainServer"); @@ -105,7 +97,7 @@ void DomainHandler::hardReset() { softReset(); qCDebug(networking) << "Hard reset in NodeList DomainHandler."; - _iceDomainID = QUuid(); + _pendingDomainID = QUuid(); _iceServerSockAddr = HifiSockAddr(); _hostname = QString(); _sockAddr.clear(); @@ -139,7 +131,7 @@ void DomainHandler::setUUID(const QUuid& uuid) { } } -void DomainHandler::setHostnameAndPort(const QString& hostname, quint16 port) { +void DomainHandler::setSocketAndID(const QString& hostname, quint16 port, const QUuid& domainID) { if (hostname != _hostname || _sockAddr.getPort() != port) { // re-set the domain info so that auth information is reloaded @@ -171,6 +163,8 @@ void DomainHandler::setHostnameAndPort(const QString& hostname, quint16 port) { // grab the port by reading the string after the colon _sockAddr.setPort(port); } + + _pendingDomainID = domainID; } void DomainHandler::setIceServerHostnameAndID(const QString& iceServerHostname, const QUuid& id) { @@ -181,7 +175,7 @@ void DomainHandler::setIceServerHostnameAndID(const QString& iceServerHostname, // refresh our ICE client UUID to something new _iceClientID = QUuid::createUuid(); - _iceDomainID = id; + _pendingDomainID = id; HifiSockAddr* replaceableSockAddr = &_iceServerSockAddr; replaceableSockAddr->~HifiSockAddr(); @@ -343,7 +337,7 @@ void DomainHandler::processICEResponsePacket(QSharedPointer mes DependencyManager::get()->flagTimeForConnectionStep(LimitedNodeList::ConnectionStep::ReceiveDSPeerInformation); - if (_icePeer.getUUID() != _iceDomainID) { + if (_icePeer.getUUID() != _pendingDomainID) { qCDebug(networking) << "Received a network peer with ID that does not match current domain. Will not attempt connection."; _icePeer.reset(); } else { diff --git a/libraries/networking/src/DomainHandler.h b/libraries/networking/src/DomainHandler.h index bcee7668d1..226186f1d0 100644 --- a/libraries/networking/src/DomainHandler.h +++ b/libraries/networking/src/DomainHandler.h @@ -58,8 +58,8 @@ public: const QUuid& getAssignmentUUID() const { return _assignmentUUID; } void setAssignmentUUID(const QUuid& assignmentUUID) { _assignmentUUID = assignmentUUID; } - - const QUuid& getICEDomainID() const { return _iceDomainID; } + + const QUuid& getPendingDomainID() const { return _pendingDomainID; } const QUuid& getICEClientID() const { return _iceClientID; } @@ -94,7 +94,7 @@ public: }; public slots: - void setHostnameAndPort(const QString& hostname, quint16 port = DEFAULT_DOMAIN_SERVER_PORT); + void setSocketAndID(const QString& hostname, quint16 port = DEFAULT_DOMAIN_SERVER_PORT, const QUuid& id = QUuid()); void setIceServerHostnameAndID(const QString& iceServerHostname, const QUuid& id); void processSettingsPacketList(QSharedPointer packetList); @@ -136,11 +136,11 @@ private: HifiSockAddr _sockAddr; QUuid _assignmentUUID; QUuid _connectionToken; - QUuid _iceDomainID; + QUuid _pendingDomainID; // ID of domain being connected to, via ICE or direct connection QUuid _iceClientID; HifiSockAddr _iceServerSockAddr; NetworkPeer _icePeer; - bool _isConnected; + bool _isConnected { false }; QJsonObject _settingsObject; QString _pendingPath; QTimer _settingsTimer; diff --git a/libraries/networking/src/NodeList.cpp b/libraries/networking/src/NodeList.cpp index 16a4083b08..082200fccc 100644 --- a/libraries/networking/src/NodeList.cpp +++ b/libraries/networking/src/NodeList.cpp @@ -50,7 +50,7 @@ NodeList::NodeList(char newOwnerType, unsigned short socketListenPort, unsigned // handle domain change signals from AddressManager connect(addressManager.data(), &AddressManager::possibleDomainChangeRequired, - &_domainHandler, &DomainHandler::setHostnameAndPort); + &_domainHandler, &DomainHandler::setSocketAndID); connect(addressManager.data(), &AddressManager::possibleDomainChangeRequiredViaICEForID, &_domainHandler, &DomainHandler::setIceServerHostnameAndID); @@ -355,6 +355,14 @@ void NodeList::sendDomainServerCheckIn() { // increment the count of un-replied check-ins _numNoReplyDomainCheckIns++; } + + if (!_publicSockAddr.isNull() && !_domainHandler.isConnected() && !_domainHandler.getPendingDomainID().isNull()) { + // if we aren't connected to the domain-server, and we have an ID + // (that we presume belongs to a domain in the HF Metaverse) + // we request connection information for the domain every so often to make sure what we have is up to date + + DependencyManager::get()->refreshPreviousLookup(); + } } void NodeList::handleDSPathQuery(const QString& newPath) { @@ -462,7 +470,7 @@ void NodeList::handleICEConnectionToDomainServer() { LimitedNodeList::sendPeerQueryToIceServer(_domainHandler.getICEServerSockAddr(), _domainHandler.getICEClientID(), - _domainHandler.getICEDomainID()); + _domainHandler.getPendingDomainID()); } } @@ -475,7 +483,7 @@ void NodeList::pingPunchForDomainServer() { if (_domainHandler.getICEPeer().getConnectionAttempts() == 0) { qCDebug(networking) << "Sending ping packets to establish connectivity with domain-server with ID" - << uuidStringWithoutCurlyBraces(_domainHandler.getICEDomainID()); + << uuidStringWithoutCurlyBraces(_domainHandler.getPendingDomainID()); } else { if (_domainHandler.getICEPeer().getConnectionAttempts() % NUM_DOMAIN_SERVER_PINGS_BEFORE_RESET == 0) { // if we have then nullify the domain handler's network peer and send a fresh ICE heartbeat From 8318e9ccc8526c8170da07b13f261097d1a96e2a Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Mon, 6 Jun 2016 10:50:49 -0700 Subject: [PATCH 02/10] Revert "additional revert related change" This reverts commit 3119b654dc9b0053c5c1bdee7668246ded0fcb87. --- libraries/networking/src/AddressManager.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/networking/src/AddressManager.cpp b/libraries/networking/src/AddressManager.cpp index 9a3d147ead..80989acd2c 100644 --- a/libraries/networking/src/AddressManager.cpp +++ b/libraries/networking/src/AddressManager.cpp @@ -384,7 +384,7 @@ void AddressManager::handleAPIError(QNetworkReply& errorReply) { if (errorReply.error() == QNetworkReply::ContentNotFoundError) { // if this is a lookup that has no result, don't keep re-trying it - //_previousLookup.clear(); + _previousLookup.clear(); emit lookupResultIsNotFound(); } From f59335ceff908d6a2db5f26227840ddc172c1661 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Mon, 6 Jun 2016 11:49:01 -0700 Subject: [PATCH 03/10] don't thrash API re-check when connection denied --- libraries/networking/src/DomainHandler.cpp | 6 ++---- libraries/networking/src/DomainHandler.h | 3 ++- libraries/networking/src/NodeList.cpp | 9 ++++++++- 3 files changed, 12 insertions(+), 6 deletions(-) diff --git a/libraries/networking/src/DomainHandler.cpp b/libraries/networking/src/DomainHandler.cpp index 1efcfc7f27..9b94c07ed2 100644 --- a/libraries/networking/src/DomainHandler.cpp +++ b/libraries/networking/src/DomainHandler.cpp @@ -85,6 +85,7 @@ void DomainHandler::softReset() { clearSettings(); + _domainConnectionRefusals.clear(); _connectionDenialsSinceKeypairRegen = 0; // cancel the failure timeout for any pending requests for settings @@ -141,9 +142,6 @@ void DomainHandler::setSocketAndID(const QString& hostname, quint16 port, const // set the new hostname _hostname = hostname; - // FIXME - is this the right place??? - _domainConnectionRefusals.clear(); - qCDebug(networking) << "Updated domain hostname to" << _hostname; // re-set the sock addr to null and fire off a lookup of the IP address for this domain-server's hostname @@ -168,7 +166,7 @@ void DomainHandler::setSocketAndID(const QString& hostname, quint16 port, const } void DomainHandler::setIceServerHostnameAndID(const QString& iceServerHostname, const QUuid& id) { - if (id != _uuid) { + if (_iceServerSockAddr.getAddress().toString() != iceServerHostname && id != _pendingDomainID) { // re-set the domain info to connect to new domain hardReset(); diff --git a/libraries/networking/src/DomainHandler.h b/libraries/networking/src/DomainHandler.h index 226186f1d0..c33a946d98 100644 --- a/libraries/networking/src/DomainHandler.h +++ b/libraries/networking/src/DomainHandler.h @@ -72,10 +72,11 @@ public: bool isConnected() const { return _isConnected; } void setIsConnected(bool isConnected); + bool wasConnectionRefused() const { return !_domainConnectionRefusals.isEmpty(); } + bool hasSettings() const { return !_settingsObject.isEmpty(); } void requestDomainSettings(); const QJsonObject& getSettingsObject() const { return _settingsObject; } - void setPendingPath(const QString& pendingPath) { _pendingPath = pendingPath; } const QString& getPendingPath() { return _pendingPath; } diff --git a/libraries/networking/src/NodeList.cpp b/libraries/networking/src/NodeList.cpp index 082200fccc..41cfe2cfd7 100644 --- a/libraries/networking/src/NodeList.cpp +++ b/libraries/networking/src/NodeList.cpp @@ -356,7 +356,14 @@ void NodeList::sendDomainServerCheckIn() { _numNoReplyDomainCheckIns++; } - if (!_publicSockAddr.isNull() && !_domainHandler.isConnected() && !_domainHandler.getPendingDomainID().isNull()) { + const int NUM_NO_REPLY_CHECKINS_BEFORE_API_REFRESH = 2; + + if (!_publicSockAddr.isNull() + && !_domainHandler.isConnected() + && _numNoReplyDomainCheckIns > NUM_NO_REPLY_CHECKINS_BEFORE_API_REFRESH + && !_domainHandler.getPendingDomainID().isNull() + && !_domainHandler.wasConnectionRefused()) { + // if we aren't connected to the domain-server, and we have an ID // (that we presume belongs to a domain in the HF Metaverse) // we request connection information for the domain every so often to make sure what we have is up to date From e39c708bf6a2ba8b7f506c4085f6b70cc2cd907e Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Tue, 7 Jun 2016 11:10:48 -0700 Subject: [PATCH 04/10] require two triggers for API refresh, fix check for ICE domain --- libraries/networking/src/DomainHandler.cpp | 3 ++- libraries/networking/src/NodeList.cpp | 11 +++++++---- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/libraries/networking/src/DomainHandler.cpp b/libraries/networking/src/DomainHandler.cpp index 9b94c07ed2..74e38a5003 100644 --- a/libraries/networking/src/DomainHandler.cpp +++ b/libraries/networking/src/DomainHandler.cpp @@ -166,7 +166,8 @@ void DomainHandler::setSocketAndID(const QString& hostname, quint16 port, const } void DomainHandler::setIceServerHostnameAndID(const QString& iceServerHostname, const QUuid& id) { - if (_iceServerSockAddr.getAddress().toString() != iceServerHostname && id != _pendingDomainID) { + + if (_iceServerSockAddr.getAddress().toString() != iceServerHostname || id != _pendingDomainID) { // re-set the domain info to connect to new domain hardReset(); diff --git a/libraries/networking/src/NodeList.cpp b/libraries/networking/src/NodeList.cpp index 41cfe2cfd7..adb6c8e13e 100644 --- a/libraries/networking/src/NodeList.cpp +++ b/libraries/networking/src/NodeList.cpp @@ -356,19 +356,22 @@ void NodeList::sendDomainServerCheckIn() { _numNoReplyDomainCheckIns++; } - const int NUM_NO_REPLY_CHECKINS_BEFORE_API_REFRESH = 2; + static int numTriggersSinceAPIRefresh = 0; if (!_publicSockAddr.isNull() && !_domainHandler.isConnected() - && _numNoReplyDomainCheckIns > NUM_NO_REPLY_CHECKINS_BEFORE_API_REFRESH && !_domainHandler.getPendingDomainID().isNull() - && !_domainHandler.wasConnectionRefused()) { + && !_domainHandler.wasConnectionRefused() + && ++numTriggersSinceAPIRefresh > 1) { // if we aren't connected to the domain-server, and we have an ID // (that we presume belongs to a domain in the HF Metaverse) - // we request connection information for the domain every so often to make sure what we have is up to date + // we re-request connection information from the AdressManager + // every 2 failing check in attempts to make sure what we have is up to date DependencyManager::get()->refreshPreviousLookup(); + numTriggersSinceAPIRefresh = 0; + } } From c5a4a72a84ce6909338f7e88ec7f2db8e5732f42 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Tue, 7 Jun 2016 12:13:59 -0700 Subject: [PATCH 05/10] trigger domain API refresh from DomainHandler --- libraries/networking/src/DomainHandler.cpp | 33 +++++++++++++++++++--- libraries/networking/src/DomainHandler.h | 4 +-- libraries/networking/src/NodeList.cpp | 18 ------------ libraries/networking/src/NodeList.h | 1 + 4 files changed, 32 insertions(+), 24 deletions(-) diff --git a/libraries/networking/src/DomainHandler.cpp b/libraries/networking/src/DomainHandler.cpp index 74e38a5003..6880b7a329 100644 --- a/libraries/networking/src/DomainHandler.cpp +++ b/libraries/networking/src/DomainHandler.cpp @@ -14,6 +14,7 @@ #include #include +#include "AddressManager.h" #include "Assignment.h" #include "HifiSockAddr.h" #include "NodeList.h" @@ -30,7 +31,8 @@ DomainHandler::DomainHandler(QObject* parent) : QObject(parent), _sockAddr(HifiSockAddr(QHostAddress::Null, DEFAULT_DOMAIN_SERVER_PORT)), _icePeer(this), - _settingsTimer(this) + _settingsTimer(this), + _apiRefreshTimer(this) { _sockAddr.setObjectName("DomainServer"); @@ -41,6 +43,16 @@ DomainHandler::DomainHandler(QObject* parent) : static const int DOMAIN_SETTINGS_TIMEOUT_MS = 5000; _settingsTimer.setInterval(DOMAIN_SETTINGS_TIMEOUT_MS); connect(&_settingsTimer, &QTimer::timeout, this, &DomainHandler::settingsReceiveFail); + + // setup the API refresh timer for auto connection information refresh from API when failing to connect + const int API_REFRESH_TIMEOUT_MSEC = 2500; + _apiRefreshTimer.setInterval(API_REFRESH_TIMEOUT_MSEC); + + auto addressManager = DependencyManager::get(); + connect(&_apiRefreshTimer, &QTimer::timeout, addressManager.data(), &AddressManager::refreshPreviousLookup); + + // stop the refresh timer if we connect to a domain + connect(this, &DomainHandler::connectedToDomain, &_apiRefreshTimer, &QTimer::stop); } void DomainHandler::disconnect() { @@ -90,6 +102,9 @@ void DomainHandler::softReset() { // cancel the failure timeout for any pending requests for settings QMetaObject::invokeMethod(&_settingsTimer, "stop"); + + // restart the API refresh timer in case we fail to connect and need to refresh information + QMetaObject::invokeMethod(&_apiRefreshTimer, "start"); } void DomainHandler::hardReset() { @@ -134,6 +149,8 @@ void DomainHandler::setUUID(const QUuid& uuid) { void DomainHandler::setSocketAndID(const QString& hostname, quint16 port, const QUuid& domainID) { + _pendingDomainID = domainID; + if (hostname != _hostname || _sockAddr.getPort() != port) { // re-set the domain info so that auth information is reloaded hardReset(); @@ -161,8 +178,6 @@ void DomainHandler::setSocketAndID(const QString& hostname, quint16 port, const // grab the port by reading the string after the colon _sockAddr.setPort(port); } - - _pendingDomainID = domainID; } void DomainHandler::setIceServerHostnameAndID(const QString& iceServerHostname, const QUuid& id) { @@ -248,6 +263,7 @@ void DomainHandler::setIsConnected(bool isConnected) { // we've connected to new domain - time to ask it for global settings requestDomainSettings(); + } else { emit disconnectedFromDomain(); } @@ -298,6 +314,9 @@ void DomainHandler::processICEPingReplyPacket(QSharedPointer me qCDebug(networking) << "Received reply from domain-server on" << senderSockAddr; if (getIP().isNull()) { + // we're hearing back from this domain-server, no need to refresh API information + _apiRefreshTimer.stop(); + // for now we're unsafely assuming this came back from the domain if (senderSockAddr == _icePeer.getLocalSocket()) { qCDebug(networking) << "Connecting to domain using local socket"; @@ -326,10 +345,13 @@ void DomainHandler::processDTLSRequirementPacket(QSharedPointer void DomainHandler::processICEResponsePacket(QSharedPointer message) { if (_icePeer.hasSockets()) { qDebug() << "Received an ICE peer packet for domain-server but we already have sockets. Not processing."; - // bail on processing this packet if our ice peer doesn't have sockets + // bail on processing this packet if our ice peer already has sockets return; } + // start or restart the API refresh timer now that we have new information + _apiRefreshTimer.start(); + QDataStream iceResponseStream(message->getMessage()); iceResponseStream >> _icePeer; @@ -366,6 +388,9 @@ bool DomainHandler::reasonSuggestsLogin(ConnectionRefusedReason reasonCode) { } void DomainHandler::processDomainServerConnectionDeniedPacket(QSharedPointer message) { + // we're hearing from this domain-server, don't need to refresh API info + _apiRefreshTimer.stop(); + // Read deny reason from packet uint8_t reasonCodeWire; diff --git a/libraries/networking/src/DomainHandler.h b/libraries/networking/src/DomainHandler.h index c33a946d98..1328174e87 100644 --- a/libraries/networking/src/DomainHandler.h +++ b/libraries/networking/src/DomainHandler.h @@ -72,8 +72,6 @@ public: bool isConnected() const { return _isConnected; } void setIsConnected(bool isConnected); - bool wasConnectionRefused() const { return !_domainConnectionRefusals.isEmpty(); } - bool hasSettings() const { return !_settingsObject.isEmpty(); } void requestDomainSettings(); const QJsonObject& getSettingsObject() const { return _settingsObject; } @@ -149,6 +147,8 @@ private: QStringList _domainConnectionRefusals; bool _hasCheckedForAccessToken { false }; int _connectionDenialsSinceKeypairRegen { 0 }; + + QTimer _apiRefreshTimer; }; #endif // hifi_DomainHandler_h diff --git a/libraries/networking/src/NodeList.cpp b/libraries/networking/src/NodeList.cpp index adb6c8e13e..60d4a30d2b 100644 --- a/libraries/networking/src/NodeList.cpp +++ b/libraries/networking/src/NodeList.cpp @@ -355,24 +355,6 @@ void NodeList::sendDomainServerCheckIn() { // increment the count of un-replied check-ins _numNoReplyDomainCheckIns++; } - - static int numTriggersSinceAPIRefresh = 0; - - if (!_publicSockAddr.isNull() - && !_domainHandler.isConnected() - && !_domainHandler.getPendingDomainID().isNull() - && !_domainHandler.wasConnectionRefused() - && ++numTriggersSinceAPIRefresh > 1) { - - // if we aren't connected to the domain-server, and we have an ID - // (that we presume belongs to a domain in the HF Metaverse) - // we re-request connection information from the AdressManager - // every 2 failing check in attempts to make sure what we have is up to date - - DependencyManager::get()->refreshPreviousLookup(); - numTriggersSinceAPIRefresh = 0; - - } } void NodeList::handleDSPathQuery(const QString& newPath) { diff --git a/libraries/networking/src/NodeList.h b/libraries/networking/src/NodeList.h index b269554e77..e6521acbe5 100644 --- a/libraries/networking/src/NodeList.h +++ b/libraries/networking/src/NodeList.h @@ -105,6 +105,7 @@ private slots: void pingPunchForDomainServer(); void sendKeepAlivePings(); + private: NodeList() : LimitedNodeList(0, 0) { assert(false); } // Not implemented, needed for DependencyManager templates compile NodeList(char ownerType, unsigned short socketListenPort = 0, unsigned short dtlsListenPort = 0); From 4b5a5541226b89ae311f825df6211bf70ce1ceb3 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Wed, 8 Jun 2016 11:26:54 -0700 Subject: [PATCH 06/10] remove check in version downgrading from NodeList --- domain-server/src/DomainServer.cpp | 2 +- interface/src/Application.cpp | 13 ------------- interface/src/Application.h | 1 - libraries/networking/src/NodeList.cpp | 18 +++++------------- libraries/networking/src/NodeList.h | 8 -------- 5 files changed, 6 insertions(+), 36 deletions(-) diff --git a/domain-server/src/DomainServer.cpp b/domain-server/src/DomainServer.cpp index 0f5498a575..c73c55579b 100644 --- a/domain-server/src/DomainServer.cpp +++ b/domain-server/src/DomainServer.cpp @@ -324,7 +324,7 @@ bool DomainServer::packetVersionMatch(const udt::Packet& packet) { // don't understand, so we can send them an empty EntityData with our latest version and they will // warn the user that the protocol is not compatible if (headerType == PacketType::DomainConnectRequest && - headerVersion < static_cast(DomainConnectRequestVersion::HasProtocolVersions)) { + headerVersion (DomainConnectRequestVersion::HasProtocolVersions)) { auto packetWithBadVersion = NLPacket::create(PacketType::EntityData); nodeList->sendPacket(std::move(packetWithBadVersion), packet.getSenderSockAddr()); return false; diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 68e916c29e..0184fc4990 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -630,7 +630,6 @@ Application::Application(int& argc, char** argv, QElapsedTimer& startupTimer) : connect(&domainHandler, SIGNAL(connectedToDomain(const QString&)), SLOT(updateWindowTitle())); connect(&domainHandler, SIGNAL(disconnectedFromDomain()), SLOT(updateWindowTitle())); connect(&domainHandler, SIGNAL(disconnectedFromDomain()), SLOT(clearDomainOctreeDetails())); - connect(&domainHandler, &DomainHandler::resetting, nodeList.data(), &NodeList::resetDomainServerCheckInVersion); connect(&domainHandler, &DomainHandler::domainConnectionRefused, this, &Application::domainConnectionRefused); // update our location every 5 seconds in the metaverse server, assuming that we are authenticated with one @@ -654,7 +653,6 @@ Application::Application(int& argc, char** argv, QElapsedTimer& startupTimer) : connect(nodeList.data(), &NodeList::nodeActivated, this, &Application::nodeActivated); connect(nodeList.data(), &NodeList::uuidChanged, getMyAvatar(), &MyAvatar::setSessionUUID); connect(nodeList.data(), &NodeList::uuidChanged, this, &Application::setSessionUUID); - connect(nodeList.data(), &NodeList::limitOfSilentDomainCheckInsReached, this, &Application::limitOfSilentDomainCheckInsReached); connect(nodeList.data(), &NodeList::packetVersionMismatch, this, &Application::notifyPacketVersionMismatch); // connect to appropriate slots on AccountManager @@ -4619,17 +4617,6 @@ void Application::setSessionUUID(const QUuid& sessionUUID) const { Physics::setSessionUUID(sessionUUID); } - -// If we're not getting anything back from the domain server checkin, it might be that the domain speaks an -// older version of the DomainConnectRequest protocol. We will attempt to send and older version of DomainConnectRequest. -// We won't actually complete the connection, but if the server responds, we know that it needs to be upgraded (or we -// need to be downgraded to talk to it). -void Application::limitOfSilentDomainCheckInsReached() { - auto nodeList = DependencyManager::get(); - nodeList->downgradeDomainServerCheckInVersion(); // attempt to use an older domain checkin version - nodeList->reset(); -} - bool Application::askToSetAvatarUrl(const QString& url) { QUrl realUrl(url); if (realUrl.isLocalFile()) { diff --git a/interface/src/Application.h b/interface/src/Application.h index f93434f581..6b6148be32 100644 --- a/interface/src/Application.h +++ b/interface/src/Application.h @@ -318,7 +318,6 @@ private slots: bool displayAvatarAttachmentConfirmationDialog(const QString& name) const; void setSessionUUID(const QUuid& sessionUUID) const; - void limitOfSilentDomainCheckInsReached(); void domainChanged(const QString& domainHostname); void updateWindowTitle() const; diff --git a/libraries/networking/src/NodeList.cpp b/libraries/networking/src/NodeList.cpp index 60d4a30d2b..8a6e96f414 100644 --- a/libraries/networking/src/NodeList.cpp +++ b/libraries/networking/src/NodeList.cpp @@ -250,7 +250,6 @@ void NodeList::sendDomainServerCheckIn() { qCDebug(networking) << "Waiting for ICE discovered domain-server socket. Will not send domain-server check in."; handleICEConnectionToDomainServer(); } else if (!_domainHandler.getIP().isNull()) { - bool isUsingDTLS = false; PacketType domainPacketType = !_domainHandler.isConnected() ? PacketType::DomainConnectRequest : PacketType::DomainListRequest; @@ -292,8 +291,7 @@ void NodeList::sendDomainServerCheckIn() { return; } - auto packetVersion = (domainPacketType == PacketType::DomainConnectRequest) ? _domainConnectRequestVersion : 0; - auto domainPacket = NLPacket::create(domainPacketType, -1, false, false, packetVersion); + auto domainPacket = NLPacket::create(domainPacketType); QDataStream packetStream(domainPacket.get()); @@ -315,18 +313,14 @@ void NodeList::sendDomainServerCheckIn() { packetStream << connectUUID; // include the protocol version signature in our connect request - if (_domainConnectRequestVersion >= static_cast(DomainConnectRequestVersion::HasProtocolVersions)) { - QByteArray protocolVersionSig = protocolVersionsSignature(); - packetStream.writeBytes(protocolVersionSig.constData(), protocolVersionSig.size()); - } + QByteArray protocolVersionSig = protocolVersionsSignature(); + packetStream.writeBytes(protocolVersionSig.constData(), protocolVersionSig.size()); } // pack our data to send to the domain-server including // the hostname information (so the domain-server can see which place name we came in on) packetStream << _ownerType << _publicSockAddr << _localSockAddr << _nodeTypesOfInterest.toList(); - if (_domainConnectRequestVersion >= static_cast(DomainConnectRequestVersion::HasHostname)) { - packetStream << DependencyManager::get()->getPlaceName(); - } + packetStream << DependencyManager::get()->getPlaceName(); if (!_domainHandler.isConnected()) { DataServerAccountInfo& accountInfo = accountManager->getAccountInfo(); @@ -341,9 +335,7 @@ void NodeList::sendDomainServerCheckIn() { flagTimeForConnectionStep(LimitedNodeList::ConnectionStep::SendDSCheckIn); - if (!isUsingDTLS) { - sendPacket(std::move(domainPacket), _domainHandler.getSockAddr()); - } + sendPacket(std::move(domainPacket), _domainHandler.getSockAddr()); if (_numNoReplyDomainCheckIns >= MAX_SILENT_DOMAIN_SERVER_CHECK_INS) { // we haven't heard back from DS in MAX_SILENT_DOMAIN_SERVER_CHECK_INS diff --git a/libraries/networking/src/NodeList.h b/libraries/networking/src/NodeList.h index e6521acbe5..51eee744c0 100644 --- a/libraries/networking/src/NodeList.h +++ b/libraries/networking/src/NodeList.h @@ -68,9 +68,6 @@ public: void setIsShuttingDown(bool isShuttingDown) { _isShuttingDown = isShuttingDown; } - /// downgrades the DomainConnnectRequest PacketVersion to attempt to probe for older domain servers - void downgradeDomainServerCheckInVersion() { _domainConnectRequestVersion--; } - public slots: void reset(); void sendDomainServerCheckIn(); @@ -88,9 +85,6 @@ public slots: void processICEPingPacket(QSharedPointer message); - void resetDomainServerCheckInVersion() - { _domainConnectRequestVersion = versionForPacketType(PacketType::DomainConnectRequest); } - signals: void limitOfSilentDomainCheckInsReached(); void receivedDomainServerList(); @@ -130,8 +124,6 @@ private: HifiSockAddr _assignmentServerSocket; bool _isShuttingDown { false }; QTimer _keepAlivePingTimer; - - PacketVersion _domainConnectRequestVersion = versionForPacketType(PacketType::DomainConnectRequest); }; #endif // hifi_NodeList_h From f963adb5dd74a26a4cf22d46c338a978f50109b2 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Wed, 8 Jun 2016 11:47:58 -0700 Subject: [PATCH 07/10] send connection denial for connect version mismatch --- domain-server/src/DomainGatekeeper.cpp | 16 ++++++++++------ domain-server/src/DomainGatekeeper.h | 6 ++++-- domain-server/src/DomainServer.cpp | 15 +++++---------- libraries/networking/src/udt/PacketHeaders.cpp | 2 +- 4 files changed, 20 insertions(+), 19 deletions(-) diff --git a/domain-server/src/DomainGatekeeper.cpp b/domain-server/src/DomainGatekeeper.cpp index b940d46849..680b5c277b 100644 --- a/domain-server/src/DomainGatekeeper.cpp +++ b/domain-server/src/DomainGatekeeper.cpp @@ -62,10 +62,7 @@ void DomainGatekeeper::processConnectRequestPacket(QSharedPointergetSenderSockAddr(), - DomainHandler::ConnectionRefusedReason::ProtocolMismatch); + sendProtocolMismatchConnectionDenial(message->getSenderSockAddr()); return; } @@ -123,6 +120,13 @@ void DomainGatekeeper::processConnectRequestPacket(QSharedPointer 0) { diff --git a/domain-server/src/DomainGatekeeper.h b/domain-server/src/DomainGatekeeper.h index 09e3b04ed7..237f8d3185 100644 --- a/domain-server/src/DomainGatekeeper.h +++ b/domain-server/src/DomainGatekeeper.h @@ -42,6 +42,8 @@ public: void preloadAllowedUserPublicKeys(); void removeICEPeer(const QUuid& peerUUID) { _icePeers.remove(peerUUID); } + + static void sendProtocolMismatchConnectionDenial(const HifiSockAddr& senderSockAddr); public slots: void processConnectRequestPacket(QSharedPointer message); void processICEPingPacket(QSharedPointer message); @@ -76,8 +78,8 @@ private: const HifiSockAddr& senderSockAddr); void sendConnectionTokenPacket(const QString& username, const HifiSockAddr& senderSockAddr); - void sendConnectionDeniedPacket(const QString& reason, const HifiSockAddr& senderSockAddr, - DomainHandler::ConnectionRefusedReason reasonCode = DomainHandler::ConnectionRefusedReason::Unknown); + static void sendConnectionDeniedPacket(const QString& reason, const HifiSockAddr& senderSockAddr, + DomainHandler::ConnectionRefusedReason reasonCode = DomainHandler::ConnectionRefusedReason::Unknown); void pingPunchForConnectingPeer(const SharedNetworkPeer& peer); diff --git a/domain-server/src/DomainServer.cpp b/domain-server/src/DomainServer.cpp index c73c55579b..7c20817353 100644 --- a/domain-server/src/DomainServer.cpp +++ b/domain-server/src/DomainServer.cpp @@ -318,16 +318,11 @@ bool DomainServer::packetVersionMatch(const udt::Packet& packet) { auto nodeList = DependencyManager::get(); - // This implements a special case that handles OLD clients which don't know how to negotiate matching - // protocol versions. We know these clients will sent DomainConnectRequest with older versions. We also - // know these clients will show a warning dialog if they get an EntityData with a protocol version they - // don't understand, so we can send them an empty EntityData with our latest version and they will - // warn the user that the protocol is not compatible - if (headerType == PacketType::DomainConnectRequest && - headerVersion (DomainConnectRequestVersion::HasProtocolVersions)) { - auto packetWithBadVersion = NLPacket::create(PacketType::EntityData); - nodeList->sendPacket(std::move(packetWithBadVersion), packet.getSenderSockAddr()); - return false; + // if this is a mismatching connect packet, we can't simply drop it on the floor + // send back a packet to the interface that tells them we refuse connection for a mismatch + if (headerType == PacketType::DomainConnectRequest + && headerVersion != versionForPacketType(PacketType::DomainConnectRequest)) { + DomainGatekeeper::sendProtocolMismatchConnectionDenial(packet.getSenderSockAddr()); } // let the normal nodeList implementation handle all other packets. diff --git a/libraries/networking/src/udt/PacketHeaders.cpp b/libraries/networking/src/udt/PacketHeaders.cpp index db743f81e4..a891b1e422 100644 --- a/libraries/networking/src/udt/PacketHeaders.cpp +++ b/libraries/networking/src/udt/PacketHeaders.cpp @@ -67,7 +67,7 @@ PacketVersion versionForPacketType(PacketType packetType) { return static_cast(DomainConnectionDeniedVersion::IncludesReasonCode); case PacketType::DomainConnectRequest: - return static_cast(DomainConnectRequestVersion::HasProtocolVersions); + return static_cast(DomainConnectRequestVersion::HasHostname); default: return 17; From 12e5851ba4376a7a8e42633cd783f5856cce4e74 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Wed, 8 Jun 2016 11:54:31 -0700 Subject: [PATCH 08/10] fix connection denial message, put version back --- domain-server/src/DomainGatekeeper.cpp | 16 +++++++++------- interface/src/Application.cpp | 2 -- libraries/networking/src/udt/PacketHeaders.cpp | 2 +- 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/domain-server/src/DomainGatekeeper.cpp b/domain-server/src/DomainGatekeeper.cpp index 680b5c277b..ec913b27f5 100644 --- a/domain-server/src/DomainGatekeeper.cpp +++ b/domain-server/src/DomainGatekeeper.cpp @@ -120,13 +120,6 @@ void DomainGatekeeper::processConnectRequestPacket(QSharedPointer(reasonCode)) { case DomainHandler::ConnectionRefusedReason::ProtocolMismatch: - notifyPacketVersionMismatch(); - break; case DomainHandler::ConnectionRefusedReason::TooManyUsers: case DomainHandler::ConnectionRefusedReason::Unknown: { QString message = "Unable to connect to the location you are visiting.\n"; diff --git a/libraries/networking/src/udt/PacketHeaders.cpp b/libraries/networking/src/udt/PacketHeaders.cpp index a891b1e422..db743f81e4 100644 --- a/libraries/networking/src/udt/PacketHeaders.cpp +++ b/libraries/networking/src/udt/PacketHeaders.cpp @@ -67,7 +67,7 @@ PacketVersion versionForPacketType(PacketType packetType) { return static_cast(DomainConnectionDeniedVersion::IncludesReasonCode); case PacketType::DomainConnectRequest: - return static_cast(DomainConnectRequestVersion::HasHostname); + return static_cast(DomainConnectRequestVersion::HasProtocolVersions); default: return 17; From e4ebafa0d8a463f9f78a4527d1580da4622ccc6d Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Wed, 8 Jun 2016 13:38:07 -0700 Subject: [PATCH 09/10] add a menu option to force the wrong DS connect version --- interface/src/Menu.cpp | 3 +++ interface/src/Menu.h | 1 + libraries/networking/src/NLPacket.cpp | 5 +++++ libraries/networking/src/NLPacket.h | 1 + libraries/networking/src/NodeList.cpp | 7 +++++++ libraries/networking/src/NodeList.h | 8 ++++++++ 6 files changed, 25 insertions(+) diff --git a/interface/src/Menu.cpp b/interface/src/Menu.cpp index 031564fa7a..4fd5569ebd 100644 --- a/interface/src/Menu.cpp +++ b/interface/src/Menu.cpp @@ -542,6 +542,9 @@ Menu::Menu() { #if (PR_BUILD || DEV_BUILD) addCheckableActionToQMenuAndActionHash(networkMenu, MenuOption::SendWrongProtocolVersion, 0, false, qApp, SLOT(sendWrongProtocolVersionsSignature(bool))); + + addCheckableActionToQMenuAndActionHash(networkMenu, MenuOption::SendWrongDSConnectVersion, 0, false, + nodeList.data(), SLOT(toggleSendNewerDSConnectVersion(bool))); #endif diff --git a/interface/src/Menu.h b/interface/src/Menu.h index 8081e27eb8..503cbf51fa 100644 --- a/interface/src/Menu.h +++ b/interface/src/Menu.h @@ -166,6 +166,7 @@ namespace MenuOption { const QString RunTimingTests = "Run Timing Tests"; const QString ScriptEditor = "Script Editor..."; const QString ScriptedMotorControl = "Enable Scripted Motor Control"; + const QString SendWrongDSConnectVersion = "Send wrong DS connect version"; const QString SendWrongProtocolVersion = "Send wrong protocol version"; const QString SetHomeLocation = "Set Home Location"; const QString ShowDSConnectTable = "Show Domain Connection Timing"; diff --git a/libraries/networking/src/NLPacket.cpp b/libraries/networking/src/NLPacket.cpp index 34a159ae6c..a11dd69753 100644 --- a/libraries/networking/src/NLPacket.cpp +++ b/libraries/networking/src/NLPacket.cpp @@ -184,6 +184,11 @@ void NLPacket::setType(PacketType type) { writeTypeAndVersion(); } +void NLPacket::setVersion(PacketVersion version) { + _version = version; + writeTypeAndVersion(); +} + void NLPacket::readType() { _type = NLPacket::typeInHeader(*this); } diff --git a/libraries/networking/src/NLPacket.h b/libraries/networking/src/NLPacket.h index f49f8498a5..33de262dfb 100644 --- a/libraries/networking/src/NLPacket.h +++ b/libraries/networking/src/NLPacket.h @@ -65,6 +65,7 @@ public: void setType(PacketType type); PacketVersion getVersion() const { return _version; } + void setVersion(PacketVersion version); const QUuid& getSourceID() const { return _sourceID; } diff --git a/libraries/networking/src/NodeList.cpp b/libraries/networking/src/NodeList.cpp index 8a6e96f414..8375cd0b1e 100644 --- a/libraries/networking/src/NodeList.cpp +++ b/libraries/networking/src/NodeList.cpp @@ -296,6 +296,13 @@ void NodeList::sendDomainServerCheckIn() { QDataStream packetStream(domainPacket.get()); if (domainPacketType == PacketType::DomainConnectRequest) { + +#if (PR_BUILD || DEV_BUILD) + if (_shouldSendNewerVersion) { + domainPacket->setVersion(versionForPacketType(domainPacketType) + 1); + } +#endif + QUuid connectUUID; if (!_domainHandler.getAssignmentUUID().isNull()) { diff --git a/libraries/networking/src/NodeList.h b/libraries/networking/src/NodeList.h index 51eee744c0..3fbc86c736 100644 --- a/libraries/networking/src/NodeList.h +++ b/libraries/networking/src/NodeList.h @@ -85,6 +85,10 @@ public slots: void processICEPingPacket(QSharedPointer message); +#if (PR_BUILD || DEV_BUILD) + void toggleSendNewerDSConnectVersion(bool shouldSendNewerVersion) { _shouldSendNewerVersion = shouldSendNewerVersion; } +#endif + signals: void limitOfSilentDomainCheckInsReached(); void receivedDomainServerList(); @@ -124,6 +128,10 @@ private: HifiSockAddr _assignmentServerSocket; bool _isShuttingDown { false }; QTimer _keepAlivePingTimer; + +#if (PR_BUILD || DEV_BUILD) + bool _shouldSendNewerVersion { false }; +#endif }; #endif // hifi_NodeList_h From 3c4f336e728a637778dca5e1434393360bd99f56 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Fri, 10 Jun 2016 09:11:25 -0700 Subject: [PATCH 10/10] re-instate NodeList reset on limit of check ins reached --- interface/src/Application.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 90d8b677fe..504d573678 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -655,6 +655,9 @@ Application::Application(int& argc, char** argv, QElapsedTimer& startupTimer) : connect(nodeList.data(), &NodeList::uuidChanged, this, &Application::setSessionUUID); connect(nodeList.data(), &NodeList::packetVersionMismatch, this, &Application::notifyPacketVersionMismatch); + // you might think we could just do this in NodeList but we only want this connection for Interface + connect(nodeList.data(), &NodeList::limitOfSilentDomainCheckInsReached, nodeList.data(), &NodeList::reset); + // connect to appropriate slots on AccountManager auto accountManager = DependencyManager::get();