From 44083dd34325e3c581ea857029aba4a5ce6b47a6 Mon Sep 17 00:00:00 2001 From: David Rowe Date: Tue, 27 Jan 2015 13:10:11 -0800 Subject: [PATCH] Add user warning if domain has mismatched packet versions --- interface/src/Application.cpp | 24 ++++++++++++++++--- interface/src/Application.h | 4 ++++ .../src/octree/OctreePacketProcessor.cpp | 3 ++- interface/src/octree/OctreePacketProcessor.h | 4 ++++ libraries/networking/src/LimitedNodeList.cpp | 2 ++ libraries/networking/src/LimitedNodeList.h | 2 ++ 6 files changed, 35 insertions(+), 4 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 86af8b0e91..80766f0c24 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -221,7 +221,8 @@ Application::Application(int& argc, char** argv, QElapsedTimer &startup_time) : _lastNackTime(usecTimestampNow()), _lastSendDownstreamAudioStats(usecTimestampNow()), _isVSyncOn(true), - _aboutToQuit(false) + _aboutToQuit(false), + _notifiedPacketVersionMismatchThisDomain(false) { auto glCanvas = DependencyManager::get(); auto nodeList = DependencyManager::get(); @@ -305,6 +306,7 @@ Application::Application(int& argc, char** argv, QElapsedTimer &startup_time) : connect(nodeList.data(), SIGNAL(nodeKilled(SharedNodePointer)), SLOT(nodeKilled(SharedNodePointer))); connect(nodeList.data(), &NodeList::uuidChanged, _myAvatar, &MyAvatar::setSessionUUID); connect(nodeList.data(), &NodeList::limitOfSilentDomainCheckInsReached, nodeList.data(), &NodeList::reset); + connect(nodeList.data(), &NodeList::packetVersionMismatch, this, &Application::notifyPacketVersionMismatch); // connect to appropriate slots on AccountManager AccountManager& accountManager = AccountManager::getInstance(); @@ -576,6 +578,7 @@ void Application::initializeGL() { // create thread for parsing of octee data independent of the main network and rendering threads _octreeProcessor.initialize(_enableProcessOctreeThread); + connect(&_octreeProcessor, &OctreePacketProcessor::packetVersionMismatch, this, &Application::notifyPacketVersionMismatch); _entityEditSender.initialize(_enableProcessOctreeThread); // call our timer function every second @@ -3218,11 +3221,11 @@ void Application::connectedToDomain(const QString& hostname) { if (accountManager.isLoggedIn() && !domainID.isNull()) { // update our data-server with the domain-server we're logged in with - QString domainPutJsonString = "{\"location\":{\"domain_id\":\"" + uuidStringWithoutCurlyBraces(domainID) + "\"}}"; - accountManager.authenticatedRequest("/api/v1/user/location", QNetworkAccessManager::PutOperation, JSONCallbackParameters(), domainPutJsonString.toUtf8()); + + _notifiedPacketVersionMismatchThisDomain = false; } } @@ -3988,3 +3991,18 @@ int Application::getRenderAmbientLight() const { return -1; } } + +void Application::notifyPacketVersionMismatch() { + if (!_notifiedPacketVersionMismatchThisDomain) { + _notifiedPacketVersionMismatchThisDomain = true; + + QString message = "The location you are visiting is running an incompatible server version.\n"; + message += "Content may not display properly."; + + QMessageBox msgBox; + msgBox.setText(message); + msgBox.setStandardButtons(QMessageBox::Ok); + msgBox.setIcon(QMessageBox::Warning); + msgBox.exec(); + } +} diff --git a/interface/src/Application.h b/interface/src/Application.h index 3b793978a8..7dd3e30017 100644 --- a/interface/src/Application.h +++ b/interface/src/Application.h @@ -361,6 +361,8 @@ public slots: void resetSensors(); + void notifyPacketVersionMismatch(); + private slots: void clearDomainOctreeDetails(); void timer(); @@ -579,6 +581,8 @@ private: bool _aboutToQuit; Bookmarks* _bookmarks; + + bool _notifiedPacketVersionMismatchThisDomain; }; #endif // hifi_Application_h diff --git a/interface/src/octree/OctreePacketProcessor.cpp b/interface/src/octree/OctreePacketProcessor.cpp index 7129debd34..65a5c6f1a1 100644 --- a/interface/src/octree/OctreePacketProcessor.cpp +++ b/interface/src/octree/OctreePacketProcessor.cpp @@ -68,11 +68,12 @@ void OctreePacketProcessor::processPacket(const SharedNodePointer& sendingNode, << senderUUID << "sent" << (int)packetVersion << "but" << (int)expectedVersion << "expected."; + emit packetVersionMismatch(); + versionDebugSuppressMap.insert(senderUUID, voxelPacketType); } return; // bail since piggyback version doesn't match } - app->trackIncomingOctreePacket(mutablePacket, sendingNode, wasStatsPacket); diff --git a/interface/src/octree/OctreePacketProcessor.h b/interface/src/octree/OctreePacketProcessor.h index abdf271cfb..5c52dec002 100644 --- a/interface/src/octree/OctreePacketProcessor.h +++ b/interface/src/octree/OctreePacketProcessor.h @@ -18,6 +18,10 @@ /// the user is responsible for reading inbound packets and adding them to the processing queue by calling queueReceivedPacket() class OctreePacketProcessor : public ReceivedPacketProcessor { Q_OBJECT + +signals: + void packetVersionMismatch(); + protected: virtual void processPacket(const SharedNodePointer& sendingNode, const QByteArray& packet); }; diff --git a/libraries/networking/src/LimitedNodeList.cpp b/libraries/networking/src/LimitedNodeList.cpp index 5bf416af7f..75d83e9647 100644 --- a/libraries/networking/src/LimitedNodeList.cpp +++ b/libraries/networking/src/LimitedNodeList.cpp @@ -169,6 +169,8 @@ bool LimitedNodeList::packetVersionAndHashMatch(const QByteArray& packet) { qDebug() << "Packet version mismatch on" << packetTypeForPacket(packet) << "- Sender" << uuidFromPacketHeader(packet) << "sent" << qPrintable(QString::number(packet[numPacketTypeBytes])) << "but" << qPrintable(QString::number(versionForPacketType(mismatchType))) << "expected."; + + emit packetVersionMismatch(); versionDebugSuppressMap.insert(senderUUID, checkType); } diff --git a/libraries/networking/src/LimitedNodeList.h b/libraries/networking/src/LimitedNodeList.h index 1c841637df..8a9ad09148 100644 --- a/libraries/networking/src/LimitedNodeList.h +++ b/libraries/networking/src/LimitedNodeList.h @@ -180,6 +180,8 @@ signals: void localSockAddrChanged(const HifiSockAddr& localSockAddr); void publicSockAddrChanged(const HifiSockAddr& publicSockAddr); + + void packetVersionMismatch(); protected: LimitedNodeList(unsigned short socketListenPort = 0, unsigned short dtlsListenPort = 0);