diff --git a/domain-server/src/DomainServer.cpp b/domain-server/src/DomainServer.cpp index 73092b694b..cea5bec3ef 100644 --- a/domain-server/src/DomainServer.cpp +++ b/domain-server/src/DomainServer.cpp @@ -549,7 +549,9 @@ void DomainServer::populateDefaultStaticAssignmentsExcludingTypes(const QSet(static_cast(defaultedType) + 1)) { - if (!excludedTypes.contains(defaultedType) && defaultedType != Assignment::AgentType) { + if (!excludedTypes.contains(defaultedType) + && defaultedType != Assignment::UNUSED + && defaultedType != Assignment::AgentType) { // type has not been set from a command line or config file config, use the default // by clearing whatever exists and writing a single default assignment with no payload Assignment* newAssignment = new Assignment(Assignment::CreateCommand, (Assignment::Type) defaultedType); diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index a7b91db315..8c482d26ce 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -309,13 +309,6 @@ Application::Application(int& argc, char** argv, QElapsedTimer &startup_time) : // use our MyAvatar position and quat for address manager path addressManager.setPositionGetter(getPositionForPath); addressManager.setOrientationGetter(getOrientationForPath); - - // handle domain change signals from AddressManager - connect(&addressManager, &AddressManager::possibleDomainChangeRequiredToHostname, - this, &Application::changeDomainHostname); - - connect(&addressManager, &AddressManager::possibleDomainChangeRequiredViaICEForID, - &domainHandler, &DomainHandler::setIceServerHostnameAndID); _settings = new QSettings(this); _numChangedSettings = 0; @@ -1433,7 +1426,7 @@ void Application::dropEvent(QDropEvent *event) { SnapshotMetaData* snapshotData = Snapshot::parseSnapshotData(snapshotPath); if (snapshotData) { if (!snapshotData->getDomain().isEmpty()) { - changeDomainHostname(snapshotData->getDomain()); + NodeList::getInstance()->getDomainHandler().setHostnameAndPort(snapshotData->getDomain()); } _myAvatar->setPosition(snapshotData->getLocation()); @@ -3698,19 +3691,6 @@ void Application::updateLocationInServer() { } } -void Application::changeDomainHostname(const QString &newDomainHostname) { - NodeList* nodeList = NodeList::getInstance(); - - if (!nodeList->getDomainHandler().isCurrentHostname(newDomainHostname)) { - // tell the MyAvatar object to send a kill packet so that it dissapears from its old avatar mixer immediately - _myAvatar->sendKillAvatar(); - - // call the domain hostname change as a queued connection on the nodelist - QMetaObject::invokeMethod(&NodeList::getInstance()->getDomainHandler(), "setHostname", - Q_ARG(const QString&, newDomainHostname)); - } -} - void Application::clearDomainOctreeDetails() { qDebug() << "Clearing domain octree details..."; // reset the environment so that we don't erroneously end up with multiple diff --git a/interface/src/Application.h b/interface/src/Application.h index 111f03c7c6..041e5e6b5b 100644 --- a/interface/src/Application.h +++ b/interface/src/Application.h @@ -335,7 +335,6 @@ signals: void importDone(); public slots: - void changeDomainHostname(const QString& newDomainHostname); void domainChanged(const QString& domainHostname); void updateWindowTitle(); void updateLocationInServer(); diff --git a/interface/src/ui/AddressBarDialog.cpp b/interface/src/ui/AddressBarDialog.cpp index 5f55aa5210..75049f9ed4 100644 --- a/interface/src/ui/AddressBarDialog.cpp +++ b/interface/src/ui/AddressBarDialog.cpp @@ -116,8 +116,9 @@ void AddressBarDialog::setupUI() { void AddressBarDialog::showEvent(QShowEvent* event) { _goButton->setIcon(QIcon(PathUtils::resourcesPath() + ADDRESSBAR_GO_BUTTON_ICON)); - _addressLineEdit->setText(QString()); + _addressLineEdit->setText(AddressManager::getInstance().currentAddress().toString()); _addressLineEdit->setFocus(); + _addressLineEdit->selectAll(); FramelessDialog::showEvent(event); } diff --git a/libraries/networking/src/AddressManager.cpp b/libraries/networking/src/AddressManager.cpp index 81b3a1328b..f9789ff97e 100644 --- a/libraries/networking/src/AddressManager.cpp +++ b/libraries/networking/src/AddressManager.cpp @@ -107,7 +107,8 @@ bool AddressManager::handleUrl(const QUrl& lookupUrl) { if (!handleUsername(lookupUrl.authority())) { // we're assuming this is either a network address or global place name // check if it is a network address first - if (!handleNetworkAddress(lookupUrl.host())) { + if (!handleNetworkAddress(lookupUrl.host() + + (lookupUrl.port() == -1 ? "" : ":" + QString::number(lookupUrl.port())))) { // wasn't an address - lookup the place name attemptPlaceNameLookup(lookupUrl.host()); } @@ -172,7 +173,7 @@ void AddressManager::goToAddressFromObject(const QVariantMap& addressMap) { if (domainObject.contains(DOMAIN_NETWORK_ADDRESS_KEY)) { QString domainHostname = domainObject[DOMAIN_NETWORK_ADDRESS_KEY].toString(); - emit possibleDomainChangeRequiredToHostname(domainHostname); + emit possibleDomainChangeRequired(domainHostname, DEFAULT_DOMAIN_SERVER_PORT); } else { QString iceServerAddress = domainObject[DOMAIN_ICE_SERVER_ADDRESS_KEY].toString(); @@ -240,30 +241,40 @@ void AddressManager::attemptPlaceNameLookup(const QString& lookupString) { } bool AddressManager::handleNetworkAddress(const QString& lookupString) { - const QString IP_ADDRESS_REGEX_STRING = "^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\\.){3}" - "([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])(:\\d{1,5})?$"; + const QString IP_ADDRESS_REGEX_STRING = "^((?:(?:[0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\\.){3}" + "(?:[0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5]))(?::(\\d{1,5}))?$"; const QString HOSTNAME_REGEX_STRING = "^((?:[A-Z0-9]|[A-Z0-9][A-Z0-9\\-]{0,61}[A-Z0-9])" - "(?:\\.(?:[A-Z0-9]|[A-Z0-9][A-Z0-9\\-]{0,61}[A-Z0-9]))+|localhost)(:{1}\\d{1,5})?$"; - - QRegExp hostnameRegex(HOSTNAME_REGEX_STRING, Qt::CaseInsensitive); - - if (hostnameRegex.indexIn(lookupString) != -1) { - QString domainHostname = hostnameRegex.cap(0); - - emit lookupResultsFinished(); - setDomainHostnameAndName(domainHostname); - - return true; - } + "(?:\\.(?:[A-Z0-9]|[A-Z0-9][A-Z0-9\\-]{0,61}[A-Z0-9]))+|localhost)(?::(\\d{1,5}))?$"; QRegExp ipAddressRegex(IP_ADDRESS_REGEX_STRING); if (ipAddressRegex.indexIn(lookupString) != -1) { - QString domainIPString = ipAddressRegex.cap(0); + QString domainIPString = ipAddressRegex.cap(1); + + qint16 domainPort = DEFAULT_DOMAIN_SERVER_PORT; + if (!ipAddressRegex.cap(2).isEmpty()) { + domainPort = (qint16) ipAddressRegex.cap(2).toInt(); + } emit lookupResultsFinished(); - setDomainHostnameAndName(domainIPString); + setDomainInfo(domainIPString, domainPort); + + return true; + } + + QRegExp hostnameRegex(HOSTNAME_REGEX_STRING, Qt::CaseInsensitive); + + if (hostnameRegex.indexIn(lookupString) != -1) { + QString domainHostname = hostnameRegex.cap(1); + + qint16 domainPort = DEFAULT_DOMAIN_SERVER_PORT; + if (!hostnameRegex.cap(2).isEmpty()) { + domainPort = (qint16) hostnameRegex.cap(2).toInt(); + } + + emit lookupResultsFinished(); + setDomainInfo(domainHostname, domainPort); return true; } @@ -339,9 +350,9 @@ bool AddressManager::handleUsername(const QString& lookupString) { } -void AddressManager::setDomainHostnameAndName(const QString& hostname, const QString& domainName) { +void AddressManager::setDomainInfo(const QString& hostname, quint16 port, const QString& domainName) { _currentDomain = domainName.isEmpty() ? hostname : domainName; - emit possibleDomainChangeRequiredToHostname(hostname); + emit possibleDomainChangeRequired(hostname, port); } void AddressManager::goToUser(const QString& username) { diff --git a/libraries/networking/src/AddressManager.h b/libraries/networking/src/AddressManager.h index cfdaaa7d41..7a83144488 100644 --- a/libraries/networking/src/AddressManager.h +++ b/libraries/networking/src/AddressManager.h @@ -59,7 +59,7 @@ signals: void lookupResultsFinished(); void lookupResultIsOffline(); void lookupResultIsNotFound(); - void possibleDomainChangeRequiredToHostname(const QString& newHostname); + void possibleDomainChangeRequired(const QString& newHostname, quint16 newPort); void possibleDomainChangeRequiredViaICEForID(const QString& iceServerHostname, const QUuid& domainID); void locationChangeRequired(const glm::vec3& newPosition, bool hasOrientationChange, const glm::quat& newOrientation, @@ -70,7 +70,7 @@ private slots: private: AddressManager(); - void setDomainHostnameAndName(const QString& hostname, const QString& domainName = QString()); + void setDomainInfo(const QString& hostname, quint16 port, const QString& domainName = QString()); const JSONCallbackParameters& apiCallbackParameters(); diff --git a/libraries/networking/src/DomainHandler.cpp b/libraries/networking/src/DomainHandler.cpp index 6091b0cdd2..126ef27414 100644 --- a/libraries/networking/src/DomainHandler.cpp +++ b/libraries/networking/src/DomainHandler.cpp @@ -97,46 +97,32 @@ void DomainHandler::setUUID(const QUuid& uuid) { } } -QString DomainHandler::hostnameWithoutPort(const QString& hostname) { - int colonIndex = hostname.indexOf(':'); - return colonIndex > 0 ? hostname.left(colonIndex) : hostname; -} - -bool DomainHandler::isCurrentHostname(const QString& hostname) { - return hostnameWithoutPort(hostname) == _hostname; -} - -void DomainHandler::setHostname(const QString& hostname) { +void DomainHandler::setHostnameAndPort(const QString& hostname, quint16 port) { - if (hostname != _hostname) { + if (hostname != _hostname || _sockAddr.getPort() != port) { // re-set the domain info so that auth information is reloaded hardReset(); - int colonIndex = hostname.indexOf(':'); - - if (colonIndex > 0) { - // the user has included a custom DS port with the hostname - - // the new hostname is everything up to the colon - _hostname = hostname.left(colonIndex); - - // grab the port by reading the string after the colon - _sockAddr.setPort(atoi(hostname.mid(colonIndex + 1, hostname.size()).toLocal8Bit().constData())); - - qDebug() << "Updated hostname to" << _hostname << "and port to" << _sockAddr.getPort(); - - } else { - // no port included with the hostname, simply set the member variable and reset the domain server port to default + if (hostname != _hostname) { + // set the new hostname _hostname = hostname; - _sockAddr.setPort(DEFAULT_DOMAIN_SERVER_PORT); + + qDebug() << "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 + qDebug("Looking up DS hostname %s.", _hostname.toLocal8Bit().constData()); + QHostInfo::lookupHost(_hostname, this, SLOT(completedHostnameLookup(const QHostInfo&))); + + UserActivityLogger::getInstance().changedDomain(_hostname); + emit hostnameChanged(_hostname); } - // re-set the sock addr to null and fire off a lookup of the IP address for this domain-server's hostname - qDebug("Looking up DS hostname %s.", _hostname.toLocal8Bit().constData()); - QHostInfo::lookupHost(_hostname, this, SLOT(completedHostnameLookup(const QHostInfo&))); + if (_sockAddr.getPort() != port) { + qDebug() << "Updated domain port to" << port; + } - UserActivityLogger::getInstance().changedDomain(_hostname); - emit hostnameChanged(_hostname); + // grab the port by reading the string after the colon + _sockAddr.setPort(port); } } diff --git a/libraries/networking/src/DomainHandler.h b/libraries/networking/src/DomainHandler.h index a27a5d1dd8..295e6eac01 100644 --- a/libraries/networking/src/DomainHandler.h +++ b/libraries/networking/src/DomainHandler.h @@ -37,9 +37,7 @@ public: const QUuid& getUUID() const { return _uuid; } void setUUID(const QUuid& uuid); - - static QString hostnameWithoutPort(const QString& hostname); - bool isCurrentHostname(const QString& hostname); + const QString& getHostname() const { return _hostname; } const QHostAddress& getIP() const { return _sockAddr.getAddress(); } @@ -75,7 +73,7 @@ public: void softReset(); public slots: - void setHostname(const QString& hostname); + void setHostnameAndPort(const QString& hostname, quint16 port = DEFAULT_DOMAIN_SERVER_PORT); void setIceServerHostnameAndID(const QString& iceServerHostname, const QUuid& id); private slots: diff --git a/libraries/networking/src/NodeList.cpp b/libraries/networking/src/NodeList.cpp index bf992e7b88..6f6c84f947 100644 --- a/libraries/networking/src/NodeList.cpp +++ b/libraries/networking/src/NodeList.cpp @@ -18,6 +18,7 @@ #include #include "AccountManager.h" +#include "AddressManager.h" #include "Assignment.h" #include "HifiSockAddr.h" #include "NodeList.h" @@ -62,6 +63,15 @@ NodeList::NodeList(char newOwnerType, unsigned short socketListenPort, unsigned _hasCompletedInitialSTUNFailure(false), _stunRequestsSinceSuccess(0) { + AddressManager& addressManager = AddressManager::getInstance(); + + // handle domain change signals from AddressManager + connect(&addressManager, &AddressManager::possibleDomainChangeRequired, + &_domainHandler, &DomainHandler::setHostnameAndPort); + + connect(&addressManager, &AddressManager::possibleDomainChangeRequiredViaICEForID, + &_domainHandler, &DomainHandler::setIceServerHostnameAndID); + // clear our NodeList when the domain changes connect(&_domainHandler, &DomainHandler::disconnectedFromDomain, this, &NodeList::reset);