From 812fbc58fb3da9a50c3dfe5dadbbb3d26c733af2 Mon Sep 17 00:00:00 2001 From: David Rowe Date: Fri, 23 Jan 2015 19:13:29 -0800 Subject: [PATCH 1/2] Use custom User-Agent string --- assignment-client/src/Agent.cpp | 4 +++- domain-server/src/DomainServer.cpp | 5 ++++- interface/src/Application.cpp | 1 + interface/src/ModelUploader.cpp | 1 + interface/src/ScriptsModel.cpp | 1 + interface/src/ui/ModelsBrowser.cpp | 3 +++ interface/src/ui/ScriptEditorWidget.cpp | 4 +++- interface/src/ui/SnapshotShareDialog.cpp | 3 +++ interface/src/ui/overlays/BillboardOverlay.cpp | 4 +++- libraries/avatars/src/AvatarData.cpp | 5 ++++- libraries/avatars/src/Recording.cpp | 4 +++- libraries/entities-renderer/src/EntityTreeRenderer.cpp | 4 +++- libraries/networking/src/AccountManager.cpp | 6 +++++- libraries/networking/src/DomainHandler.cpp | 5 ++++- libraries/networking/src/OAuthNetworkAccessManager.cpp | 2 ++ libraries/networking/src/ResourceCache.cpp | 4 +++- libraries/script-engine/src/ScriptEngine.cpp | 8 ++++++-- libraries/script-engine/src/XMLHttpRequestClass.cpp | 1 + libraries/shared/src/SharedUtil.h | 5 ++++- 19 files changed, 57 insertions(+), 13 deletions(-) diff --git a/assignment-client/src/Agent.cpp b/assignment-client/src/Agent.cpp index eab67818c4..cb1666536f 100644 --- a/assignment-client/src/Agent.cpp +++ b/assignment-client/src/Agent.cpp @@ -169,7 +169,9 @@ void Agent::run() { } QNetworkAccessManager& networkAccessManager = NetworkAccessManager::getInstance(); - QNetworkReply *reply = networkAccessManager.get(QNetworkRequest(scriptURL)); + QNetworkRequest networkRequest = QNetworkRequest(scriptURL); + networkRequest.setHeader(QNetworkRequest::UserAgentHeader, HIGH_FIDELITY_USER_AGENT); + QNetworkReply* reply = networkAccessManager.get(networkRequest); QNetworkDiskCache* cache = new QNetworkDiskCache(); QString cachePath = QStandardPaths::writableLocation(QStandardPaths::DataLocation); diff --git a/domain-server/src/DomainServer.cpp b/domain-server/src/DomainServer.cpp index 791c7e37b6..f697438b85 100644 --- a/domain-server/src/DomainServer.cpp +++ b/domain-server/src/DomainServer.cpp @@ -1712,6 +1712,7 @@ bool DomainServer::handleHTTPSRequest(HTTPSConnection* connection, const QUrl &u .arg(authorizationCode, oauthRedirectURL().toString(), _oauthClientID, _oauthClientSecret); QNetworkRequest tokenRequest(tokenRequestUrl); + tokenRequest.setHeader(QNetworkRequest::UserAgentHeader, HIGH_FIDELITY_USER_AGENT); tokenRequest.setHeader(QNetworkRequest::ContentTypeHeader, "application/x-www-form-urlencoded"); QNetworkReply* tokenReply = NetworkAccessManager::getInstance().post(tokenRequest, tokenPostBody.toLocal8Bit()); @@ -1901,7 +1902,9 @@ QNetworkReply* DomainServer::profileRequestGivenTokenReply(QNetworkReply* tokenR profileURL.setPath("/api/v1/user/profile"); profileURL.setQuery(QString("%1=%2").arg(OAUTH_JSON_ACCESS_TOKEN_KEY, accessToken)); - return NetworkAccessManager::getInstance().get(QNetworkRequest(profileURL)); + QNetworkRequest profileRequest(profileURL); + profileRequest.setHeader(QNetworkRequest::UserAgentHeader, HIGH_FIDELITY_USER_AGENT); + return NetworkAccessManager::getInstance().get(profileRequest); } const QString DS_SETTINGS_SESSIONS_GROUP = "web-sessions"; diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 86af8b0e91..0b1b4236bb 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -3786,6 +3786,7 @@ void Application::initAvatarAndViewFrustum() { void Application::checkVersion() { QNetworkRequest latestVersionRequest((QUrl(CHECK_VERSION_URL))); + latestVersionRequest.setHeader(QNetworkRequest::UserAgentHeader, HIGH_FIDELITY_USER_AGENT); latestVersionRequest.setAttribute(QNetworkRequest::CacheLoadControlAttribute, QNetworkRequest::PreferCache); QNetworkReply* reply = NetworkAccessManager::getInstance().get(latestVersionRequest); connect(reply, SIGNAL(finished()), SLOT(parseVersionXml())); diff --git a/interface/src/ModelUploader.cpp b/interface/src/ModelUploader.cpp index dd691cf765..59a537a7e6 100644 --- a/interface/src/ModelUploader.cpp +++ b/interface/src/ModelUploader.cpp @@ -487,6 +487,7 @@ void ModelUploader::uploadFailed(QNetworkReply& errorReply) { void ModelUploader::checkS3() { qDebug() << "Checking S3 for " << _url; QNetworkRequest request(_url); + request.setHeader(QNetworkRequest::UserAgentHeader, HIGH_FIDELITY_USER_AGENT); QNetworkReply* reply = NetworkAccessManager::getInstance().head(request); connect(reply, SIGNAL(finished()), SLOT(processCheck())); } diff --git a/interface/src/ScriptsModel.cpp b/interface/src/ScriptsModel.cpp index b09762b73c..933994b8e2 100644 --- a/interface/src/ScriptsModel.cpp +++ b/interface/src/ScriptsModel.cpp @@ -165,6 +165,7 @@ void ScriptsModel::requestRemoteFiles(QString marker) { QNetworkAccessManager& networkAccessManager = NetworkAccessManager::getInstance(); QNetworkRequest request(url); + request.setHeader(QNetworkRequest::UserAgentHeader, HIGH_FIDELITY_USER_AGENT); QNetworkReply* reply = networkAccessManager.get(request); connect(reply, SIGNAL(finished()), SLOT(downloadFinished())); } diff --git a/interface/src/ui/ModelsBrowser.cpp b/interface/src/ui/ModelsBrowser.cpp index 8c1d90d8b5..e22294876d 100644 --- a/interface/src/ui/ModelsBrowser.cpp +++ b/interface/src/ui/ModelsBrowser.cpp @@ -24,6 +24,7 @@ #include #include +#include #include "ModelsBrowser.h" @@ -226,6 +227,7 @@ void ModelHandler::update() { QUrl url(_model.item(i,0)->data(Qt::UserRole).toString()); QNetworkAccessManager& networkAccessManager = NetworkAccessManager::getInstance(); QNetworkRequest request(url); + request.setHeader(QNetworkRequest::UserAgentHeader, HIGH_FIDELITY_USER_AGENT); QNetworkReply* reply = networkAccessManager.head(request); connect(reply, SIGNAL(finished()), SLOT(downloadFinished())); } @@ -277,6 +279,7 @@ void ModelHandler::queryNewFiles(QString marker) { url.setQuery(query); QNetworkAccessManager& networkAccessManager = NetworkAccessManager::getInstance(); QNetworkRequest request(url); + request.setHeader(QNetworkRequest::UserAgentHeader, HIGH_FIDELITY_USER_AGENT); QNetworkReply* reply = networkAccessManager.get(request); connect(reply, SIGNAL(finished()), SLOT(downloadFinished())); diff --git a/interface/src/ui/ScriptEditorWidget.cpp b/interface/src/ui/ScriptEditorWidget.cpp index 660b9009b6..35334350f4 100644 --- a/interface/src/ui/ScriptEditorWidget.cpp +++ b/interface/src/ui/ScriptEditorWidget.cpp @@ -152,7 +152,9 @@ void ScriptEditorWidget::loadFile(const QString& scriptPath) { } } else { QNetworkAccessManager& networkAccessManager = NetworkAccessManager::getInstance(); - QNetworkReply* reply = networkAccessManager.get(QNetworkRequest(url)); + QNetworkRequest networkRequest = QNetworkRequest(url); + networkRequest.setHeader(QNetworkRequest::UserAgentHeader, HIGH_FIDELITY_USER_AGENT); + QNetworkReply* reply = networkAccessManager.get(networkRequest); qDebug() << "Downloading included script at" << scriptPath; QEventLoop loop; QObject::connect(reply, &QNetworkReply::finished, &loop, &QEventLoop::quit); diff --git a/interface/src/ui/SnapshotShareDialog.cpp b/interface/src/ui/SnapshotShareDialog.cpp index 47914e0a12..3053c3ee0a 100644 --- a/interface/src/ui/SnapshotShareDialog.cpp +++ b/interface/src/ui/SnapshotShareDialog.cpp @@ -11,6 +11,7 @@ #include "SnapshotShareDialog.h" #include "AccountManager.h" +#include "SharedUtil.h" #include #include @@ -112,6 +113,7 @@ void SnapshotShareDialog::uploadSnapshot() { QUrl url(FORUM_UPLOADS_URL); QNetworkRequest request(url); + request.setHeader(QNetworkRequest::UserAgentHeader, HIGH_FIDELITY_USER_AGENT); QNetworkReply* reply = NetworkAccessManager::getInstance().post(request, multiPart); connect(reply, &QNetworkReply::finished, this, &SnapshotShareDialog::uploadRequestFinished); @@ -124,6 +126,7 @@ void SnapshotShareDialog::uploadSnapshot() { void SnapshotShareDialog::sendForumPost(QString snapshotPath) { // post to Discourse forum QNetworkRequest request; + request.setHeader(QNetworkRequest::UserAgentHeader, HIGH_FIDELITY_USER_AGENT); QUrl forumUrl(FORUM_POST_URL); QUrlQuery query; diff --git a/interface/src/ui/overlays/BillboardOverlay.cpp b/interface/src/ui/overlays/BillboardOverlay.cpp index b34416f566..9c64280bd6 100644 --- a/interface/src/ui/overlays/BillboardOverlay.cpp +++ b/interface/src/ui/overlays/BillboardOverlay.cpp @@ -196,7 +196,9 @@ void BillboardOverlay::setBillboardURL(const QString& url) { _billboard.clear(); _newTextureNeeded = true; - QNetworkReply* reply = NetworkAccessManager::getInstance().get(QNetworkRequest(actualURL)); + QNetworkRequest request(actualURL); + request.setHeader(QNetworkRequest::UserAgentHeader, HIGH_FIDELITY_USER_AGENT); + QNetworkReply* reply = NetworkAccessManager::getInstance().get(request); connect(reply, &QNetworkReply::finished, this, &BillboardOverlay::replyFinished); } diff --git a/libraries/avatars/src/AvatarData.cpp b/libraries/avatars/src/AvatarData.cpp index 21bbdefc80..c8f6ca18ec 100644 --- a/libraries/avatars/src/AvatarData.cpp +++ b/libraries/avatars/src/AvatarData.cpp @@ -1021,6 +1021,7 @@ void AvatarData::setBillboardFromURL(const QString &billboardURL) { qDebug() << "Changing billboard for avatar to PNG at" << qPrintable(billboardURL); QNetworkRequest billboardRequest; + billboardRequest.setHeader(QNetworkRequest::UserAgentHeader, HIGH_FIDELITY_USER_AGENT); billboardRequest.setUrl(QUrl(billboardURL)); QNetworkAccessManager& networkAccessManager = NetworkAccessManager::getInstance(); @@ -1089,7 +1090,9 @@ void AvatarData::updateJointMappings() { if (_skeletonModelURL.fileName().toLower().endsWith(".fst")) { QNetworkAccessManager& networkAccessManager = NetworkAccessManager::getInstance(); - QNetworkReply* networkReply = networkAccessManager.get(QNetworkRequest(_skeletonModelURL)); + QNetworkRequest networkRequest = QNetworkRequest(_skeletonModelURL); + networkRequest.setHeader(QNetworkRequest::UserAgentHeader, HIGH_FIDELITY_USER_AGENT); + QNetworkReply* networkReply = networkAccessManager.get(networkRequest); connect(networkReply, SIGNAL(finished()), this, SLOT(setJointMappingsFromNetworkReply())); } } diff --git a/libraries/avatars/src/Recording.cpp b/libraries/avatars/src/Recording.cpp index a258247f13..7fa8b79bda 100644 --- a/libraries/avatars/src/Recording.cpp +++ b/libraries/avatars/src/Recording.cpp @@ -370,7 +370,9 @@ RecordingPointer readRecordingFromFile(RecordingPointer recording, const QString // Download file if necessary qDebug() << "Downloading recording at" << url; QNetworkAccessManager& networkAccessManager = NetworkAccessManager::getInstance(); - QNetworkReply* reply = networkAccessManager.get(QNetworkRequest(url)); + QNetworkRequest networkRequest = QNetworkRequest(url); + networkRequest.setHeader(QNetworkRequest::UserAgentHeader, HIGH_FIDELITY_USER_AGENT); + QNetworkReply* reply = networkAccessManager.get(networkRequest); QEventLoop loop; QObject::connect(reply, SIGNAL(finished()), &loop, SLOT(quit())); loop.exec(); // wait for file diff --git a/libraries/entities-renderer/src/EntityTreeRenderer.cpp b/libraries/entities-renderer/src/EntityTreeRenderer.cpp index 47e9237ddc..c30b83aaa5 100644 --- a/libraries/entities-renderer/src/EntityTreeRenderer.cpp +++ b/libraries/entities-renderer/src/EntityTreeRenderer.cpp @@ -135,7 +135,9 @@ QString EntityTreeRenderer::loadScriptContents(const QString& scriptMaybeURLorTe } } else { QNetworkAccessManager& networkAccessManager = NetworkAccessManager::getInstance(); - QNetworkReply* reply = networkAccessManager.get(QNetworkRequest(url)); + QNetworkRequest networkRequest = QNetworkRequest(url); + networkRequest.setHeader(QNetworkRequest::UserAgentHeader, HIGH_FIDELITY_USER_AGENT); + QNetworkReply* reply = networkAccessManager.get(networkRequest); qDebug() << "Downloading script at" << url; QEventLoop loop; QObject::connect(reply, SIGNAL(finished()), &loop, SLOT(quit())); diff --git a/libraries/networking/src/AccountManager.cpp b/libraries/networking/src/AccountManager.cpp index c4a4c4a458..8a17111b39 100644 --- a/libraries/networking/src/AccountManager.cpp +++ b/libraries/networking/src/AccountManager.cpp @@ -24,6 +24,7 @@ #include "NodeList.h" #include "PacketHeaders.h" #include "RSAKeypairGenerator.h" +#include "SharedUtil.h" #include "AccountManager.h" @@ -197,7 +198,8 @@ void AccountManager::invokedRequest(const QString& path, QNetworkAccessManager& networkAccessManager = NetworkAccessManager::getInstance(); QNetworkRequest networkRequest; - + networkRequest.setHeader(QNetworkRequest::UserAgentHeader, HIGH_FIDELITY_USER_AGENT); + QUrl requestURL = _authURL; if (path.startsWith("/")) { @@ -387,6 +389,7 @@ void AccountManager::requestAccessToken(const QString& login, const QString& pas QNetworkAccessManager& networkAccessManager = NetworkAccessManager::getInstance(); QNetworkRequest request; + request.setHeader(QNetworkRequest::UserAgentHeader, HIGH_FIDELITY_USER_AGENT); QUrl grantURL = _authURL; grantURL.setPath("/oauth/token"); @@ -456,6 +459,7 @@ void AccountManager::requestProfile() { profileURL.setPath("/api/v1/user/profile"); QNetworkRequest profileRequest(profileURL); + profileRequest.setHeader(QNetworkRequest::UserAgentHeader, HIGH_FIDELITY_USER_AGENT); profileRequest.setRawHeader(ACCESS_TOKEN_AUTHORIZATION_HEADER, _accountInfo.getAccessToken().authorizationHeaderValue()); QNetworkReply* profileReply = networkAccessManager.get(profileRequest); diff --git a/libraries/networking/src/DomainHandler.cpp b/libraries/networking/src/DomainHandler.cpp index 67cf81a73a..fe50647c20 100644 --- a/libraries/networking/src/DomainHandler.cpp +++ b/libraries/networking/src/DomainHandler.cpp @@ -17,6 +17,7 @@ #include "HifiSockAddr.h" #include "NodeList.h" #include "PacketHeaders.h" +#include "SharedUtil.h" #include "UserActivityLogger.h" #include "DomainHandler.h" @@ -203,7 +204,9 @@ void DomainHandler::requestDomainSettings() { qDebug() << "Requesting domain-server settings at" << settingsJSONURL.toString(); - QNetworkReply* reply = NetworkAccessManager::getInstance().get(QNetworkRequest(settingsJSONURL)); + QNetworkRequest settingsRequest(settingsJSONURL); + settingsRequest.setHeader(QNetworkRequest::UserAgentHeader, HIGH_FIDELITY_USER_AGENT); + QNetworkReply* reply = NetworkAccessManager::getInstance().get(settingsRequest); connect(reply, &QNetworkReply::finished, this, &DomainHandler::settingsRequestFinished); } } diff --git a/libraries/networking/src/OAuthNetworkAccessManager.cpp b/libraries/networking/src/OAuthNetworkAccessManager.cpp index 493398230a..1a52dc4ce7 100644 --- a/libraries/networking/src/OAuthNetworkAccessManager.cpp +++ b/libraries/networking/src/OAuthNetworkAccessManager.cpp @@ -14,6 +14,7 @@ #include #include "AccountManager.h" +#include "SharedUtil.h" #include "OAuthNetworkAccessManager.h" @@ -33,6 +34,7 @@ QNetworkReply* OAuthNetworkAccessManager::createRequest(QNetworkAccessManager::O if (accountManager.hasValidAccessToken()) { QNetworkRequest authenticatedRequest(req); + authenticatedRequest.setHeader(QNetworkRequest::UserAgentHeader, HIGH_FIDELITY_USER_AGENT); authenticatedRequest.setRawHeader(ACCESS_TOKEN_AUTHORIZATION_HEADER, accountManager.getAccountInfo().getAccessToken().authorizationHeaderValue()); diff --git a/libraries/networking/src/ResourceCache.cpp b/libraries/networking/src/ResourceCache.cpp index 5a95bd6028..9d61129d78 100644 --- a/libraries/networking/src/ResourceCache.cpp +++ b/libraries/networking/src/ResourceCache.cpp @@ -16,8 +16,9 @@ #include #include -#include "NetworkAccessManager.h" +#include +#include "NetworkAccessManager.h" #include "ResourceCache.h" #define clamp(x, min, max) (((x) < (min)) ? (min) :\ @@ -158,6 +159,7 @@ Resource::Resource(const QUrl& url, bool delayLoad) : init(); + _request.setHeader(QNetworkRequest::UserAgentHeader, HIGH_FIDELITY_USER_AGENT); _request.setAttribute(QNetworkRequest::CacheLoadControlAttribute, QNetworkRequest::PreferCache); // start loading immediately unless instructed otherwise diff --git a/libraries/script-engine/src/ScriptEngine.cpp b/libraries/script-engine/src/ScriptEngine.cpp index 0f860208f4..3720ea8f7d 100644 --- a/libraries/script-engine/src/ScriptEngine.cpp +++ b/libraries/script-engine/src/ScriptEngine.cpp @@ -178,7 +178,9 @@ void ScriptEngine::loadURL(const QUrl& scriptURL) { } } else { QNetworkAccessManager& networkAccessManager = NetworkAccessManager::getInstance(); - QNetworkReply* reply = networkAccessManager.get(QNetworkRequest(url)); + QNetworkRequest networkRequest = QNetworkRequest(url); + networkRequest.setHeader(QNetworkRequest::UserAgentHeader, HIGH_FIDELITY_USER_AGENT); + QNetworkReply* reply = networkAccessManager.get(networkRequest); connect(reply, &QNetworkReply::finished, this, &ScriptEngine::handleScriptDownload); } } @@ -601,7 +603,9 @@ void ScriptEngine::include(const QString& includeFile) { if (url.scheme() == "http" || url.scheme() == "https" || url.scheme() == "ftp") { QNetworkAccessManager& networkAccessManager = NetworkAccessManager::getInstance(); - QNetworkReply* reply = networkAccessManager.get(QNetworkRequest(url)); + QNetworkRequest networkRequest = QNetworkRequest(url); + networkRequest.setHeader(QNetworkRequest::UserAgentHeader, HIGH_FIDELITY_USER_AGENT); + QNetworkReply* reply = networkAccessManager.get(networkRequest); qDebug() << "Downloading included script at" << includeFile; QEventLoop loop; QObject::connect(reply, SIGNAL(finished()), &loop, SLOT(quit())); diff --git a/libraries/script-engine/src/XMLHttpRequestClass.cpp b/libraries/script-engine/src/XMLHttpRequestClass.cpp index 92c9c1856c..cd2e2f3732 100644 --- a/libraries/script-engine/src/XMLHttpRequestClass.cpp +++ b/libraries/script-engine/src/XMLHttpRequestClass.cpp @@ -107,6 +107,7 @@ void XMLHttpRequestClass::abort() { } void XMLHttpRequestClass::setRequestHeader(const QString& name, const QString& value) { + _request.setHeader(QNetworkRequest::UserAgentHeader, HIGH_FIDELITY_USER_AGENT); _request.setRawHeader(QByteArray(name.toLatin1()), QByteArray(value.toLatin1())); } diff --git a/libraries/shared/src/SharedUtil.h b/libraries/shared/src/SharedUtil.h index 01dcd7ff02..f09ff9bd72 100644 --- a/libraries/shared/src/SharedUtil.h +++ b/libraries/shared/src/SharedUtil.h @@ -65,7 +65,10 @@ static const quint64 USECS_PER_MSEC = 1000; static const quint64 MSECS_PER_SECOND = 1000; static const quint64 USECS_PER_SECOND = USECS_PER_MSEC * MSECS_PER_SECOND; -const int BITS_IN_BYTE = 8; +const int BITS_IN_BYTE = 8; + +// Use a custom User-Agent to avoid ModSecurity filtering, e.g. by hosting providers. +const QByteArray HIGH_FIDELITY_USER_AGENT = "Mozilla/5.0 (HighFidelity)"; quint64 usecTimestampNow(bool wantDebug = false); void usecTimestampNowForceClockSkew(int clockSkew); From 729fbbf5ac1151248289587e1fa32c56aaa96e11 Mon Sep 17 00:00:00 2001 From: David Rowe Date: Fri, 30 Jan 2015 15:56:01 -0800 Subject: [PATCH 2/2] A further custom User-Agent string --- libraries/script-engine/src/BatchLoader.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/libraries/script-engine/src/BatchLoader.cpp b/libraries/script-engine/src/BatchLoader.cpp index e2c345ce16..c455ca91ec 100644 --- a/libraries/script-engine/src/BatchLoader.cpp +++ b/libraries/script-engine/src/BatchLoader.cpp @@ -15,6 +15,7 @@ #include #include "BatchLoader.h" #include +#include BatchLoader::BatchLoader(const QList& urls) : QObject(), @@ -33,7 +34,9 @@ void BatchLoader::start() { QNetworkAccessManager& networkAccessManager = NetworkAccessManager::getInstance(); for (QUrl url : _urls) { if (url.scheme() == "http" || url.scheme() == "https" || url.scheme() == "ftp") { - QNetworkReply* reply = networkAccessManager.get(QNetworkRequest(url)); + QNetworkRequest request = QNetworkRequest(url); + request.setHeader(QNetworkRequest::UserAgentHeader, HIGH_FIDELITY_USER_AGENT); + QNetworkReply* reply = networkAccessManager.get(request); qDebug() << "Downloading file at" << url;