diff --git a/interface/resources/qml/LoginDialog/LinkAccountBody.qml b/interface/resources/qml/LoginDialog/LinkAccountBody.qml index a4d05d9bc4..67fa06c05a 100644 --- a/interface/resources/qml/LoginDialog/LinkAccountBody.qml +++ b/interface/resources/qml/LoginDialog/LinkAccountBody.qml @@ -74,6 +74,19 @@ Item { } function login() { + // make sure the metaverse server is set so we don't send your password to the wrong place! + if (!isLoggingInToDomain) { + Settings.setValue("private/selectedMetaverseURL", metaverseServerField.text); + } + + if (keepMeLoggedInCheckbox.checked) { + if (!isLoggingInToDomain) { + Settings.setValue("keepMeLoggedIn/savedUsername", emailField.text); + } else { + // ####### TODO + } + } + if (!isLoggingInToDomain) { loginDialog.login(emailField.text, passwordField.text); } else { @@ -118,6 +131,10 @@ Item { if (!isLoggingInToDomain) { var savedUsername = Settings.getValue("keepMeLoggedIn/savedUsername", ""); emailField.text = keepMeLoggedInCheckbox.checked ? savedUsername === "Unknown user" ? "" : savedUsername : ""; + + var metaverseServer = Settings.getValue("private/selectedMetaverseURL", ""); + console.log("Saved metaverse server:", metaverseServer); + metaverseServerField.text = metaverseServer; } else { // ####### TODO } @@ -147,7 +164,7 @@ Item { Item { id: loginContainer width: displayNameField.width - height: errorContainer.height + loginDialogTextContainer.height + displayNameField.height + emailField.height + passwordField.height + 5.5 * hifi.dimensions.contentSpacing.y + + height: errorContainer.height + loginDialogTextContainer.height + displayNameField.height + emailField.height + passwordField.height + metaverseServerField.height + 5.5 * hifi.dimensions.contentSpacing.y + keepMeLoggedInCheckbox.height + loginButton.height + cantAccessTextMetrics.height + continueButton.height anchors { top: parent.top @@ -237,18 +254,11 @@ Item { break; case Qt.Key_Backtab: event.accepted = true; - passwordField.focus = true; + metaverseServerField.focus = true; break; case Qt.Key_Enter: case Qt.Key_Return: event.accepted = true; - if (keepMeLoggedInCheckbox.checked) { - if (!isLoggingInToDomain) { - Settings.setValue("keepMeLoggedIn/savedUsername", emailField.text); - } else { - // ####### TODO - } - } linkAccountBody.login(); break; } @@ -285,13 +295,7 @@ Item { case Qt.Key_Enter: case Qt.Key_Return: event.accepted = true; - if (keepMeLoggedInCheckbox.checked) { - if (!isLoggingInToDomain) { - Settings.setValue("keepMeLoggedIn/savedUsername", emailField.text); - } else { - // ####### TODO - } - } + linkAccountBody.login(); break; } @@ -360,7 +364,7 @@ Item { switch (event.key) { case Qt.Key_Tab: event.accepted = true; - displayNameField.focus = true; + metaverseServerField.focus = true; break; case Qt.Key_Backtab: event.accepted = true; @@ -369,18 +373,69 @@ Item { case Qt.Key_Enter: case Qt.Key_Return: event.accepted = true; - if (keepMeLoggedInCheckbox.checked) { - if (!isLoggingInToDomain) { - Settings.setValue("keepMeLoggedIn/savedUsername", emailField.text); - } else { - // ####### TODO - } - } linkAccountBody.login(); break; } } } + HifiControlsUit.TextField { + id: metaverseServerField + width: root.bannerWidth + height: linkAccountBody.textFieldHeight + font.pixelSize: linkAccountBody.textFieldFontSize + styleRenderType: Text.QtRendering + anchors { + top: passwordField.bottom + topMargin: 1.5 * hifi.dimensions.contentSpacing.y + } + placeholderText: "Metaverse Server (optional)" + activeFocusOnPress: true + Keys.onPressed: { + switch (event.key) { + case Qt.Key_Tab: + event.accepted = true; + displayNameField.focus = true; + break; + case Qt.Key_Backtab: + event.accepted = true; + passwordField.focus = true; + break; + case Qt.Key_Enter: + case Qt.Key_Return: + event.accepted = true; + if (!isLoggingInToDomain) { + var url = metaverseServerField.text; + console.log("Setting metaverse server to", url); + Settings.setValue("private/selectedMetaverseURL", url); + if(AccountServices.isLoggedIn()){ + AccountServices.logOut(); + } + passwordField.text = ""; + AccountServices.updateAuthURLFromMetaverseServerURL(); + } + break; + } + } + onFocusChanged: { + root.text = ""; + if (focus) { + root.isPassword = false; + }else{ + var url = metaverseServerField.text; + if(!(url == Settings.getValue("private/selectedMetaverseURL")) && !(url == "")){ + if (!isLoggingInToDomain) { + console.log("Setting metaverse server to", url); + Settings.setValue("private/selectedMetaverseURL", url); + if(AccountServices.isLoggedIn()){ + AccountServices.logOut(); + } + passwordField.text = ""; + AccountServices.updateAuthURLFromMetaverseServerURL(); + } + } + } + } + } HifiControlsUit.CheckBox { id: keepMeLoggedInCheckbox checked: !isLoggingInToDomain ? Settings.getValue("keepMeLoggedIn", false) : false; // ####### TODO @@ -391,9 +446,9 @@ Item { color: hifi.colors.white; visible: !isLoggingInToDomain anchors { - top: passwordField.bottom; + top: metaverseServerField.bottom; topMargin: hifi.dimensions.contentSpacing.y; - left: passwordField.left; + left: metaverseServerField.left; } onCheckedChanged: { Settings.setValue("keepMeLoggedIn", checked); diff --git a/interface/src/scripting/AccountServicesScriptingInterface.cpp b/interface/src/scripting/AccountServicesScriptingInterface.cpp index 34f33903e2..87aacad631 100644 --- a/interface/src/scripting/AccountServicesScriptingInterface.cpp +++ b/interface/src/scripting/AccountServicesScriptingInterface.cpp @@ -72,6 +72,11 @@ void AccountServicesScriptingInterface::logOut() { return accountManager->logout(); } +void AccountServicesScriptingInterface::updateAuthURLFromMetaverseServerURL() { + auto accountManager = DependencyManager::get(); + return accountManager->updateAuthURLFromMetaverseServerURL(); +} + void AccountServicesScriptingInterface::loggedOut() { emit AccountServicesScriptingInterface::disconnected(QString("logout")); } diff --git a/interface/src/scripting/AccountServicesScriptingInterface.h b/interface/src/scripting/AccountServicesScriptingInterface.h index 00c17db380..723622523c 100644 --- a/interface/src/scripting/AccountServicesScriptingInterface.h +++ b/interface/src/scripting/AccountServicesScriptingInterface.h @@ -192,6 +192,12 @@ public slots: * @function AccountServices.logOut */ void logOut(); + + /*@jsdoc + * Updates Metaverse Server URL in AccountManager. It's called by Login window after Metaverse Server URL is changed. + * @function AccountServices.updateAuthURLFromMetaverseServerURL + */ + void updateAuthURLFromMetaverseServerURL(); private slots: void loggedOut(); diff --git a/libraries/networking/src/AccountManager.cpp b/libraries/networking/src/AccountManager.cpp index 5805f5ed1a..ce449a66c3 100644 --- a/libraries/networking/src/AccountManager.cpp +++ b/libraries/networking/src/AccountManager.cpp @@ -205,6 +205,10 @@ void AccountManager::setAuthURL(const QUrl& authURL) { } } +void AccountManager::updateAuthURLFromMetaverseServerURL() { + setAuthURL(MetaverseAPI::getCurrentMetaverseServerURL()); +} + void AccountManager::setSessionID(const QUuid& sessionID) { if (_sessionID != sessionID) { qCDebug(networking) << "Metaverse session ID changed to" << uuidStringWithoutCurlyBraces(sessionID); diff --git a/libraries/networking/src/AccountManager.h b/libraries/networking/src/AccountManager.h index bd318e3af5..ad8a92a187 100644 --- a/libraries/networking/src/AccountManager.h +++ b/libraries/networking/src/AccountManager.h @@ -79,6 +79,7 @@ public: const QUrl& getAuthURL() const { return _authURL; } void setAuthURL(const QUrl& authURL); bool hasAuthEndpoint() { return !_authURL.isEmpty(); } + Q_INVOKABLE void updateAuthURLFromMetaverseServerURL(); bool isLoggedIn() { return !_authURL.isEmpty() && hasValidAccessToken(); } bool hasValidAccessToken();