diff --git a/domain-server/src/DomainServer.cpp b/domain-server/src/DomainServer.cpp index 57e133c599..0918b85a63 100644 --- a/domain-server/src/DomainServer.cpp +++ b/domain-server/src/DomainServer.cpp @@ -814,8 +814,9 @@ void DomainServer::requestUserPublicKey(const QString& username) { qDebug() << "Requesting public key for user" << username; - AccountManager::getInstance().unauthenticatedRequest(USER_PUBLIC_KEY_PATH.arg(username), - QNetworkAccessManager::GetOperation, callbackParams); + AccountManager::getInstance().sendRequest(USER_PUBLIC_KEY_PATH.arg(username), + AccountManagerAuth::None, + QNetworkAccessManager::GetOperation, callbackParams); } QUrl DomainServer::oauthRedirectURL() { @@ -1116,8 +1117,10 @@ void DomainServer::sendPendingTransactionsToServer() { transactionCallbackParams.jsonCallbackMethod = "transactionJSONCallback"; while (i != _pendingAssignmentCredits.end()) { - accountManager.authenticatedRequest("api/v1/transactions", QNetworkAccessManager::PostOperation, - transactionCallbackParams, i.value()->postJson().toJson()); + accountManager.sendRequest("api/v1/transactions", + AccountManagerAuth::Required, + QNetworkAccessManager::PostOperation, + transactionCallbackParams, i.value()->postJson().toJson()); // set this transaction to finalized so we don't add additional credits to it i.value()->setIsFinalized(true); @@ -1240,10 +1243,11 @@ void DomainServer::sendHeartbeatToDataServer(const QString& networkAddress) { QString domainUpdateJSON = QString("{\"domain\": %1 }").arg(QString(QJsonDocument(domainObject).toJson())); - AccountManager::getInstance().authenticatedRequest(DOMAIN_UPDATE.arg(uuidStringWithoutCurlyBraces(domainID)), - QNetworkAccessManager::PutOperation, - JSONCallbackParameters(), - domainUpdateJSON.toUtf8()); + AccountManager::getInstance().sendRequest(DOMAIN_UPDATE.arg(uuidStringWithoutCurlyBraces(domainID)), + AccountManagerAuth::Required, + QNetworkAccessManager::PutOperation, + JSONCallbackParameters(), + domainUpdateJSON.toUtf8()); } // todo: have data-web respond with ice-server hostname to use diff --git a/interface/src/DiscoverabilityManager.cpp b/interface/src/DiscoverabilityManager.cpp index 49850e4ef6..791e5667c4 100644 --- a/interface/src/DiscoverabilityManager.cpp +++ b/interface/src/DiscoverabilityManager.cpp @@ -61,17 +61,21 @@ void DiscoverabilityManager::updateLocation() { uuidStringWithoutCurlyBraces(domainHandler.getUUID())); } + const QString FRIENDS_ONLY_KEY_IN_LOCATION = "friends_only"; + locationObject.insert(FRIENDS_ONLY_KEY_IN_LOCATION, (_mode.get() == Discoverability::Friends)); + rootObject.insert(LOCATION_KEY_IN_ROOT, locationObject); - accountManager.authenticatedRequest(API_USER_LOCATION_PATH, QNetworkAccessManager::PutOperation, - JSONCallbackParameters(), QJsonDocument(rootObject).toJson()); + accountManager.sendRequest(API_USER_LOCATION_PATH, AccountManagerAuth::Required, + QNetworkAccessManager::PutOperation, + JSONCallbackParameters(), QJsonDocument(rootObject).toJson()); } } } void DiscoverabilityManager::removeLocation() { AccountManager& accountManager = AccountManager::getInstance(); - accountManager.authenticatedRequest(API_USER_LOCATION_PATH, QNetworkAccessManager::DeleteOperation); + accountManager.sendRequest(API_USER_LOCATION_PATH, AccountManagerAuth::Required, QNetworkAccessManager::DeleteOperation); } void DiscoverabilityManager::setDiscoverabilityMode(Discoverability::Mode discoverabilityMode) { diff --git a/libraries/networking/src/AccountManager.cpp b/libraries/networking/src/AccountManager.cpp index 2a809f2a7c..5858c0926d 100644 --- a/libraries/networking/src/AccountManager.cpp +++ b/libraries/networking/src/AccountManager.cpp @@ -115,7 +115,7 @@ void AccountManager::updateBalance() { callbackParameters.jsonCallbackReceiver = &_accountInfo; callbackParameters.jsonCallbackMethod = "setBalanceFromJSON"; - authenticatedRequest("/api/v1/wallets/mine", QNetworkAccessManager::GetOperation, callbackParameters); + sendRequest("/api/v1/wallets/mine", AccountManagerAuth::Required, QNetworkAccessManager::GetOperation, callbackParameters); } } @@ -159,50 +159,30 @@ void AccountManager::setAuthURL(const QUrl& authURL) { } } -void AccountManager::authenticatedRequest(const QString& path, QNetworkAccessManager::Operation operation, - const JSONCallbackParameters& callbackParams, - const QByteArray& dataByteArray, - QHttpMultiPart* dataMultiPart, - const QVariantMap& propertyMap) { +void AccountManager::sendRequest(const QString& path, + AccountManagerAuth::Type authType, + QNetworkAccessManager::Operation operation, + const JSONCallbackParameters& callbackParams, + const QByteArray& dataByteArray, + QHttpMultiPart* dataMultiPart, + const QVariantMap& propertyMap) { - QMetaObject::invokeMethod(this, "invokedRequest", - Q_ARG(const QString&, path), - Q_ARG(bool, true), - Q_ARG(QNetworkAccessManager::Operation, operation), - Q_ARG(const JSONCallbackParameters&, callbackParams), - Q_ARG(const QByteArray&, dataByteArray), - Q_ARG(QHttpMultiPart*, dataMultiPart), - Q_ARG(QVariantMap, propertyMap)); -} - -void AccountManager::unauthenticatedRequest(const QString& path, QNetworkAccessManager::Operation operation, - const JSONCallbackParameters& callbackParams, - const QByteArray& dataByteArray, - QHttpMultiPart* dataMultiPart, - const QVariantMap& propertyMap) { + if (thread() != QThread::currentThread()) { + QMetaObject::invokeMethod(this, "sendRequest", + Q_ARG(const QString&, path), + Q_ARG(AccountManagerAuth::Type, AccountManagerAuth::Required), + Q_ARG(QNetworkAccessManager::Operation, operation), + Q_ARG(const JSONCallbackParameters&, callbackParams), + Q_ARG(const QByteArray&, dataByteArray), + Q_ARG(QHttpMultiPart*, dataMultiPart), + Q_ARG(QVariantMap, propertyMap)); + } - QMetaObject::invokeMethod(this, "invokedRequest", - Q_ARG(const QString&, path), - Q_ARG(bool, false), - Q_ARG(QNetworkAccessManager::Operation, operation), - Q_ARG(const JSONCallbackParameters&, callbackParams), - Q_ARG(const QByteArray&, dataByteArray), - Q_ARG(QHttpMultiPart*, dataMultiPart), - Q_ARG(QVariantMap, propertyMap)); -} - -void AccountManager::invokedRequest(const QString& path, - bool requiresAuthentication, - QNetworkAccessManager::Operation operation, - const JSONCallbackParameters& callbackParams, - const QByteArray& dataByteArray, QHttpMultiPart* dataMultiPart, - const QVariantMap& propertyMap) { - QNetworkAccessManager& networkAccessManager = NetworkAccessManager::getInstance(); - + QNetworkRequest networkRequest; networkRequest.setHeader(QNetworkRequest::UserAgentHeader, HIGH_FIDELITY_USER_AGENT); - + QUrl requestURL = _authURL; if (path.startsWith("/")) { @@ -211,13 +191,17 @@ void AccountManager::invokedRequest(const QString& path, requestURL.setPath("/" + path); } - if (requiresAuthentication) { + if (authType != AccountManagerAuth::None ) { if (hasValidAccessToken()) { networkRequest.setRawHeader(ACCESS_TOKEN_AUTHORIZATION_HEADER, _accountInfo.getAccessToken().authorizationHeaderValue()); } else { - qDebug() << "No valid access token present. Bailing on authenticated invoked request."; - return; + if (authType == AccountManagerAuth::Required) { + qDebug() << "No valid access token present. Bailing on invoked request to" + << path << "that requires authentication"; + return; + } + } } @@ -540,8 +524,8 @@ void AccountManager::processGeneratedKeypair(const QByteArray& publicKey, const requestMultiPart->append(keyPart); - authenticatedRequest(PUBLIC_KEY_UPDATE_PATH, QNetworkAccessManager::PutOperation, - JSONCallbackParameters(), QByteArray(), requestMultiPart); + sendRequest(PUBLIC_KEY_UPDATE_PATH, AccountManagerAuth::Required, QNetworkAccessManager::PutOperation, + JSONCallbackParameters(), QByteArray(), requestMultiPart); // get rid of the keypair generator now that we don't need it anymore sender()->deleteLater(); diff --git a/libraries/networking/src/AccountManager.h b/libraries/networking/src/AccountManager.h index 2c9a441db1..b9c85d71e0 100644 --- a/libraries/networking/src/AccountManager.h +++ b/libraries/networking/src/AccountManager.h @@ -37,6 +37,16 @@ public: QString updateSlot; }; +namespace AccountManagerAuth { + enum Type { + None, + Required, + Optional + }; +} + +Q_DECLARE_METATYPE(AccountManagerAuth::Type); + const QByteArray ACCESS_TOKEN_AUTHORIZATION_HEADER = "Authorization"; class AccountManager : public QObject { @@ -44,19 +54,13 @@ class AccountManager : public QObject { public: static AccountManager& getInstance(bool forceReset = false); - void authenticatedRequest(const QString& path, - QNetworkAccessManager::Operation operation = QNetworkAccessManager::GetOperation, - const JSONCallbackParameters& callbackParams = JSONCallbackParameters(), - const QByteArray& dataByteArray = QByteArray(), - QHttpMultiPart* dataMultiPart = NULL, - const QVariantMap& propertyMap = QVariantMap()); - - void unauthenticatedRequest(const QString& path, - QNetworkAccessManager::Operation operation = QNetworkAccessManager::GetOperation, - const JSONCallbackParameters& callbackParams = JSONCallbackParameters(), - const QByteArray& dataByteArray = QByteArray(), - QHttpMultiPart* dataMultiPart = NULL, - const QVariantMap& propertyMap = QVariantMap()) ; + Q_INVOKABLE void sendRequest(const QString& path, + AccountManagerAuth::Type authType, + QNetworkAccessManager::Operation operation = QNetworkAccessManager::GetOperation, + const JSONCallbackParameters& callbackParams = JSONCallbackParameters(), + const QByteArray& dataByteArray = QByteArray(), + QHttpMultiPart* dataMultiPart = NULL, + const QVariantMap& propertyMap = QVariantMap()); const QUrl& getAuthURL() const { return _authURL; } void setAuthURL(const QUrl& authURL); @@ -107,14 +111,6 @@ private: void passSuccessToCallback(QNetworkReply* reply); void passErrorToCallback(QNetworkReply* reply); - Q_INVOKABLE void invokedRequest(const QString& path, - bool requiresAuthentication, - QNetworkAccessManager::Operation operation, - const JSONCallbackParameters& callbackParams, - const QByteArray& dataByteArray, - QHttpMultiPart* dataMultiPart, - const QVariantMap& propertyMap); - QUrl _authURL; QMap _pendingCallbackMap; diff --git a/libraries/networking/src/AddressManager.cpp b/libraries/networking/src/AddressManager.cpp index 0458a5e912..3c27c4644c 100644 --- a/libraries/networking/src/AddressManager.cpp +++ b/libraries/networking/src/AddressManager.cpp @@ -294,12 +294,11 @@ void AddressManager::attemptPlaceNameLookup(const QString& lookupString, const Q requestParams.insert(OVERRIDE_PATH_KEY, overridePath); } - AccountManager::getInstance().unauthenticatedRequest(GET_PLACE.arg(placeName), - QNetworkAccessManager::GetOperation, - apiCallbackParameters(), - QByteArray(), - NULL, - requestParams); + AccountManager::getInstance().sendRequest(GET_PLACE.arg(placeName), + AccountManagerAuth::None, + QNetworkAccessManager::GetOperation, + apiCallbackParameters(), + QByteArray(), NULL, requestParams); } bool AddressManager::handleNetworkAddress(const QString& lookupString) { @@ -439,9 +438,10 @@ void AddressManager::setDomainInfo(const QString& hostname, quint16 port) { void AddressManager::goToUser(const QString& username) { QString formattedUsername = QUrl::toPercentEncoding(username); // this is a username - pull the captured name and lookup that user's location - AccountManager::getInstance().unauthenticatedRequest(GET_USER_LOCATION.arg(formattedUsername), - QNetworkAccessManager::GetOperation, - apiCallbackParameters()); + AccountManager::getInstance().sendRequest(GET_USER_LOCATION.arg(formattedUsername), + AccountManagerAuth::Optional, + QNetworkAccessManager::GetOperation, + apiCallbackParameters()); } void AddressManager::copyAddress() { diff --git a/libraries/networking/src/UserActivityLogger.cpp b/libraries/networking/src/UserActivityLogger.cpp index 64828708b2..89c0bd34bd 100644 --- a/libraries/networking/src/UserActivityLogger.cpp +++ b/libraries/networking/src/UserActivityLogger.cpp @@ -62,11 +62,10 @@ void UserActivityLogger::logAction(QString action, QJsonObject details, JSONCall params.errorCallbackMethod = "requestError"; } - accountManager.authenticatedRequest(USER_ACTIVITY_URL, - QNetworkAccessManager::PostOperation, - params, - NULL, - multipart); + accountManager.sendRequest(USER_ACTIVITY_URL, + AccountManagerAuth::Required, + QNetworkAccessManager::PostOperation, + params, NULL, multipart); } void UserActivityLogger::requestFinished(QNetworkReply& requestReply) {