From b7ccd5c923f67267bc3399b5f6d99bdb6572c602 Mon Sep 17 00:00:00 2001 From: Michael Zanetti Date: Fri, 21 Jan 2022 16:56:05 +0100 Subject: [PATCH] Add suppor for manual connections to remote proxy --- libnymea-app/jsonrpc/jsonrpcclient.cpp | 11 ++++--- libnymea-app/usermanager.cpp | 18 +++++++++++ libnymea-app/usermanager.h | 2 ++ nymea-app/configuredhostsmodel.cpp | 17 ---------- nymea-app/resources.qrc | 1 - nymea-app/ui/MainPage.qml | 1 - nymea-app/ui/RootItem.qml | 8 +---- .../ui/connection/NewConnectionWizard.qml | 31 ++++++++++++++++--- .../ui/system/ConnectionInterfacesPage.qml | 2 ++ nymea-app/ui/system/UsersSettingsPage.qml | 2 +- 10 files changed, 56 insertions(+), 37 deletions(-) diff --git a/libnymea-app/jsonrpc/jsonrpcclient.cpp b/libnymea-app/jsonrpc/jsonrpcclient.cpp index c9187391..0ba19841 100644 --- a/libnymea-app/jsonrpc/jsonrpcclient.cpp +++ b/libnymea-app/jsonrpc/jsonrpcclient.cpp @@ -445,6 +445,7 @@ void JsonRpcClient::processAuthenticate(int /*commandId*/, const QVariantMap &da } else { m_permissionScopes = UserInfo::PermissionScopeAdmin; } + emit permissionsChanged(); QSettings settings; settings.beginGroup("jsonTokens"); settings.setValue(m_serverUuid, m_token); @@ -720,6 +721,11 @@ void JsonRpcClient::helloReply(int /*commandId*/, const QVariantMap ¶ms) qCInfo(dcJsonRpc()) << "Handshake reply:" << "Protocol version:" << protoVersionString << "InitRequired:" << m_initialSetupRequired << "AuthRequired:" << m_authenticationRequired << "PushButtonAvailable:" << m_pushButtonAuthAvailable; + if (m_connection->currentHost()->uuid().isNull()) { + qCDebug(dcJsonRpc()) << "Updating Server UUID in connection:" << m_connection->currentHost()->uuid().toString() << "->" << m_serverUuid; + m_connection->currentHost()->setUuid(m_serverUuid); + } + QVersionNumber minimumRequiredVersion = QVersionNumber(5, 0); QVersionNumber maximumMajorVersion = QVersionNumber(6); if (m_jsonRpcVersion < minimumRequiredVersion) { @@ -795,11 +801,6 @@ void JsonRpcClient::helloReply(int /*commandId*/, const QVariantMap ¶ms) emit handshakeReceived(); - if (m_connection->currentHost()->uuid().isNull()) { - qCDebug(dcJsonRpc()) << "Updating Server UUID in connection:" << m_connection->currentHost()->uuid().toString() << "->" << m_serverUuid; - m_connection->currentHost()->setUuid(m_serverUuid); - } - if (m_initialSetupRequired) { qCInfo(dcJsonRpc()) << "Initial setup is required for this nymea instance!"; emit initialSetupRequiredChanged(); diff --git a/libnymea-app/usermanager.cpp b/libnymea-app/usermanager.cpp index 3689f660..15fa8390 100644 --- a/libnymea-app/usermanager.cpp +++ b/libnymea-app/usermanager.cpp @@ -279,6 +279,10 @@ QVariant Users::data(const QModelIndex &index, int role) const switch (role) { case RoleUsername: return m_users.at(index.row())->username(); + case RoleDisplayName: + return m_users.at(index.row())->displayName(); + case RoleEmail: + return m_users.at(index.row())->email(); case RoleScopes: return static_cast(m_users.at(index.row())->scopes()); } @@ -289,6 +293,8 @@ QHash Users::roleNames() const { QHash roles; roles.insert(RoleUsername, "username"); + roles.insert(RoleDisplayName, "displayName"); + roles.insert(RoleEmail, "email"); roles.insert(RoleScopes, "scopes"); return roles; } @@ -296,6 +302,18 @@ QHash Users::roleNames() const void Users::insertUser(UserInfo *userInfo) { userInfo->setParent(this); + connect(userInfo, &UserInfo::displayNameChanged, this, [=](){ + int idx = m_users.indexOf(userInfo); + if (idx >= 0) { + emit dataChanged(index(idx), index(idx), {RoleDisplayName}); + } + }); + connect(userInfo, &UserInfo::emailChanged, this, [=](){ + int idx = m_users.indexOf(userInfo); + if (idx >= 0) { + emit dataChanged(index(idx), index(idx), {RoleEmail}); + } + }); connect(userInfo, &UserInfo::scopesChanged, this, [=](){ int idx = m_users.indexOf(userInfo); if (idx >= 0) { diff --git a/libnymea-app/usermanager.h b/libnymea-app/usermanager.h index 3d380940..e84164ec 100644 --- a/libnymea-app/usermanager.h +++ b/libnymea-app/usermanager.h @@ -97,6 +97,8 @@ class Users: public QAbstractListModel { public: enum Roles { RoleUsername, + RoleDisplayName, + RoleEmail, RoleScopes }; Q_ENUM(Roles) diff --git a/nymea-app/configuredhostsmodel.cpp b/nymea-app/configuredhostsmodel.cpp index 0a97f0c4..04ed7ce6 100644 --- a/nymea-app/configuredhostsmodel.cpp +++ b/nymea-app/configuredhostsmodel.cpp @@ -21,23 +21,6 @@ ConfiguredHostsModel::ConfiguredHostsModel(QObject *parent) : QAbstractListModel m_currentIndex = settings.value("currentIndex", 0).toInt(); settings.endGroup(); - // If there aren't any in the config, try migrating settings from old tab model - if (m_list.isEmpty() && settings.contains("tabCount")) { - qCInfo(dcApplication()) << "Migrating tab settings to mainmenumodel"; - int tabCount = settings.value("tabCount", 0).toInt(); - qCDebug(dcApplication()) << "Tab count:" << tabCount; - - for (int i = 0; i < tabCount; i++) { - settings.beginGroup(QString("tabSettings%1").arg(i)); - QUuid uuid = settings.value("lastConnectedHost").toUuid(); - ConfiguredHost *host = new ConfiguredHost(uuid, this); - addHost(host); - settings.endGroup(); - } - - settings.remove("tabCount"); - } - // There must be always 1 at least if (m_list.isEmpty()) { createHost(); diff --git a/nymea-app/resources.qrc b/nymea-app/resources.qrc index 9efd9221..9f6268d9 100644 --- a/nymea-app/resources.qrc +++ b/nymea-app/resources.qrc @@ -12,7 +12,6 @@ ui/mainviews/FavoritesView.qml ui/mainviews/ThingsView.qml ui/connection/ConnectPage.qml - ui/connection/ManualConnectPage.qml ui/connection/ConnectingPage.qml ui/connection/wifisetup/BluetoothDiscoveryPage.qml ui/connection/wifisetup/WirelessSetupPage.qml diff --git a/nymea-app/ui/MainPage.qml b/nymea-app/ui/MainPage.qml index 66b0bda8..33ed2d8c 100644 --- a/nymea-app/ui/MainPage.qml +++ b/nymea-app/ui/MainPage.qml @@ -721,7 +721,6 @@ Page { text: qsTr("Disconnect") Layout.preferredWidth: Math.max(cancelButton.implicitWidth, disconnectButton.implicitWidth) onClicked: { - tabSettings.lastConnectedHost = ""; engine.jsonRpcClient.disconnectFromHost(); } } diff --git a/nymea-app/ui/RootItem.qml b/nymea-app/ui/RootItem.qml index 315aa3ae..22aca65d 100644 --- a/nymea-app/ui/RootItem.qml +++ b/nymea-app/ui/RootItem.qml @@ -173,7 +173,6 @@ Item { print("opening push button auth") var page = pageStack.push(Qt.resolvedUrl("PushButtonAuthPage.qml")) page.backPressed.connect(function() { -// tabSettings.lastConnectedHost = ""; engine.jsonRpcClient.disconnectFromHost(); init(); }) @@ -182,7 +181,6 @@ Item { if (engine.jsonRpcClient.initialSetupRequired) { var page = pageStack.push(Qt.resolvedUrl("connection/SetupWizard.qml")); page.backPressed.connect(function() { -// tabSettings.lastConnectedHost = ""; engine.jsonRpcClient.disconnectFromHost() init(); }) @@ -191,7 +189,6 @@ Item { var page = pageStack.push(Qt.resolvedUrl("connection/LoginPage.qml")); page.backPressed.connect(function() { -// tabSettings.lastConnectedHost = ""; engine.jsonRpcClient.disconnectFromHost() init(); }) @@ -314,7 +311,6 @@ Item { if (engine.jsonRpcClient.connected) { nymeaDiscovery.cacheHost(engine.jsonRpcClient.currentHost) configuredHost.uuid = engine.jsonRpcClient.serverUuid -// tabSettings.lastConnectedHost = engine.jsonRpcClient.serverUuid } init(); } @@ -333,14 +329,12 @@ Item { popup.actualVersion = actualVersion; popup.minVersion = minVersion; popup.open() -// tabSettings.lastConnectedHost = "" } onInvalidMaximumVersion: { var popup = invalidVersionComponent.createObject(app.contentItem); popup.actualVersion = actualVersion; popup.maxVersion = maxVersion; popup.open() -// tabSettings.lastConnectedHost = "" } } @@ -353,7 +347,7 @@ Item { } } Connections { - target: engien.nymeaConfiguration.tunnelProxyServerConfigurations + target: engine.nymeaConfiguration.tunnelProxyServerConfigurations onCountChanged: syncRemoteConnection(); } diff --git a/nymea-app/ui/connection/NewConnectionWizard.qml b/nymea-app/ui/connection/NewConnectionWizard.qml index 5d1e430e..b09514f9 100644 --- a/nymea-app/ui/connection/NewConnectionWizard.qml +++ b/nymea-app/ui/connection/NewConnectionWizard.qml @@ -308,6 +308,12 @@ WizardPageBase { } else { rpcUrl = "ws://" + hostAddress + ":" + port } + } else if (connectionTypeComboBox.currentIndex == 2) { + if (secureCheckBox.checked) { + rpcUrl = "tunnels://" + hostAddress + ":" + port + "?uuid=" + serverUuidTextInput.text + } else { + rpcUrl = "tunnel://" + hostAddress + ":" + port + "?uuid=" + serverUuidTextInput.text + } } print("Try to connect ", rpcUrl) @@ -331,28 +337,43 @@ WizardPageBase { ComboBox { id: connectionTypeComboBox Layout.fillWidth: true - model: [ qsTr("TCP"), qsTr("Websocket") ] + model: [ qsTr("TCP"), qsTr("Websocket"), qsTr("Remote proxy") ] } - Label { text: qsTr("Address:") } + Label { + text: connectionTypeComboBox.currentIndex < 2 ? qsTr("Address:") : qsTr("Proxy address:") + } TextField { id: addressTextInput objectName: "addressTextInput" Layout.fillWidth: true - placeholderText: "127.0.0.1" + placeholderText: connectionTypeComboBox.currentIndex < 2 ? "127.0.0.1" : "dev-remoteproxy.nymea.io" } + Label { + text: qsTr("%1 UUID:").arg(Configuration.systemName) + visible: connectionTypeComboBox.currentIndex == 2 + } + TextField { + id: serverUuidTextInput + Layout.fillWidth: true + visible: connectionTypeComboBox.currentIndex == 2 + } Label { text: qsTr("Port:") } TextField { id: portTextInput Layout.fillWidth: true - placeholderText: connectionTypeComboBox.currentIndex === 0 ? "2222" : "4444" + placeholderText: connectionTypeComboBox.currentIndex === 0 + ? "2222" + : connectionTypeComboBox.currentIndex == 1 + ? "4444" + : "2213" validator: IntValidator{bottom: 1; top: 65535;} } Label { Layout.fillWidth: true - text: qsTr("Encrypted connection:") + text: qsTr("SSL:") } CheckBox { id: secureCheckBox diff --git a/nymea-app/ui/system/ConnectionInterfacesPage.qml b/nymea-app/ui/system/ConnectionInterfacesPage.qml index db3c2c3f..82f324d7 100644 --- a/nymea-app/ui/system/ConnectionInterfacesPage.qml +++ b/nymea-app/ui/system/ConnectionInterfacesPage.qml @@ -138,6 +138,7 @@ SettingsPageBase { } SettingsPageSectionHeader { text: qsTr("Remote connection server interfaces") + visible: engine.jsonRpcClient.ensureServerVersion("6.0") } Repeater { @@ -171,6 +172,7 @@ SettingsPageBase { Layout.fillWidth: true Layout.margins: app.margins text: qsTr("Add") + visible: engine.jsonRpcClient.ensureServerVersion("6.0") onClicked: { var config = engine.nymeaConfiguration.createTunnelProxyServerConfiguration("dev-remoteproxy.nymea.io", 2213, true, true, false); var component = Qt.createComponent(Qt.resolvedUrl("TunnelProxyServerConfigurationDialog.qml")); diff --git a/nymea-app/ui/system/UsersSettingsPage.qml b/nymea-app/ui/system/UsersSettingsPage.qml index 6ac5404c..674b4dc8 100644 --- a/nymea-app/ui/system/UsersSettingsPage.qml +++ b/nymea-app/ui/system/UsersSettingsPage.qml @@ -278,7 +278,7 @@ SettingsPageBase { model: userManager.users delegate: NymeaItemDelegate { Layout.fillWidth: true - text: engine.jsonRpcClient.ensureServerVersion("6.0") && model.displayName ? model.displayName : model.username + text: engine.jsonRpcClient.ensureServerVersion("6.0") && model.displayName !== "" ? model.displayName : model.username subText: engine.jsonRpcClient.ensureServerVersion("6.0") && model.displayName ? model.username : "" iconName: "/ui/images/account.svg" iconColor: userManager.userInfo.scopes & UserInfo.PermissionScopeAdmin ? Style.accentColor : Style.iconColor