From 216e47b29a79fdce98e6cab450c6281e05a7fd84 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Fri, 8 Jul 2016 09:43:11 -0700 Subject: [PATCH 1/9] hide the long URL prefix of scripts from marketplace --- interface/src/Application.cpp | 10 +++++++++- interface/src/Application.h | 2 +- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 82cbaf93c2..93465c8228 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -4804,9 +4804,17 @@ bool Application::askToSetAvatarUrl(const QString& url) { } -bool Application::askToLoadScript(const QString& scriptFilenameOrURL) { +bool Application::askToLoadScript(QString scriptFilenameOrURL) { QMessageBox::StandardButton reply; + + static const QString MARKETPLACE_SCRIPT_URL_HOSTNAME_SUFFIX = "mpassets.highfidelity.com"; + + if (scriptFilenameOrURL.contains(MARKETPLACE_SCRIPT_URL_HOSTNAME_SUFFIX)) { + scriptFilenameOrURL = scriptFilenameOrURL.mid(scriptFilenameOrURL.lastIndexOf('/') + 1); + } + QString message = "Would you like to run this script:\n" + scriptFilenameOrURL; + reply = OffscreenUi::question(getWindow(), "Run Script", message, QMessageBox::Yes | QMessageBox::No); if (reply == QMessageBox::Yes) { diff --git a/interface/src/Application.h b/interface/src/Application.h index 6857ba2a3a..234d79dc0d 100644 --- a/interface/src/Application.h +++ b/interface/src/Application.h @@ -329,7 +329,7 @@ private slots: bool acceptSnapshot(const QString& urlString); bool askToSetAvatarUrl(const QString& url); - bool askToLoadScript(const QString& scriptFilenameOrURL); + bool askToLoadScript(QString scriptFilenameOrURL); bool askToWearAvatarAttachmentUrl(const QString& url); void displayAvatarAttachmentWarning(const QString& message) const; From 5bce924eda4dcb16be76ddd89346cd1503c47474 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Fri, 8 Jul 2016 10:11:59 -0700 Subject: [PATCH 2/9] keep signature for askToLoadScript --- interface/src/Application.cpp | 9 +++++---- interface/src/Application.h | 2 +- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 93465c8228..94dc26693f 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -4804,16 +4804,17 @@ bool Application::askToSetAvatarUrl(const QString& url) { } -bool Application::askToLoadScript(QString scriptFilenameOrURL) { +bool Application::askToLoadScript(const QString& scriptFilenameOrURL) { QMessageBox::StandardButton reply; static const QString MARKETPLACE_SCRIPT_URL_HOSTNAME_SUFFIX = "mpassets.highfidelity.com"; - if (scriptFilenameOrURL.contains(MARKETPLACE_SCRIPT_URL_HOSTNAME_SUFFIX)) { - scriptFilenameOrURL = scriptFilenameOrURL.mid(scriptFilenameOrURL.lastIndexOf('/') + 1); + QString shortName = scriptFilenameOrURL; + if (shortName.contains(MARKETPLACE_SCRIPT_URL_HOSTNAME_SUFFIX)) { + shortName = shortName.mid(shortName.lastIndexOf('/') + 1); } - QString message = "Would you like to run this script:\n" + scriptFilenameOrURL; + QString message = "Would you like to run this script:\n" + shortName; reply = OffscreenUi::question(getWindow(), "Run Script", message, QMessageBox::Yes | QMessageBox::No); diff --git a/interface/src/Application.h b/interface/src/Application.h index 234d79dc0d..6857ba2a3a 100644 --- a/interface/src/Application.h +++ b/interface/src/Application.h @@ -329,7 +329,7 @@ private slots: bool acceptSnapshot(const QString& urlString); bool askToSetAvatarUrl(const QString& url); - bool askToLoadScript(QString scriptFilenameOrURL); + bool askToLoadScript(const QString& scriptFilenameOrURL); bool askToWearAvatarAttachmentUrl(const QString& url); void displayAvatarAttachmentWarning(const QString& message) const; From 70cf25bd8bb42ff6c7cd82b1e4df00f6ef8c1862 Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Fri, 8 Jul 2016 15:10:18 -0700 Subject: [PATCH 3/9] Add missing read locks to LimitedNodeList's hash --- libraries/networking/src/LimitedNodeList.cpp | 1 + libraries/networking/src/LimitedNodeList.h | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/libraries/networking/src/LimitedNodeList.cpp b/libraries/networking/src/LimitedNodeList.cpp index d7a2d47fab..a03fa43093 100644 --- a/libraries/networking/src/LimitedNodeList.cpp +++ b/libraries/networking/src/LimitedNodeList.cpp @@ -522,6 +522,7 @@ SharedNodePointer LimitedNodeList::addOrUpdateNode(const QUuid& uuid, NodeType_t const HifiSockAddr& publicSocket, const HifiSockAddr& localSocket, const NodePermissions& permissions, const QUuid& connectionSecret) { + QReadLocker readLocker(&_nodeMutex); NodeHash::const_iterator it = _nodeHash.find(uuid); if (it != _nodeHash.end()) { diff --git a/libraries/networking/src/LimitedNodeList.h b/libraries/networking/src/LimitedNodeList.h index 483aa0734c..c9054ac6d7 100644 --- a/libraries/networking/src/LimitedNodeList.h +++ b/libraries/networking/src/LimitedNodeList.h @@ -131,7 +131,7 @@ public: std::function linkedDataCreateCallback; - size_t size() const { return _nodeHash.size(); } + size_t size() const { QReadLocker readLock(&_nodeMutex); return _nodeHash.size(); } SharedNodePointer nodeWithUUID(const QUuid& nodeUUID); @@ -287,7 +287,7 @@ protected: QUuid _sessionUUID; NodeHash _nodeHash; - QReadWriteLock _nodeMutex; + mutable QReadWriteLock _nodeMutex; udt::Socket _nodeSocket; QUdpSocket* _dtlsSocket; HifiSockAddr _localSockAddr; From 97da515585d4283986beb34eb8caa4ce435c6479 Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Fri, 8 Jul 2016 15:10:48 -0700 Subject: [PATCH 4/9] Assign random UUID to DS without one. --- domain-server/src/DomainServer.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/domain-server/src/DomainServer.cpp b/domain-server/src/DomainServer.cpp index d75a2c3245..8b3f09d1f7 100644 --- a/domain-server/src/DomainServer.cpp +++ b/domain-server/src/DomainServer.cpp @@ -389,6 +389,8 @@ void DomainServer::setupNodeListAndAssignments() { const QVariant* idValueVariant = valueForKeyPath(settingsMap, METAVERSE_DOMAIN_ID_KEY_PATH); if (idValueVariant) { nodeList->setSessionUUID(idValueVariant->toString()); + } else { + nodeList->setSessionUUID(QUuid::createUuid()); // Use random UUID } connect(nodeList.data(), &LimitedNodeList::nodeAdded, this, &DomainServer::nodeAdded); From b665f38c1f868e9eab9ca13d99b10ec2234b2f3a Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Fri, 8 Jul 2016 15:15:25 -0700 Subject: [PATCH 5/9] Don't process DomainList packets from 2 DS case 1037 --- libraries/networking/src/NodeList.cpp | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/libraries/networking/src/NodeList.cpp b/libraries/networking/src/NodeList.cpp index fd1442d639..9678a0e2c6 100644 --- a/libraries/networking/src/NodeList.cpp +++ b/libraries/networking/src/NodeList.cpp @@ -513,9 +513,16 @@ void NodeList::processDomainServerConnectionTokenPacket(QSharedPointer message) { if (_domainHandler.getSockAddr().isNull()) { + qWarning() << "IGNORING DomainList packet while not connect to a Domain Server"; // refuse to process this packet if we aren't currently connected to the DS return; } + auto domainUuid = _domainHandler.getUUID(); + auto messageSourceUuid = message->getSourceID(); + if (!domainUuid.isNull() && domainUuid != messageSourceUuid) { + qWarning() << "IGNORING DomainList packet from" << messageSourceUuid << "while connected to" << domainUuid; + return; + } // this is a packet from the domain server, reset the count of un-replied check-ins _numNoReplyDomainCheckIns = 0; From 43967dc9a629111221be0f899697d5d4474eb0eb Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Fri, 8 Jul 2016 15:47:56 -0700 Subject: [PATCH 6/9] handle running of non .svo.json JSON files from mp CDN --- interface/src/Application.cpp | 29 +++++++++++++++++++++++------ interface/src/Application.h | 1 + 2 files changed, 24 insertions(+), 6 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 94dc26693f..94ede3ca83 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -170,7 +170,8 @@ static QTimer pingTimer; static const QString SNAPSHOT_EXTENSION = ".jpg"; static const QString SVO_EXTENSION = ".svo"; -static const QString SVO_JSON_EXTENSION = ".svo.json"; +static const QString SVO_JSON_EXTENSION = ".svo.json"; +static const QString JSON_EXTENSION = ".json"; static const QString JS_EXTENSION = ".js"; static const QString FST_EXTENSION = ".fst"; static const QString FBX_EXTENSION = ".fbx"; @@ -202,13 +203,16 @@ static const QString DESKTOP_LOCATION = QStandardPaths::writableLocation(QStanda Setting::Handle maxOctreePacketsPerSecond("maxOctreePPS", DEFAULT_MAX_OCTREE_PPS); +static const QString MARKETPLACE_CDN_HOSTNAME = "mpassets.highfidelity.com"; + const QHash Application::_acceptedExtensions { { SNAPSHOT_EXTENSION, &Application::acceptSnapshot }, { SVO_EXTENSION, &Application::importSVOFromURL }, { SVO_JSON_EXTENSION, &Application::importSVOFromURL }, + { AVA_JSON_EXTENSION, &Application::askToWearAvatarAttachmentUrl }, + { JSON_EXTENSION, &Application::importJSONFromURL }, { JS_EXTENSION, &Application::askToLoadScript }, - { FST_EXTENSION, &Application::askToSetAvatarUrl }, - { AVA_JSON_EXTENSION, &Application::askToWearAvatarAttachmentUrl } + { FST_EXTENSION, &Application::askToSetAvatarUrl } }; class DeadlockWatchdogThread : public QThread { @@ -1969,7 +1973,22 @@ void Application::resizeGL() { } } +bool Application::importJSONFromURL(const QString& urlString) { + // we only load files that terminate in just .json (not .svo.json and not .ava.json) + // if they come from the High Fidelity Marketplace Assets CDN + + QUrl jsonURL { urlString }; + + if (jsonURL.host().endsWith(MARKETPLACE_CDN_HOSTNAME)) { + emit svoImportRequested(urlString); + return true; + } else { + return false; + } +} + bool Application::importSVOFromURL(const QString& urlString) { + emit svoImportRequested(urlString); return true; } @@ -4807,10 +4826,8 @@ bool Application::askToSetAvatarUrl(const QString& url) { bool Application::askToLoadScript(const QString& scriptFilenameOrURL) { QMessageBox::StandardButton reply; - static const QString MARKETPLACE_SCRIPT_URL_HOSTNAME_SUFFIX = "mpassets.highfidelity.com"; - QString shortName = scriptFilenameOrURL; - if (shortName.contains(MARKETPLACE_SCRIPT_URL_HOSTNAME_SUFFIX)) { + if (shortName.contains(MARKETPLACE_CDN_HOSTNAME)) { shortName = shortName.mid(shortName.lastIndexOf('/') + 1); } diff --git a/interface/src/Application.h b/interface/src/Application.h index 6857ba2a3a..1ccef79198 100644 --- a/interface/src/Application.h +++ b/interface/src/Application.h @@ -380,6 +380,7 @@ private: void displaySide(RenderArgs* renderArgs, Camera& whichCamera, bool selfAvatarOnly = false); + bool importJSONFromURL(const QString& urlString); bool importSVOFromURL(const QString& urlString); bool nearbyEntitiesAreReadyForPhysics(); From 11aafc0f48fc3c574c77f87864ae1d908e73d0cb Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Fri, 8 Jul 2016 16:00:06 -0700 Subject: [PATCH 7/9] use endsWith for scriptURL check --- interface/src/Application.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 94ede3ca83..b58fa57d3f 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -4827,7 +4827,10 @@ bool Application::askToLoadScript(const QString& scriptFilenameOrURL) { QMessageBox::StandardButton reply; QString shortName = scriptFilenameOrURL; - if (shortName.contains(MARKETPLACE_CDN_HOSTNAME)) { + + QUrl scriptURL { scriptFilenameOrURL }; + + if (scriptURL.host().endsWith(MARKETPLACE_CDN_HOSTNAME)) { shortName = shortName.mid(shortName.lastIndexOf('/') + 1); } From f0fcb94a6ae902a074379e31b7c9685b802488bc Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Fri, 8 Jul 2016 16:00:08 -0700 Subject: [PATCH 8/9] Typos --- libraries/networking/src/NodeList.cpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/libraries/networking/src/NodeList.cpp b/libraries/networking/src/NodeList.cpp index 9678a0e2c6..02350ac23c 100644 --- a/libraries/networking/src/NodeList.cpp +++ b/libraries/networking/src/NodeList.cpp @@ -513,14 +513,14 @@ void NodeList::processDomainServerConnectionTokenPacket(QSharedPointer message) { if (_domainHandler.getSockAddr().isNull()) { - qWarning() << "IGNORING DomainList packet while not connect to a Domain Server"; + qWarning() << "IGNORING DomainList packet while not connected to a Domain Server"; // refuse to process this packet if we aren't currently connected to the DS return; } - auto domainUuid = _domainHandler.getUUID(); - auto messageSourceUuid = message->getSourceID(); - if (!domainUuid.isNull() && domainUuid != messageSourceUuid) { - qWarning() << "IGNORING DomainList packet from" << messageSourceUuid << "while connected to" << domainUuid; + QUuid domainHandlerUUID = _domainHandler.getUUID(); + QUuid messageSourceUUID = message->getSourceID(); + if (!domainHandlerUUID.isNull() && domainHandlerUUID != messageSourceUUID) { + qWarning() << "IGNORING DomainList packet from" << messageSourceUUID << "while connected to" << domainHandlerUUID; return; } From d933238bda885202ce8aaf3a009039b970b791b4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Brisset?= Date: Fri, 8 Jul 2016 18:15:14 -0700 Subject: [PATCH 9/9] Revert "Fix crash in packet list" --- domain-server/src/DomainServer.cpp | 2 -- libraries/networking/src/LimitedNodeList.cpp | 1 - libraries/networking/src/LimitedNodeList.h | 4 ++-- libraries/networking/src/NodeList.cpp | 7 ------- 4 files changed, 2 insertions(+), 12 deletions(-) diff --git a/domain-server/src/DomainServer.cpp b/domain-server/src/DomainServer.cpp index 8b3f09d1f7..d75a2c3245 100644 --- a/domain-server/src/DomainServer.cpp +++ b/domain-server/src/DomainServer.cpp @@ -389,8 +389,6 @@ void DomainServer::setupNodeListAndAssignments() { const QVariant* idValueVariant = valueForKeyPath(settingsMap, METAVERSE_DOMAIN_ID_KEY_PATH); if (idValueVariant) { nodeList->setSessionUUID(idValueVariant->toString()); - } else { - nodeList->setSessionUUID(QUuid::createUuid()); // Use random UUID } connect(nodeList.data(), &LimitedNodeList::nodeAdded, this, &DomainServer::nodeAdded); diff --git a/libraries/networking/src/LimitedNodeList.cpp b/libraries/networking/src/LimitedNodeList.cpp index a03fa43093..d7a2d47fab 100644 --- a/libraries/networking/src/LimitedNodeList.cpp +++ b/libraries/networking/src/LimitedNodeList.cpp @@ -522,7 +522,6 @@ SharedNodePointer LimitedNodeList::addOrUpdateNode(const QUuid& uuid, NodeType_t const HifiSockAddr& publicSocket, const HifiSockAddr& localSocket, const NodePermissions& permissions, const QUuid& connectionSecret) { - QReadLocker readLocker(&_nodeMutex); NodeHash::const_iterator it = _nodeHash.find(uuid); if (it != _nodeHash.end()) { diff --git a/libraries/networking/src/LimitedNodeList.h b/libraries/networking/src/LimitedNodeList.h index c9054ac6d7..483aa0734c 100644 --- a/libraries/networking/src/LimitedNodeList.h +++ b/libraries/networking/src/LimitedNodeList.h @@ -131,7 +131,7 @@ public: std::function linkedDataCreateCallback; - size_t size() const { QReadLocker readLock(&_nodeMutex); return _nodeHash.size(); } + size_t size() const { return _nodeHash.size(); } SharedNodePointer nodeWithUUID(const QUuid& nodeUUID); @@ -287,7 +287,7 @@ protected: QUuid _sessionUUID; NodeHash _nodeHash; - mutable QReadWriteLock _nodeMutex; + QReadWriteLock _nodeMutex; udt::Socket _nodeSocket; QUdpSocket* _dtlsSocket; HifiSockAddr _localSockAddr; diff --git a/libraries/networking/src/NodeList.cpp b/libraries/networking/src/NodeList.cpp index 02350ac23c..fd1442d639 100644 --- a/libraries/networking/src/NodeList.cpp +++ b/libraries/networking/src/NodeList.cpp @@ -513,16 +513,9 @@ void NodeList::processDomainServerConnectionTokenPacket(QSharedPointer message) { if (_domainHandler.getSockAddr().isNull()) { - qWarning() << "IGNORING DomainList packet while not connected to a Domain Server"; // refuse to process this packet if we aren't currently connected to the DS return; } - QUuid domainHandlerUUID = _domainHandler.getUUID(); - QUuid messageSourceUUID = message->getSourceID(); - if (!domainHandlerUUID.isNull() && domainHandlerUUID != messageSourceUUID) { - qWarning() << "IGNORING DomainList packet from" << messageSourceUUID << "while connected to" << domainHandlerUUID; - return; - } // this is a packet from the domain server, reset the count of un-replied check-ins _numNoReplyDomainCheckIns = 0;