Merge pull request #7834 from huffman/feat/user-agent-plugins

Add system information to UserAgent in AccountManager requests
This commit is contained in:
Brad Hefta-Gaub 2016-05-19 11:53:14 -07:00
commit ac15097f47
22 changed files with 167 additions and 126 deletions

View file

@ -51,6 +51,8 @@ AssignmentClient::AssignmentClient(Assignment::Type requestAssignmentType, QStri
LogUtils::init(); LogUtils::init();
QSettings::setDefaultFormat(QSettings::IniFormat); QSettings::setDefaultFormat(QSettings::IniFormat);
DependencyManager::set<AccountManager>();
auto scriptableAvatar = DependencyManager::set<ScriptableAvatar>(); auto scriptableAvatar = DependencyManager::set<ScriptableAvatar>();
auto addressManager = DependencyManager::set<AddressManager>(); auto addressManager = DependencyManager::set<AddressManager>();
@ -116,7 +118,7 @@ AssignmentClient::AssignmentClient(Assignment::Type requestAssignmentType, QStri
_requestTimer.start(ASSIGNMENT_REQUEST_INTERVAL_MSECS); _requestTimer.start(ASSIGNMENT_REQUEST_INTERVAL_MSECS);
// connections to AccountManager for authentication // connections to AccountManager for authentication
connect(&AccountManager::getInstance(), &AccountManager::authRequired, connect(DependencyManager::get<AccountManager>().data(), &AccountManager::authRequired,
this, &AssignmentClient::handleAuthenticationRequest); this, &AssignmentClient::handleAuthenticationRequest);
// Create Singleton objects on main thread // Create Singleton objects on main thread
@ -309,13 +311,13 @@ void AssignmentClient::handleAuthenticationRequest() {
QString username = sysEnvironment.value(DATA_SERVER_USERNAME_ENV); QString username = sysEnvironment.value(DATA_SERVER_USERNAME_ENV);
QString password = sysEnvironment.value(DATA_SERVER_PASSWORD_ENV); QString password = sysEnvironment.value(DATA_SERVER_PASSWORD_ENV);
AccountManager& accountManager = AccountManager::getInstance(); auto accountManager = DependencyManager::get<AccountManager>();
if (!username.isEmpty() && !password.isEmpty()) { if (!username.isEmpty() && !password.isEmpty()) {
// ask the account manager to log us in from the env variables // ask the account manager to log us in from the env variables
accountManager.requestAccessToken(username, password); accountManager->requestAccessToken(username, password);
} else { } else {
qCWarning(assigmnentclient) << "Authentication was requested against" << qPrintable(accountManager.getAuthURL().toString()) qCWarning(assigmnentclient) << "Authentication was requested against" << qPrintable(accountManager->getAuthURL().toString())
<< "but both or one of" << qPrintable(DATA_SERVER_USERNAME_ENV) << "but both or one of" << qPrintable(DATA_SERVER_USERNAME_ENV)
<< "/" << qPrintable(DATA_SERVER_PASSWORD_ENV) << "are not set. Unable to authenticate."; << "/" << qPrintable(DATA_SERVER_PASSWORD_ENV) << "are not set. Unable to authenticate.";

View file

@ -485,7 +485,7 @@ void DomainGatekeeper::requestUserPublicKey(const QString& username) {
qDebug() << "Requesting public key for user" << username; qDebug() << "Requesting public key for user" << username;
AccountManager::getInstance().sendRequest(USER_PUBLIC_KEY_PATH.arg(username), DependencyManager::get<AccountManager>()->sendRequest(USER_PUBLIC_KEY_PATH.arg(username),
AccountManagerAuth::None, AccountManagerAuth::None,
QNetworkAccessManager::GetOperation, callbackParams); QNetworkAccessManager::GetOperation, callbackParams);
} }

View file

@ -26,6 +26,7 @@
#include <AccountManager.h> #include <AccountManager.h>
#include <BuildInfo.h> #include <BuildInfo.h>
#include <DependencyManager.h>
#include <HifiConfigVariantMap.h> #include <HifiConfigVariantMap.h>
#include <HTTPConnection.h> #include <HTTPConnection.h>
#include <LogUtils.h> #include <LogUtils.h>
@ -77,7 +78,7 @@ DomainServer::DomainServer(int argc, char* argv[]) :
// make sure we have a fresh AccountManager instance // make sure we have a fresh AccountManager instance
// (need this since domain-server can restart itself and maintain static variables) // (need this since domain-server can restart itself and maintain static variables)
AccountManager::getInstance(true); DependencyManager::set<AccountManager>();
auto args = arguments(); auto args = arguments();
@ -195,8 +196,8 @@ bool DomainServer::optionallySetupOAuth() {
_oauthProviderURL = NetworkingConstants::METAVERSE_SERVER_URL; _oauthProviderURL = NetworkingConstants::METAVERSE_SERVER_URL;
} }
AccountManager& accountManager = AccountManager::getInstance(); auto accountManager = DependencyManager::get<AccountManager>();
accountManager.setAuthURL(_oauthProviderURL); accountManager->setAuthURL(_oauthProviderURL);
_oauthClientID = settingsMap.value(OAUTH_CLIENT_ID_OPTION).toString(); _oauthClientID = settingsMap.value(OAUTH_CLIENT_ID_OPTION).toString();
_oauthClientSecret = QProcessEnvironment::systemEnvironment().value(OAUTH_CLIENT_SECRET_ENV); _oauthClientSecret = QProcessEnvironment::systemEnvironment().value(OAUTH_CLIENT_SECRET_ENV);
@ -239,7 +240,7 @@ void DomainServer::optionallyGetTemporaryName(const QStringList& arguments) {
// we've been asked to grab a temporary name from the API // we've been asked to grab a temporary name from the API
// so fire off that request now // so fire off that request now
auto& accountManager = AccountManager::getInstance(); auto accountManager = DependencyManager::get<AccountManager>();
// get callbacks for temporary domain result // get callbacks for temporary domain result
JSONCallbackParameters callbackParameters; JSONCallbackParameters callbackParameters;
@ -248,8 +249,8 @@ void DomainServer::optionallyGetTemporaryName(const QStringList& arguments) {
callbackParameters.errorCallbackReceiver = this; callbackParameters.errorCallbackReceiver = this;
callbackParameters.errorCallbackMethod = "handleTempDomainError"; callbackParameters.errorCallbackMethod = "handleTempDomainError";
accountManager.sendRequest("/api/v1/domains/temporary", AccountManagerAuth::None, accountManager->sendRequest("/api/v1/domains/temporary", AccountManagerAuth::None,
QNetworkAccessManager::PostOperation, callbackParameters); QNetworkAccessManager::PostOperation, callbackParameters);
} }
} }
@ -397,7 +398,7 @@ bool DomainServer::resetAccountManagerAccessToken() {
<< "at keypath metaverse.access_token or in your ENV at key DOMAIN_SERVER_ACCESS_TOKEN"; << "at keypath metaverse.access_token or in your ENV at key DOMAIN_SERVER_ACCESS_TOKEN";
// clear any existing access token from AccountManager // clear any existing access token from AccountManager
AccountManager::getInstance().setAccessTokenForCurrentAuthURL(QString()); DependencyManager::get<AccountManager>()->setAccessTokenForCurrentAuthURL(QString());
return false; return false;
} }
@ -407,7 +408,7 @@ bool DomainServer::resetAccountManagerAccessToken() {
} }
// give this access token to the AccountManager // give this access token to the AccountManager
AccountManager::getInstance().setAccessTokenForCurrentAuthURL(accessToken); DependencyManager::get<AccountManager>()->setAccessTokenForCurrentAuthURL(accessToken);
return true; return true;
@ -499,17 +500,17 @@ void DomainServer::setupICEHeartbeatForFullNetworking() {
limitedNodeList->startSTUNPublicSocketUpdate(); limitedNodeList->startSTUNPublicSocketUpdate();
// to send ICE heartbeats we'd better have a private key locally with an uploaded public key // to send ICE heartbeats we'd better have a private key locally with an uploaded public key
auto& accountManager = AccountManager::getInstance(); auto accountManager = DependencyManager::get<AccountManager>();
auto domainID = accountManager.getAccountInfo().getDomainID(); auto domainID = accountManager->getAccountInfo().getDomainID();
// if we have an access token and we don't have a private key or the current domain ID has changed // if we have an access token and we don't have a private key or the current domain ID has changed
// we should generate a new keypair // we should generate a new keypair
if (!accountManager.getAccountInfo().hasPrivateKey() || domainID != limitedNodeList->getSessionUUID()) { if (!accountManager->getAccountInfo().hasPrivateKey() || domainID != limitedNodeList->getSessionUUID()) {
accountManager.generateNewDomainKeypair(limitedNodeList->getSessionUUID()); accountManager->generateNewDomainKeypair(limitedNodeList->getSessionUUID());
} }
// hookup to the signal from account manager that tells us when keypair is available // hookup to the signal from account manager that tells us when keypair is available
connect(&accountManager, &AccountManager::newKeypair, this, &DomainServer::handleKeypairChange); connect(accountManager.data(), &AccountManager::newKeypair, this, &DomainServer::handleKeypairChange);
if (!_iceHeartbeatTimer) { if (!_iceHeartbeatTimer) {
// setup a timer to heartbeat with the ice-server every so often // setup a timer to heartbeat with the ice-server every so often
@ -962,9 +963,9 @@ void DomainServer::setupPendingAssignmentCredits() {
void DomainServer::sendPendingTransactionsToServer() { void DomainServer::sendPendingTransactionsToServer() {
AccountManager& accountManager = AccountManager::getInstance(); auto accountManager = DependencyManager::get<AccountManager>();
if (accountManager.hasValidAccessToken()) { if (accountManager->hasValidAccessToken()) {
// enumerate the pending transactions and send them to the server to complete payment // enumerate the pending transactions and send them to the server to complete payment
TransactionHash::iterator i = _pendingAssignmentCredits.begin(); TransactionHash::iterator i = _pendingAssignmentCredits.begin();
@ -975,7 +976,7 @@ void DomainServer::sendPendingTransactionsToServer() {
transactionCallbackParams.jsonCallbackMethod = "transactionJSONCallback"; transactionCallbackParams.jsonCallbackMethod = "transactionJSONCallback";
while (i != _pendingAssignmentCredits.end()) { while (i != _pendingAssignmentCredits.end()) {
accountManager.sendRequest("api/v1/transactions", accountManager->sendRequest("api/v1/transactions",
AccountManagerAuth::Required, AccountManagerAuth::Required,
QNetworkAccessManager::PostOperation, QNetworkAccessManager::PostOperation,
transactionCallbackParams, i.value()->postJson().toJson()); transactionCallbackParams, i.value()->postJson().toJson());
@ -1073,7 +1074,7 @@ void DomainServer::sendHeartbeatToDataServer(const QString& networkAddress) {
QString domainUpdateJSON = QString("{\"domain\": %1 }").arg(QString(QJsonDocument(domainObject).toJson())); QString domainUpdateJSON = QString("{\"domain\": %1 }").arg(QString(QJsonDocument(domainObject).toJson()));
AccountManager::getInstance().sendRequest(DOMAIN_UPDATE.arg(uuidStringWithoutCurlyBraces(domainID)), DependencyManager::get<AccountManager>()->sendRequest(DOMAIN_UPDATE.arg(uuidStringWithoutCurlyBraces(domainID)),
AccountManagerAuth::Required, AccountManagerAuth::Required,
QNetworkAccessManager::PutOperation, QNetworkAccessManager::PutOperation,
JSONCallbackParameters(), JSONCallbackParameters(),
@ -1103,7 +1104,7 @@ void DomainServer::sendICEServerAddressToMetaverseAPI() {
static const QString DOMAIN_ICE_ADDRESS_UPDATE = "/api/v1/domains/%1/ice_server_address"; static const QString DOMAIN_ICE_ADDRESS_UPDATE = "/api/v1/domains/%1/ice_server_address";
AccountManager::getInstance().sendRequest(DOMAIN_ICE_ADDRESS_UPDATE.arg(uuidStringWithoutCurlyBraces(domainID)), DependencyManager::get<AccountManager>()->sendRequest(DOMAIN_ICE_ADDRESS_UPDATE.arg(uuidStringWithoutCurlyBraces(domainID)),
AccountManagerAuth::Optional, AccountManagerAuth::Optional,
QNetworkAccessManager::PutOperation, QNetworkAccessManager::PutOperation,
callbackParameters, callbackParameters,
@ -1123,15 +1124,15 @@ void DomainServer::handleFailedICEServerAddressUpdate(QNetworkReply& requestRepl
void DomainServer::sendHeartbeatToIceServer() { void DomainServer::sendHeartbeatToIceServer() {
if (!_iceServerSocket.getAddress().isNull()) { if (!_iceServerSocket.getAddress().isNull()) {
auto& accountManager = AccountManager::getInstance(); auto accountManager = DependencyManager::get<AccountManager>();
auto limitedNodeList = DependencyManager::get<LimitedNodeList>(); auto limitedNodeList = DependencyManager::get<LimitedNodeList>();
if (!accountManager.getAccountInfo().hasPrivateKey()) { if (!accountManager->getAccountInfo().hasPrivateKey()) {
qWarning() << "Cannot send an ice-server heartbeat without a private key for signature."; qWarning() << "Cannot send an ice-server heartbeat without a private key for signature.";
qWarning() << "Waiting for keypair generation to complete before sending ICE heartbeat."; qWarning() << "Waiting for keypair generation to complete before sending ICE heartbeat.";
if (!limitedNodeList->getSessionUUID().isNull()) { if (!limitedNodeList->getSessionUUID().isNull()) {
accountManager.generateNewDomainKeypair(limitedNodeList->getSessionUUID()); accountManager->generateNewDomainKeypair(limitedNodeList->getSessionUUID());
} else { } else {
qWarning() << "Attempting to send ICE server heartbeat with no domain ID. This is not supported"; qWarning() << "Attempting to send ICE server heartbeat with no domain ID. This is not supported";
} }
@ -1208,7 +1209,7 @@ void DomainServer::sendHeartbeatToIceServer() {
auto plaintext = QByteArray::fromRawData(_iceServerHeartbeatPacket->getPayload(), _iceServerHeartbeatPacket->getPayloadSize()); auto plaintext = QByteArray::fromRawData(_iceServerHeartbeatPacket->getPayload(), _iceServerHeartbeatPacket->getPayloadSize());
// generate a signature for the plaintext data in the packet // generate a signature for the plaintext data in the packet
auto signature = accountManager.getAccountInfo().signPlaintext(plaintext); auto signature = accountManager->getAccountInfo().signPlaintext(plaintext);
// pack the signature with the data // pack the signature with the data
heartbeatDataStream << signature; heartbeatDataStream << signature;
@ -2101,7 +2102,7 @@ void DomainServer::processICEServerHeartbeatDenialPacket(QSharedPointer<Received
// we've hit our threshold of heartbeat denials, trigger a keypair re-generation // we've hit our threshold of heartbeat denials, trigger a keypair re-generation
auto limitedNodeList = DependencyManager::get<LimitedNodeList>(); auto limitedNodeList = DependencyManager::get<LimitedNodeList>();
AccountManager::getInstance().generateNewDomainKeypair(limitedNodeList->getSessionUUID()); DependencyManager::get<AccountManager>()->generateNewDomainKeypair(limitedNodeList->getSessionUUID());
// reset our number of heartbeat denials // reset our number of heartbeat denials
_numHeartbeatDenials = 0; _numHeartbeatDenials = 0;

View file

@ -402,6 +402,7 @@ bool setupEssentials(int& argc, char** argv) {
Setting::init(); Setting::init();
// Set dependencies // Set dependencies
DependencyManager::set<AccountManager>(std::bind(&Application::getUserAgent, qApp));
DependencyManager::set<ScriptEngines>(); DependencyManager::set<ScriptEngines>();
DependencyManager::set<Preferences>(); DependencyManager::set<Preferences>();
DependencyManager::set<recording::Deck>(); DependencyManager::set<recording::Deck>();
@ -656,15 +657,15 @@ Application::Application(int& argc, char** argv, QElapsedTimer& startupTimer) :
connect(nodeList.data(), &NodeList::packetVersionMismatch, this, &Application::notifyPacketVersionMismatch); connect(nodeList.data(), &NodeList::packetVersionMismatch, this, &Application::notifyPacketVersionMismatch);
// connect to appropriate slots on AccountManager // connect to appropriate slots on AccountManager
AccountManager& accountManager = AccountManager::getInstance(); auto accountManager = DependencyManager::get<AccountManager>();
auto dialogsManager = DependencyManager::get<DialogsManager>(); auto dialogsManager = DependencyManager::get<DialogsManager>();
connect(&accountManager, &AccountManager::authRequired, dialogsManager.data(), &DialogsManager::showLoginDialog); connect(accountManager.data(), &AccountManager::authRequired, dialogsManager.data(), &DialogsManager::showLoginDialog);
connect(&accountManager, &AccountManager::usernameChanged, this, &Application::updateWindowTitle); connect(accountManager.data(), &AccountManager::usernameChanged, this, &Application::updateWindowTitle);
// set the account manager's root URL and trigger a login request if we don't have the access token // set the account manager's root URL and trigger a login request if we don't have the access token
accountManager.setIsAgent(true); accountManager->setIsAgent(true);
accountManager.setAuthURL(NetworkingConstants::METAVERSE_SERVER_URL); accountManager->setAuthURL(NetworkingConstants::METAVERSE_SERVER_URL);
// sessionRunTime will be reset soon by loadSettings. Grab it now to get previous session value. // sessionRunTime will be reset soon by loadSettings. Grab it now to get previous session value.
// The value will be 0 if the user blew away settings this session, which is both a feature and a bug. // The value will be 0 if the user blew away settings this session, which is both a feature and a bug.
@ -1057,6 +1058,38 @@ Application::Application(int& argc, char** argv, QElapsedTimer& startupTimer) :
firstRun.set(false); firstRun.set(false);
} }
QString Application::getUserAgent() {
if (QThread::currentThread() != thread()) {
QString userAgent;
QMetaObject::invokeMethod(this, "getUserAgent", Qt::BlockingQueuedConnection, Q_RETURN_ARG(QString, userAgent));
return userAgent;
}
QString userAgent = "Mozilla/5.0 (HighFidelityInterface/" + BuildInfo::VERSION + "; "
+ QSysInfo::productType() + " " + QSysInfo::productVersion() + ")";
auto formatPluginName = [](QString name) -> QString { return name.trimmed().replace(" ", "-"); };
// For each plugin, add to userAgent
auto displayPlugins = PluginManager::getInstance()->getDisplayPlugins();
for (auto& dp : displayPlugins) {
if (dp->isActive() && dp->isHmd()) {
userAgent += " " + formatPluginName(dp->getName());
}
}
auto inputPlugins= PluginManager::getInstance()->getInputPlugins();
for (auto& ip : inputPlugins) {
if (ip->isActive()) {
userAgent += " " + formatPluginName(ip->getName());
}
}
return userAgent;
}
void Application::checkChangeCursor() { void Application::checkChangeCursor() {
QMutexLocker locker(&_changeCursorLock); QMutexLocker locker(&_changeCursorLock);
@ -4135,7 +4168,7 @@ void Application::updateWindowTitle() const {
auto nodeList = DependencyManager::get<NodeList>(); auto nodeList = DependencyManager::get<NodeList>();
QString connectionStatus = nodeList->getDomainHandler().isConnected() ? "" : " (NOT CONNECTED) "; QString connectionStatus = nodeList->getDomainHandler().isConnected() ? "" : " (NOT CONNECTED) ";
QString username = AccountManager::getInstance().getAccountInfo().getUsername(); QString username = DependencyManager::get<AccountManager>()->getAccountInfo().getUsername();
QString currentPlaceName = DependencyManager::get<AddressManager>()->getHost(); QString currentPlaceName = DependencyManager::get<AddressManager>()->getHost();
if (currentPlaceName.isEmpty()) { if (currentPlaceName.isEmpty()) {
@ -4775,8 +4808,8 @@ void Application::takeSnapshot() {
QString fileName = Snapshot::saveSnapshot(getActiveDisplayPlugin()->getScreenshot()); QString fileName = Snapshot::saveSnapshot(getActiveDisplayPlugin()->getScreenshot());
AccountManager& accountManager = AccountManager::getInstance(); auto accountManager = DependencyManager::get<AccountManager>();
if (!accountManager.isLoggedIn()) { if (!accountManager->isLoggedIn()) {
return; return;
} }

View file

@ -112,6 +112,9 @@ public:
QString getPreviousScriptLocation(); QString getPreviousScriptLocation();
void setPreviousScriptLocation(const QString& previousScriptLocation); void setPreviousScriptLocation(const QString& previousScriptLocation);
// Return an HTTP User-Agent string with OS and device information.
Q_INVOKABLE QString getUserAgent();
void initializeGL(); void initializeGL();
void initializeUi(); void initializeUi();
void paintGL(); void paintGL();

View file

@ -35,9 +35,9 @@ const QString API_USER_HEARTBEAT_PATH = "/api/v1/user/heartbeat";
const QString SESSION_ID_KEY = "session_id"; const QString SESSION_ID_KEY = "session_id";
void DiscoverabilityManager::updateLocation() { void DiscoverabilityManager::updateLocation() {
AccountManager& accountManager = AccountManager::getInstance(); auto accountManager = DependencyManager::get<AccountManager>();
if (_mode.get() != Discoverability::None && accountManager.isLoggedIn()) { if (_mode.get() != Discoverability::None && accountManager->isLoggedIn()) {
auto addressManager = DependencyManager::get<AddressManager>(); auto addressManager = DependencyManager::get<AddressManager>();
DomainHandler& domainHandler = DependencyManager::get<NodeList>()->getDomainHandler(); DomainHandler& domainHandler = DependencyManager::get<NodeList>()->getDomainHandler();
@ -98,7 +98,7 @@ void DiscoverabilityManager::updateLocation() {
apiPath = API_USER_LOCATION_PATH; apiPath = API_USER_LOCATION_PATH;
} }
accountManager.sendRequest(apiPath, AccountManagerAuth::Required, accountManager->sendRequest(apiPath, AccountManagerAuth::Required,
QNetworkAccessManager::PutOperation, QNetworkAccessManager::PutOperation,
callbackParameters, QJsonDocument(rootObject).toJson()); callbackParameters, QJsonDocument(rootObject).toJson());
@ -116,7 +116,7 @@ void DiscoverabilityManager::updateLocation() {
heartbeatObject[SESSION_ID_KEY] = QJsonValue(); heartbeatObject[SESSION_ID_KEY] = QJsonValue();
} }
accountManager.sendRequest(API_USER_HEARTBEAT_PATH, AccountManagerAuth::Optional, accountManager->sendRequest(API_USER_HEARTBEAT_PATH, AccountManagerAuth::Optional,
QNetworkAccessManager::PutOperation, callbackParameters, QNetworkAccessManager::PutOperation, callbackParameters,
QJsonDocument(heartbeatObject).toJson()); QJsonDocument(heartbeatObject).toJson());
} }
@ -131,8 +131,8 @@ void DiscoverabilityManager::handleHeartbeatResponse(QNetworkReply& requestReply
} }
void DiscoverabilityManager::removeLocation() { void DiscoverabilityManager::removeLocation() {
AccountManager& accountManager = AccountManager::getInstance(); auto accountManager = DependencyManager::get<AccountManager>();
accountManager.sendRequest(API_USER_LOCATION_PATH, AccountManagerAuth::Required, QNetworkAccessManager::DeleteOperation); accountManager->sendRequest(API_USER_LOCATION_PATH, AccountManagerAuth::Required, QNetworkAccessManager::DeleteOperation);
} }
void DiscoverabilityManager::setDiscoverabilityMode(Discoverability::Mode discoverabilityMode) { void DiscoverabilityManager::setDiscoverabilityMode(Discoverability::Mode discoverabilityMode) {

View file

@ -54,7 +54,7 @@ Menu* Menu::getInstance() {
Menu::Menu() { Menu::Menu() {
auto dialogsManager = DependencyManager::get<DialogsManager>(); auto dialogsManager = DependencyManager::get<DialogsManager>();
AccountManager& accountManager = AccountManager::getInstance(); auto accountManager = DependencyManager::get<AccountManager>();
// File/Application menu ---------------------------------- // File/Application menu ----------------------------------
MenuWrapper* fileMenu = addMenu("File"); MenuWrapper* fileMenu = addMenu("File");
@ -64,9 +64,9 @@ Menu::Menu() {
addActionToQMenuAndActionHash(fileMenu, MenuOption::Login); addActionToQMenuAndActionHash(fileMenu, MenuOption::Login);
// connect to the appropriate signal of the AccountManager so that we can change the Login/Logout menu item // connect to the appropriate signal of the AccountManager so that we can change the Login/Logout menu item
connect(&accountManager, &AccountManager::profileChanged, connect(accountManager.data(), &AccountManager::profileChanged,
dialogsManager.data(), &DialogsManager::toggleLoginDialog); dialogsManager.data(), &DialogsManager::toggleLoginDialog);
connect(&accountManager, &AccountManager::logoutComplete, connect(accountManager.data(), &AccountManager::logoutComplete,
dialogsManager.data(), &DialogsManager::toggleLoginDialog); dialogsManager.data(), &DialogsManager::toggleLoginDialog);
} }

View file

@ -144,11 +144,11 @@ int main(int argc, const char* argv[]) {
// If we failed the OpenGLVersion check, log it. // If we failed the OpenGLVersion check, log it.
if (override) { if (override) {
auto& accountManager = AccountManager::getInstance(); auto accountManager = DependencyManager::get<AccountManager>();
if (accountManager.isLoggedIn()) { if (accountManager->isLoggedIn()) {
UserActivityLogger::getInstance().insufficientGLVersion(glData); UserActivityLogger::getInstance().insufficientGLVersion(glData);
} else { } else {
QObject::connect(&AccountManager::getInstance(), &AccountManager::loginComplete, [glData](){ QObject::connect(accountManager.data(), &AccountManager::loginComplete, [glData](){
static bool loggedInsufficientGL = false; static bool loggedInsufficientGL = false;
if (!loggedInsufficientGL) { if (!loggedInsufficientGL) {
UserActivityLogger::getInstance().insufficientGLVersion(glData); UserActivityLogger::getInstance().insufficientGLVersion(glData);
@ -168,9 +168,9 @@ int main(int argc, const char* argv[]) {
QObject::connect(&server, &QLocalServer::newConnection, &app, &Application::handleLocalServerConnection, Qt::DirectConnection); QObject::connect(&server, &QLocalServer::newConnection, &app, &Application::handleLocalServerConnection, Qt::DirectConnection);
#ifdef HAS_BUGSPLAT #ifdef HAS_BUGSPLAT
AccountManager& accountManager = AccountManager::getInstance(); auto accountManager = DependencyManager::get<AccountManager>();
crashReporter.mpSender.setDefaultUserName(qPrintable(accountManager.getAccountInfo().getUsername())); crashReporter.mpSender.setDefaultUserName(qPrintable(accountManager->getAccountInfo().getUsername()));
QObject::connect(&accountManager, &AccountManager::usernameChanged, &app, [&crashReporter](const QString& newUsername) { QObject::connect(accountManager.data(), &AccountManager::usernameChanged, &app, [&crashReporter](const QString& newUsername) {
crashReporter.mpSender.setDefaultUserName(qPrintable(newUsername)); crashReporter.mpSender.setDefaultUserName(qPrintable(newUsername));
}); });

View file

@ -19,14 +19,14 @@ AccountScriptingInterface* AccountScriptingInterface::getInstance() {
} }
bool AccountScriptingInterface::isLoggedIn() { bool AccountScriptingInterface::isLoggedIn() {
AccountManager& accountManager = AccountManager::getInstance(); auto accountManager = DependencyManager::get<AccountManager>();
return accountManager.isLoggedIn(); return accountManager->isLoggedIn();
} }
QString AccountScriptingInterface::getUsername() { QString AccountScriptingInterface::getUsername() {
AccountManager& accountManager = AccountManager::getInstance(); auto accountManager = DependencyManager::get<AccountManager>();
if (accountManager.isLoggedIn()) { if (accountManager->isLoggedIn()) {
return accountManager.getAccountInfo().getUsername(); return accountManager->getAccountInfo().getUsername();
} else { } else {
return "Unknown user"; return "Unknown user";
} }

View file

@ -17,10 +17,10 @@
#include "GlobalServicesScriptingInterface.h" #include "GlobalServicesScriptingInterface.h"
GlobalServicesScriptingInterface::GlobalServicesScriptingInterface() { GlobalServicesScriptingInterface::GlobalServicesScriptingInterface() {
AccountManager& accountManager = AccountManager::getInstance(); auto accountManager = DependencyManager::get<AccountManager>();
connect(&accountManager, &AccountManager::usernameChanged, this, &GlobalServicesScriptingInterface::myUsernameChanged); connect(accountManager.data(), &AccountManager::usernameChanged, this, &GlobalServicesScriptingInterface::myUsernameChanged);
connect(&accountManager, &AccountManager::logoutComplete, this, &GlobalServicesScriptingInterface::loggedOut); connect(accountManager.data(), &AccountManager::logoutComplete, this, &GlobalServicesScriptingInterface::loggedOut);
connect(&accountManager, &AccountManager::loginComplete, this, &GlobalServicesScriptingInterface::connected); connect(accountManager.data(), &AccountManager::loginComplete, this, &GlobalServicesScriptingInterface::connected);
_downloading = false; _downloading = false;
QTimer* checkDownloadTimer = new QTimer(this); QTimer* checkDownloadTimer = new QTimer(this);
@ -34,10 +34,10 @@ GlobalServicesScriptingInterface::GlobalServicesScriptingInterface() {
} }
GlobalServicesScriptingInterface::~GlobalServicesScriptingInterface() { GlobalServicesScriptingInterface::~GlobalServicesScriptingInterface() {
AccountManager& accountManager = AccountManager::getInstance(); auto accountManager = DependencyManager::get<AccountManager>();
disconnect(&accountManager, &AccountManager::usernameChanged, this, &GlobalServicesScriptingInterface::myUsernameChanged); disconnect(accountManager.data(), &AccountManager::usernameChanged, this, &GlobalServicesScriptingInterface::myUsernameChanged);
disconnect(&accountManager, &AccountManager::logoutComplete, this, &GlobalServicesScriptingInterface::loggedOut); disconnect(accountManager.data(), &AccountManager::logoutComplete, this, &GlobalServicesScriptingInterface::loggedOut);
disconnect(&accountManager, &AccountManager::loginComplete, this, &GlobalServicesScriptingInterface::connected); disconnect(accountManager.data(), &AccountManager::loginComplete, this, &GlobalServicesScriptingInterface::connected);
} }
GlobalServicesScriptingInterface* GlobalServicesScriptingInterface::getInstance() { GlobalServicesScriptingInterface* GlobalServicesScriptingInterface::getInstance() {
@ -46,7 +46,7 @@ GlobalServicesScriptingInterface* GlobalServicesScriptingInterface::getInstance(
} }
const QString& GlobalServicesScriptingInterface::getUsername() const { const QString& GlobalServicesScriptingInterface::getUsername() const {
return AccountManager::getInstance().getAccountInfo().getUsername(); return DependencyManager::get<AccountManager>()->getAccountInfo().getUsername();
} }
void GlobalServicesScriptingInterface::loggedOut() { void GlobalServicesScriptingInterface::loggedOut() {

View file

@ -24,14 +24,15 @@ HIFI_QML_DEF(LoginDialog)
LoginDialog::LoginDialog(QQuickItem *parent) : OffscreenQmlDialog(parent), LoginDialog::LoginDialog(QQuickItem *parent) : OffscreenQmlDialog(parent),
_rootUrl(NetworkingConstants::METAVERSE_SERVER_URL.toString()) _rootUrl(NetworkingConstants::METAVERSE_SERVER_URL.toString())
{ {
connect(&AccountManager::getInstance(), &AccountManager::loginComplete, auto accountManager = DependencyManager::get<AccountManager>();
connect(accountManager.data(), &AccountManager::loginComplete,
this, &LoginDialog::handleLoginCompleted); this, &LoginDialog::handleLoginCompleted);
connect(&AccountManager::getInstance(), &AccountManager::loginFailed, connect(accountManager.data(), &AccountManager::loginFailed,
this, &LoginDialog::handleLoginFailed); this, &LoginDialog::handleLoginFailed);
} }
void LoginDialog::toggleAction() { void LoginDialog::toggleAction() {
AccountManager& accountManager = AccountManager::getInstance(); auto accountManager = DependencyManager::get<AccountManager>();
QAction* loginAction = Menu::getInstance()->getActionForOption(MenuOption::Login); QAction* loginAction = Menu::getInstance()->getActionForOption(MenuOption::Login);
Q_CHECK_PTR(loginAction); Q_CHECK_PTR(loginAction);
static QMetaObject::Connection connection; static QMetaObject::Connection connection;
@ -39,10 +40,10 @@ void LoginDialog::toggleAction() {
disconnect(connection); disconnect(connection);
} }
if (accountManager.isLoggedIn()) { if (accountManager->isLoggedIn()) {
// change the menu item to logout // change the menu item to logout
loginAction->setText("Logout " + accountManager.getAccountInfo().getUsername()); loginAction->setText("Logout " + accountManager->getAccountInfo().getUsername());
connection = connect(loginAction, &QAction::triggered, &accountManager, &AccountManager::logout); connection = connect(loginAction, &QAction::triggered, accountManager.data(), &AccountManager::logout);
} else { } else {
// change the menu item to login // change the menu item to login
loginAction->setText("Login"); loginAction->setText("Login");
@ -78,7 +79,7 @@ QString LoginDialog::rootUrl() const {
void LoginDialog::login(const QString& username, const QString& password) { void LoginDialog::login(const QString& username, const QString& password) {
qDebug() << "Attempting to login " << username; qDebug() << "Attempting to login " << username;
setStatusText("Logging in..."); setStatusText("Logging in...");
AccountManager::getInstance().requestAccessToken(username, password); DependencyManager::get<AccountManager>()->requestAccessToken(username, password);
} }
void LoginDialog::openUrl(const QString& url) { void LoginDialog::openUrl(const QString& url) {

View file

@ -92,7 +92,7 @@ QFile* Snapshot::savedFileForSnapshot(QImage & shot, bool isTemporary) {
QUrl currentURL = DependencyManager::get<AddressManager>()->currentAddress(); QUrl currentURL = DependencyManager::get<AddressManager>()->currentAddress();
shot.setText(URL, currentURL.toString()); shot.setText(URL, currentURL.toString());
QString username = AccountManager::getInstance().getAccountInfo().getUsername(); QString username = DependencyManager::get<AccountManager>()->getAccountInfo().getUsername();
// normalize username, replace all non alphanumeric with '-' // normalize username, replace all non alphanumeric with '-'
username.replace(QRegExp("[^A-Za-z0-9_]"), "-"); username.replace(QRegExp("[^A-Za-z0-9_]"), "-");
@ -144,14 +144,15 @@ const QString SUCCESS_LABEL_TEMPLATE = "Success!!! Go check out your image ...<b
QString SnapshotUploader::uploadSnapshot(const QUrl& fileUrl) { QString SnapshotUploader::uploadSnapshot(const QUrl& fileUrl) {
if (AccountManager::getInstance().getAccountInfo().getDiscourseApiKey().isEmpty()) { auto accountManager = DependencyManager::get<AccountManager>();
if (accountManager->getAccountInfo().getDiscourseApiKey().isEmpty()) {
OffscreenUi::warning(nullptr, "", "Your Discourse API key is missing, you cannot share snapshots. Please try to relog."); OffscreenUi::warning(nullptr, "", "Your Discourse API key is missing, you cannot share snapshots. Please try to relog.");
return QString(); return QString();
} }
QHttpPart apiKeyPart; QHttpPart apiKeyPart;
apiKeyPart.setHeader(QNetworkRequest::ContentDispositionHeader, QVariant("form-data; name=\"api_key\"")); apiKeyPart.setHeader(QNetworkRequest::ContentDispositionHeader, QVariant("form-data; name=\"api_key\""));
apiKeyPart.setBody(AccountManager::getInstance().getAccountInfo().getDiscourseApiKey().toLatin1()); apiKeyPart.setBody(accountManager->getAccountInfo().getDiscourseApiKey().toLatin1());
QString filename = fileUrl.toLocalFile(); QString filename = fileUrl.toLocalFile();
qDebug() << filename; qDebug() << filename;
@ -206,7 +207,7 @@ QString SnapshotUploader::sendForumPost(const QString& snapshotPath, const QStri
QUrl forumUrl(FORUM_POST_URL); QUrl forumUrl(FORUM_POST_URL);
QUrlQuery query; QUrlQuery query;
query.addQueryItem("api_key", AccountManager::getInstance().getAccountInfo().getDiscourseApiKey()); query.addQueryItem("api_key", DependencyManager::get<AccountManager>()->getAccountInfo().getDiscourseApiKey());
query.addQueryItem("topic_id", FORUM_REPLY_TO_TOPIC); query.addQueryItem("topic_id", FORUM_REPLY_TO_TOPIC);
query.addQueryItem("raw", FORUM_POST_TEMPLATE.arg(snapshotPath, notes)); query.addQueryItem("raw", FORUM_POST_TEMPLATE.arg(snapshotPath, notes));
forumUrl.setQuery(query); forumUrl.setQuery(query);

View file

@ -36,16 +36,6 @@
const bool VERBOSE_HTTP_REQUEST_DEBUGGING = false; const bool VERBOSE_HTTP_REQUEST_DEBUGGING = false;
AccountManager& AccountManager::getInstance(bool forceReset) {
static std::unique_ptr<AccountManager> sharedInstance(new AccountManager());
if (forceReset) {
sharedInstance.reset(new AccountManager());
}
return *sharedInstance;
}
Q_DECLARE_METATYPE(OAuthAccessToken) Q_DECLARE_METATYPE(OAuthAccessToken)
Q_DECLARE_METATYPE(DataServerAccountInfo) Q_DECLARE_METATYPE(DataServerAccountInfo)
Q_DECLARE_METATYPE(QNetworkAccessManager::Operation) Q_DECLARE_METATYPE(QNetworkAccessManager::Operation)
@ -79,7 +69,8 @@ QJsonObject AccountManager::dataObjectFromResponse(QNetworkReply &requestReply)
} }
} }
AccountManager::AccountManager() : AccountManager::AccountManager(UserAgentGetter userAgentGetter) :
_userAgentGetter(userAgentGetter),
_authURL(), _authURL(),
_pendingCallbackMap() _pendingCallbackMap()
{ {
@ -222,8 +213,9 @@ void AccountManager::sendRequest(const QString& path,
QNetworkAccessManager& networkAccessManager = NetworkAccessManager::getInstance(); QNetworkAccessManager& networkAccessManager = NetworkAccessManager::getInstance();
QNetworkRequest networkRequest; QNetworkRequest networkRequest;
networkRequest.setHeader(QNetworkRequest::UserAgentHeader, HIGH_FIDELITY_USER_AGENT);
networkRequest.setHeader(QNetworkRequest::UserAgentHeader, _userAgentGetter());
QUrl requestURL = _authURL; QUrl requestURL = _authURL;
if (path.startsWith("/")) { if (path.startsWith("/")) {
@ -473,7 +465,7 @@ void AccountManager::requestAccessToken(const QString& login, const QString& pas
QNetworkAccessManager& networkAccessManager = NetworkAccessManager::getInstance(); QNetworkAccessManager& networkAccessManager = NetworkAccessManager::getInstance();
QNetworkRequest request; QNetworkRequest request;
request.setHeader(QNetworkRequest::UserAgentHeader, HIGH_FIDELITY_USER_AGENT); request.setHeader(QNetworkRequest::UserAgentHeader, _userAgentGetter());
QUrl grantURL = _authURL; QUrl grantURL = _authURL;
grantURL.setPath("/oauth/token"); grantURL.setPath("/oauth/token");
@ -543,7 +535,7 @@ void AccountManager::requestProfile() {
profileURL.setPath("/api/v1/user/profile"); profileURL.setPath("/api/v1/user/profile");
QNetworkRequest profileRequest(profileURL); QNetworkRequest profileRequest(profileURL);
profileRequest.setHeader(QNetworkRequest::UserAgentHeader, HIGH_FIDELITY_USER_AGENT); profileRequest.setHeader(QNetworkRequest::UserAgentHeader, _userAgentGetter());
profileRequest.setRawHeader(ACCESS_TOKEN_AUTHORIZATION_HEADER, _accountInfo.getAccessToken().authorizationHeaderValue()); profileRequest.setRawHeader(ACCESS_TOKEN_AUTHORIZATION_HEADER, _accountInfo.getAccessToken().authorizationHeaderValue());
QNetworkReply* profileReply = networkAccessManager.get(profileRequest); QNetworkReply* profileReply = networkAccessManager.get(profileRequest);

View file

@ -20,6 +20,9 @@
#include "NetworkAccessManager.h" #include "NetworkAccessManager.h"
#include "DataServerAccountInfo.h" #include "DataServerAccountInfo.h"
#include "SharedUtil.h"
#include <DependencyManager.h>
class JSONCallbackParameters { class JSONCallbackParameters {
public: public:
@ -49,10 +52,14 @@ Q_DECLARE_METATYPE(AccountManagerAuth::Type);
const QByteArray ACCESS_TOKEN_AUTHORIZATION_HEADER = "Authorization"; const QByteArray ACCESS_TOKEN_AUTHORIZATION_HEADER = "Authorization";
class AccountManager : public QObject { using UserAgentGetter = std::function<QString()>;
const auto DEFAULT_USER_AGENT_GETTER = []() -> QString { return HIGH_FIDELITY_USER_AGENT; };
class AccountManager : public QObject, public Dependency {
Q_OBJECT Q_OBJECT
public: public:
static AccountManager& getInstance(bool forceReset = false); AccountManager(UserAgentGetter userAgentGetter = DEFAULT_USER_AGENT_GETTER);
Q_INVOKABLE void sendRequest(const QString& path, Q_INVOKABLE void sendRequest(const QString& path,
AccountManagerAuth::Type authType, AccountManagerAuth::Type authType,
@ -109,7 +116,6 @@ private slots:
void generateNewKeypair(bool isUserKeypair = true, const QUuid& domainID = QUuid()); void generateNewKeypair(bool isUserKeypair = true, const QUuid& domainID = QUuid());
private: private:
AccountManager();
AccountManager(AccountManager const& other) = delete; AccountManager(AccountManager const& other) = delete;
void operator=(AccountManager const& other) = delete; void operator=(AccountManager const& other) = delete;
@ -119,6 +125,8 @@ private:
void passSuccessToCallback(QNetworkReply* reply); void passSuccessToCallback(QNetworkReply* reply);
void passErrorToCallback(QNetworkReply* reply); void passErrorToCallback(QNetworkReply* reply);
UserAgentGetter _userAgentGetter;
QUrl _authURL; QUrl _authURL;
QMap<QNetworkReply*, JSONCallbackParameters> _pendingCallbackMap; QMap<QNetworkReply*, JSONCallbackParameters> _pendingCallbackMap;

View file

@ -374,7 +374,7 @@ void AddressManager::attemptPlaceNameLookup(const QString& lookupString, const Q
// remember how this lookup was triggered for history storage handling later // remember how this lookup was triggered for history storage handling later
requestParams.insert(LOOKUP_TRIGGER_KEY, static_cast<int>(trigger)); requestParams.insert(LOOKUP_TRIGGER_KEY, static_cast<int>(trigger));
AccountManager::getInstance().sendRequest(GET_PLACE.arg(placeName), DependencyManager::get<AccountManager>()->sendRequest(GET_PLACE.arg(placeName),
AccountManagerAuth::None, AccountManagerAuth::None,
QNetworkAccessManager::GetOperation, QNetworkAccessManager::GetOperation,
apiCallbackParameters(), apiCallbackParameters(),
@ -397,7 +397,7 @@ void AddressManager::attemptDomainIDLookup(const QString& lookupString, const QS
// remember how this lookup was triggered for history storage handling later // remember how this lookup was triggered for history storage handling later
requestParams.insert(LOOKUP_TRIGGER_KEY, static_cast<int>(trigger)); requestParams.insert(LOOKUP_TRIGGER_KEY, static_cast<int>(trigger));
AccountManager::getInstance().sendRequest(GET_DOMAIN_ID.arg(domainID), DependencyManager::get<AccountManager>()->sendRequest(GET_DOMAIN_ID.arg(domainID),
AccountManagerAuth::None, AccountManagerAuth::None,
QNetworkAccessManager::GetOperation, QNetworkAccessManager::GetOperation,
apiCallbackParameters(), apiCallbackParameters(),
@ -577,7 +577,6 @@ bool AddressManager::setHost(const QString& host, LookupTrigger trigger, quint16
return false; return false;
} }
bool AddressManager::setDomainInfo(const QString& hostname, quint16 port, LookupTrigger trigger) { bool AddressManager::setDomainInfo(const QString& hostname, quint16 port, LookupTrigger trigger) {
bool hostChanged = setHost(hostname, trigger, port); bool hostChanged = setHost(hostname, trigger, port);
@ -600,7 +599,7 @@ void AddressManager::goToUser(const QString& username) {
requestParams.insert(LOOKUP_TRIGGER_KEY, static_cast<int>(LookupTrigger::UserInput)); requestParams.insert(LOOKUP_TRIGGER_KEY, static_cast<int>(LookupTrigger::UserInput));
// this is a username - pull the captured name and lookup that user's location // this is a username - pull the captured name and lookup that user's location
AccountManager::getInstance().sendRequest(GET_USER_LOCATION.arg(formattedUsername), DependencyManager::get<AccountManager>()->sendRequest(GET_USER_LOCATION.arg(formattedUsername),
AccountManagerAuth::Optional, AccountManagerAuth::Optional,
QNetworkAccessManager::GetOperation, QNetworkAccessManager::GetOperation,
apiCallbackParameters(), apiCallbackParameters(),

View file

@ -371,10 +371,10 @@ void DomainHandler::processDomainServerConnectionDeniedPacket(QSharedPointer<Rec
emit domainConnectionRefused(reason); emit domainConnectionRefused(reason);
} }
auto& accountManager = AccountManager::getInstance(); auto accountManager = DependencyManager::get<AccountManager>();
if (!_hasCheckedForAccessToken) { if (!_hasCheckedForAccessToken) {
accountManager.checkAndSignalForAccessToken(); accountManager->checkAndSignalForAccessToken();
_hasCheckedForAccessToken = true; _hasCheckedForAccessToken = true;
} }
@ -382,7 +382,7 @@ void DomainHandler::processDomainServerConnectionDeniedPacket(QSharedPointer<Rec
// force a re-generation of key-pair after CONNECTION_DENIALS_FOR_KEYPAIR_REGEN failed connection attempts // force a re-generation of key-pair after CONNECTION_DENIALS_FOR_KEYPAIR_REGEN failed connection attempts
if (++_connectionDenialsSinceKeypairRegen >= CONNECTION_DENIALS_FOR_KEYPAIR_REGEN) { if (++_connectionDenialsSinceKeypairRegen >= CONNECTION_DENIALS_FOR_KEYPAIR_REGEN) {
accountManager.generateNewUserKeypair(); accountManager->generateNewUserKeypair();
_connectionDenialsSinceKeypairRegen = 0; _connectionDenialsSinceKeypairRegen = 0;
} }
} }

View file

@ -80,16 +80,16 @@ NodeList::NodeList(char newOwnerType, unsigned short socketListenPort, unsigned
// send a ping punch immediately // send a ping punch immediately
connect(&_domainHandler, &DomainHandler::icePeerSocketsReceived, this, &NodeList::pingPunchForDomainServer); connect(&_domainHandler, &DomainHandler::icePeerSocketsReceived, this, &NodeList::pingPunchForDomainServer);
auto &accountManager = AccountManager::getInstance(); auto accountManager = DependencyManager::get<AccountManager>();
// assume that we may need to send a new DS check in anytime a new keypair is generated // assume that we may need to send a new DS check in anytime a new keypair is generated
connect(&accountManager, &AccountManager::newKeypair, this, &NodeList::sendDomainServerCheckIn); connect(accountManager.data(), &AccountManager::newKeypair, this, &NodeList::sendDomainServerCheckIn);
// clear out NodeList when login is finished // clear out NodeList when login is finished
connect(&accountManager, &AccountManager::loginComplete , this, &NodeList::reset); connect(accountManager.data(), &AccountManager::loginComplete , this, &NodeList::reset);
// clear our NodeList when logout is requested // clear our NodeList when logout is requested
connect(&accountManager, &AccountManager::logoutComplete , this, &NodeList::reset); connect(accountManager.data(), &AccountManager::logoutComplete , this, &NodeList::reset);
// anytime we get a new node we will want to attempt to punch to it // anytime we get a new node we will want to attempt to punch to it
connect(this, &LimitedNodeList::nodeAdded, this, &NodeList::startNodeHolePunch); connect(this, &LimitedNodeList::nodeAdded, this, &NodeList::startNodeHolePunch);
@ -273,7 +273,7 @@ void NodeList::sendDomainServerCheckIn() {
} }
// check if we're missing a keypair we need to verify ourselves with the domain-server // check if we're missing a keypair we need to verify ourselves with the domain-server
auto& accountManager = AccountManager::getInstance(); auto accountManager = DependencyManager::get<AccountManager>();
const QUuid& connectionToken = _domainHandler.getConnectionToken(); const QUuid& connectionToken = _domainHandler.getConnectionToken();
// we assume that we're on the same box as the DS if it has the same local address and // we assume that we're on the same box as the DS if it has the same local address and
@ -283,10 +283,10 @@ void NodeList::sendDomainServerCheckIn() {
bool requiresUsernameSignature = !_domainHandler.isConnected() && !connectionToken.isNull() && !localhostDomain; bool requiresUsernameSignature = !_domainHandler.isConnected() && !connectionToken.isNull() && !localhostDomain;
if (requiresUsernameSignature && !accountManager.getAccountInfo().hasPrivateKey()) { if (requiresUsernameSignature && !accountManager->getAccountInfo().hasPrivateKey()) {
qWarning() << "A keypair is required to present a username signature to the domain-server" qWarning() << "A keypair is required to present a username signature to the domain-server"
<< "but no keypair is present. Waiting for keypair generation to complete."; << "but no keypair is present. Waiting for keypair generation to complete.";
accountManager.generateNewUserKeypair(); accountManager->generateNewUserKeypair();
// don't send the check in packet - wait for the keypair first // don't send the check in packet - wait for the keypair first
return; return;
@ -318,12 +318,12 @@ void NodeList::sendDomainServerCheckIn() {
packetStream << _ownerType << _publicSockAddr << _localSockAddr << _nodeTypesOfInterest.toList(); packetStream << _ownerType << _publicSockAddr << _localSockAddr << _nodeTypesOfInterest.toList();
if (!_domainHandler.isConnected()) { if (!_domainHandler.isConnected()) {
DataServerAccountInfo& accountInfo = accountManager.getAccountInfo(); DataServerAccountInfo& accountInfo = accountManager->getAccountInfo();
packetStream << accountInfo.getUsername(); packetStream << accountInfo.getUsername();
// if this is a connect request, and we can present a username signature, send it along // if this is a connect request, and we can present a username signature, send it along
if (requiresUsernameSignature && accountManager.getAccountInfo().hasPrivateKey()) { if (requiresUsernameSignature && accountManager->getAccountInfo().hasPrivateKey()) {
const QByteArray& usernameSignature = accountManager.getAccountInfo().getUsernameSignature(connectionToken); const QByteArray& usernameSignature = accountManager->getAccountInfo().getUsernameSignature(connectionToken);
packetStream << usernameSignature; packetStream << usernameSignature;
} }
} }

View file

@ -32,14 +32,14 @@ OAuthNetworkAccessManager* OAuthNetworkAccessManager::getInstance() {
QNetworkReply* OAuthNetworkAccessManager::createRequest(QNetworkAccessManager::Operation op, const QNetworkRequest& req, QNetworkReply* OAuthNetworkAccessManager::createRequest(QNetworkAccessManager::Operation op, const QNetworkRequest& req,
QIODevice* outgoingData) { QIODevice* outgoingData) {
AccountManager& accountManager = AccountManager::getInstance(); auto accountManager = DependencyManager::get<AccountManager>();
if (accountManager.hasValidAccessToken() if (accountManager->hasValidAccessToken()
&& req.url().host() == NetworkingConstants::METAVERSE_SERVER_URL.host()) { && req.url().host() == NetworkingConstants::METAVERSE_SERVER_URL.host()) {
QNetworkRequest authenticatedRequest(req); QNetworkRequest authenticatedRequest(req);
authenticatedRequest.setHeader(QNetworkRequest::UserAgentHeader, HIGH_FIDELITY_USER_AGENT); authenticatedRequest.setHeader(QNetworkRequest::UserAgentHeader, HIGH_FIDELITY_USER_AGENT);
authenticatedRequest.setRawHeader(ACCESS_TOKEN_AUTHORIZATION_HEADER, authenticatedRequest.setRawHeader(ACCESS_TOKEN_AUTHORIZATION_HEADER,
accountManager.getAccountInfo().getAccessToken().authorizationHeaderValue()); accountManager->getAccountInfo().getAccessToken().authorizationHeaderValue());
return QNetworkAccessManager::createRequest(op, authenticatedRequest, outgoingData); return QNetworkAccessManager::createRequest(op, authenticatedRequest, outgoingData);
} else { } else {

View file

@ -17,6 +17,7 @@
#include "NetworkLogging.h" #include "NetworkLogging.h"
#include "UserActivityLogger.h" #include "UserActivityLogger.h"
#include <DependencyManager.h>
static const QString USER_ACTIVITY_URL = "/api/v1/user_activities"; static const QString USER_ACTIVITY_URL = "/api/v1/user_activities";
@ -34,7 +35,7 @@ void UserActivityLogger::logAction(QString action, QJsonObject details, JSONCall
return; return;
} }
AccountManager& accountManager = AccountManager::getInstance(); auto accountManager = DependencyManager::get<AccountManager>();
QHttpMultiPart* multipart = new QHttpMultiPart(QHttpMultiPart::FormDataType); QHttpMultiPart* multipart = new QHttpMultiPart(QHttpMultiPart::FormDataType);
// Adding the action name // Adding the action name
@ -59,7 +60,7 @@ void UserActivityLogger::logAction(QString action, QJsonObject details, JSONCall
params.errorCallbackMethod = "requestError"; params.errorCallbackMethod = "requestError";
} }
accountManager.sendRequest(USER_ACTIVITY_URL, accountManager->sendRequest(USER_ACTIVITY_URL,
AccountManagerAuth::Optional, AccountManagerAuth::Optional,
QNetworkAccessManager::PostOperation, QNetworkAccessManager::PostOperation,
params, NULL, multipart); params, NULL, multipart);

View file

@ -140,11 +140,11 @@ void XMLHttpRequestClass::open(const QString& method, const QString& url, bool a
_async = async; _async = async;
if (url.toLower().left(METAVERSE_API_URL.length()) == METAVERSE_API_URL) { if (url.toLower().left(METAVERSE_API_URL.length()) == METAVERSE_API_URL) {
AccountManager& accountManager = AccountManager::getInstance(); auto accountManager = DependencyManager::get<AccountManager>();
if (accountManager.hasValidAccessToken()) { if (accountManager->hasValidAccessToken()) {
QUrlQuery urlQuery(_url.query()); QUrlQuery urlQuery(_url.query());
urlQuery.addQueryItem("access_token", accountManager.getAccountInfo().getAccessToken().token); urlQuery.addQueryItem("access_token", accountManager->getAccountInfo().getAccessToken().token);
_url.setQuery(urlQuery); _url.setQuery(urlQuery);
} }

View file

@ -53,8 +53,8 @@ QString fixupHifiUrl(const QString& urlString) {
QUrl url(urlString); QUrl url(urlString);
QUrlQuery query(url); QUrlQuery query(url);
if (url.host() == ALLOWED_HOST && query.allQueryItemValues(ACCESS_TOKEN_PARAMETER).empty()) { if (url.host() == ALLOWED_HOST && query.allQueryItemValues(ACCESS_TOKEN_PARAMETER).empty()) {
AccountManager& accountManager = AccountManager::getInstance(); auto accountManager = DependencyManager::get<AccountManager>();
query.addQueryItem(ACCESS_TOKEN_PARAMETER, accountManager.getAccountInfo().getAccessToken().token); query.addQueryItem(ACCESS_TOKEN_PARAMETER, accountManager->getAccountInfo().getAccessToken().token);
url.setQuery(query.query()); url.setQuery(query.query());
return url.toString(); return url.toString();
} }

View file

@ -84,16 +84,16 @@ void Tooltip::requestHyperlinkImage() {
// should the network link be removed from UI at a later date. // should the network link be removed from UI at a later date.
// we possibly have a valid place name - so ask the API for the associated info // we possibly have a valid place name - so ask the API for the associated info
AccountManager& accountManager = AccountManager::getInstance(); auto accountManager = DependencyManager::get<AccountManager>();
JSONCallbackParameters callbackParams; JSONCallbackParameters callbackParams;
callbackParams.jsonCallbackReceiver = this; callbackParams.jsonCallbackReceiver = this;
callbackParams.jsonCallbackMethod = "handleAPIResponse"; callbackParams.jsonCallbackMethod = "handleAPIResponse";
accountManager.sendRequest(GET_PLACE.arg(_title), accountManager->sendRequest(GET_PLACE.arg(_title),
AccountManagerAuth::None, AccountManagerAuth::None,
QNetworkAccessManager::GetOperation, QNetworkAccessManager::GetOperation,
callbackParams); callbackParams);
} }
} }
} }