From 52ecd6899bac5941d7a96de7384f5a0ebddf4905 Mon Sep 17 00:00:00 2001 From: "vladimir.kuznetsov" Date: Fri, 24 Jan 2025 23:27:01 +0700 Subject: [PATCH 1/7] bugfix: fixed textFields on PageSetupWizardCredentials --- .../ui/qml/Components/InstalledAppsDrawer.qml | 2 +- .../qml/Controls2/TextFieldWithHeaderType.qml | 7 +- client/ui/qml/Pages2/PageDevMenu.qml | 10 +- .../Pages2/PageProtocolAwgClientSettings.qml | 38 +++---- .../ui/qml/Pages2/PageProtocolAwgSettings.qml | 70 ++++++------- .../qml/Pages2/PageProtocolCloakSettings.qml | 16 +-- .../Pages2/PageProtocolOpenVpnSettings.qml | 12 +-- .../PageProtocolShadowSocksSettings.qml | 6 +- .../PageProtocolWireGuardClientSettings.qml | 8 +- .../Pages2/PageProtocolWireGuardSettings.qml | 12 +-- .../qml/Pages2/PageProtocolXraySettings.qml | 10 +- .../Pages2/PageServiceSocksProxySettings.qml | 46 ++++----- .../Pages2/PageSettingsAppSplitTunneling.qml | 2 +- client/ui/qml/Pages2/PageSettingsDns.qml | 16 +-- .../ui/qml/Pages2/PageSettingsServerInfo.qml | 8 +- .../qml/Pages2/PageSettingsSplitTunneling.qml | 6 +- .../Pages2/PageSetupWizardConfigSource.qml | 4 +- .../qml/Pages2/PageSetupWizardCredentials.qml | 99 ++++++++----------- .../PageSetupWizardProtocolSettings.qml | 4 +- .../ui/qml/Pages2/PageSetupWizardTextKey.qml | 4 +- client/ui/qml/Pages2/PageShare.qml | 28 +++--- client/ui/qml/main2.qml | 6 +- 22 files changed, 196 insertions(+), 218 deletions(-) diff --git a/client/ui/qml/Components/InstalledAppsDrawer.qml b/client/ui/qml/Components/InstalledAppsDrawer.qml index 5835e1c6..ce8ef837 100644 --- a/client/ui/qml/Components/InstalledAppsDrawer.qml +++ b/client/ui/qml/Components/InstalledAppsDrawer.qml @@ -135,7 +135,7 @@ DrawerType2 { backgroundColor: AmneziaStyle.color.slateGray - textFieldPlaceholderText: qsTr("application name") + textField.placeholderText: qsTr("application name") } BasicButtonType { diff --git a/client/ui/qml/Controls2/TextFieldWithHeaderType.qml b/client/ui/qml/Controls2/TextFieldWithHeaderType.qml index fbea618b..c4ed91b3 100644 --- a/client/ui/qml/Controls2/TextFieldWithHeaderType.qml +++ b/client/ui/qml/Controls2/TextFieldWithHeaderType.qml @@ -22,11 +22,9 @@ Item { property var clickedFunc property alias textField: textField - property alias textFieldText: textField.text property string textFieldTextColor: AmneziaStyle.color.paleGray property string textFieldTextDisabledColor: AmneziaStyle.color.mutedGray - property string textFieldPlaceholderText property bool textFieldEditable: true property string borderColor: AmneziaStyle.color.slateGray @@ -101,7 +99,6 @@ Item { inputMethodHints: Qt.ImhNoAutoUppercase | Qt.ImhSensitiveData | Qt.ImhNoPredictiveText - placeholderText: root.textFieldPlaceholderText placeholderTextColor: AmneziaStyle.color.charcoalGray selectionColor: AmneziaStyle.color.richBrown @@ -129,8 +126,8 @@ Item { } onActiveFocusChanged: { - if (checkEmptyText && textFieldText === "") { - errorText = qsTr("The field can't be empty") + if (root.checkEmptyText && text === "") { + root.errorText = qsTr("The field can't be empty") } } diff --git a/client/ui/qml/Pages2/PageDevMenu.qml b/client/ui/qml/Pages2/PageDevMenu.qml index d93e5a38..d7afde1d 100644 --- a/client/ui/qml/Pages2/PageDevMenu.qml +++ b/client/ui/qml/Pages2/PageDevMenu.qml @@ -66,18 +66,18 @@ PageType { Layout.leftMargin: 16 headerText: qsTr("Gateway endpoint") - textFieldText: SettingsController.gatewayEndpoint + textField.text: SettingsController.gatewayEndpoint - buttonImageSource: textFieldText !== "" ? "qrc:/images/controls/refresh-cw.svg" : "" + buttonImageSource: textField.text !== "" ? "qrc:/images/controls/refresh-cw.svg" : "" clickedFunc: function() { SettingsController.resetGatewayEndpoint() } textField.onEditingFinished: { - textFieldText = textField.text.replace(/^\s+|\s+$/g, '') - if (textFieldText !== SettingsController.gatewayEndpoint) { - SettingsController.gatewayEndpoint = textFieldText + textField.text = textField.text.replace(/^\s+|\s+$/g, '') + if (textField.text !== SettingsController.gatewayEndpoint) { + SettingsController.gatewayEndpoint = textField.text } } } diff --git a/client/ui/qml/Pages2/PageProtocolAwgClientSettings.qml b/client/ui/qml/Pages2/PageProtocolAwgClientSettings.qml index d31f63e3..c22fdf0c 100644 --- a/client/ui/qml/Pages2/PageProtocolAwgClientSettings.qml +++ b/client/ui/qml/Pages2/PageProtocolAwgClientSettings.qml @@ -103,12 +103,12 @@ PageType { Layout.topMargin: 40 headerText: qsTr("MTU") - textFieldText: clientMtu + textField.text: clientMtu textField.validator: IntValidator { bottom: 576; top: 65535 } textField.onEditingFinished: { - if (textFieldText !== clientMtu) { - clientMtu = textFieldText + if (textField.text !== clientMtu) { + clientMtu = textField.text } } checkEmptyText: true @@ -121,12 +121,12 @@ PageType { Layout.topMargin: 16 headerText: "Jc - Junk packet count" - textFieldText: clientJunkPacketCount + textField.text: clientJunkPacketCount textField.validator: IntValidator { bottom: 0 } textField.onEditingFinished: { - if (textFieldText !== clientJunkPacketCount) { - clientJunkPacketCount = textFieldText + if (textField.text !== clientJunkPacketCount) { + clientJunkPacketCount = textField.text } } @@ -141,12 +141,12 @@ PageType { Layout.topMargin: 16 headerText: "Jmin - Junk packet minimum size" - textFieldText: clientJunkPacketMinSize + textField.text: clientJunkPacketMinSize textField.validator: IntValidator { bottom: 0 } textField.onEditingFinished: { - if (textFieldText !== clientJunkPacketMinSize) { - clientJunkPacketMinSize = textFieldText + if (textField.text !== clientJunkPacketMinSize) { + clientJunkPacketMinSize = textField.text } } @@ -161,12 +161,12 @@ PageType { Layout.topMargin: 16 headerText: "Jmax - Junk packet maximum size" - textFieldText: clientJunkPacketMaxSize + textField.text: clientJunkPacketMaxSize textField.validator: IntValidator { bottom: 0 } textField.onEditingFinished: { - if (textFieldText !== clientJunkPacketMaxSize) { - clientJunkPacketMaxSize = textFieldText + if (textField.text !== clientJunkPacketMaxSize) { + clientJunkPacketMaxSize = textField.text } } @@ -189,7 +189,7 @@ PageType { enabled: false headerText: qsTr("Port") - textFieldText: port + textField.text: port } TextFieldWithHeaderType { @@ -200,7 +200,7 @@ PageType { enabled: false headerText: "S1 - Init packet junk size" - textFieldText: serverInitPacketJunkSize + textField.text: serverInitPacketJunkSize } TextFieldWithHeaderType { @@ -211,7 +211,7 @@ PageType { enabled: false headerText: "S2 - Response packet junk size" - textFieldText: serverResponsePacketJunkSize + textField.text: serverResponsePacketJunkSize } TextFieldWithHeaderType { @@ -222,7 +222,7 @@ PageType { enabled: false headerText: "H1 - Init packet magic header" - textFieldText: serverInitPacketMagicHeader + textField.text: serverInitPacketMagicHeader } TextFieldWithHeaderType { @@ -233,7 +233,7 @@ PageType { enabled: false headerText: "H2 - Response packet magic header" - textFieldText: serverResponsePacketMagicHeader + textField.text: serverResponsePacketMagicHeader } TextFieldWithHeaderType { @@ -244,7 +244,7 @@ PageType { enabled: false headerText: "H3 - Underload packet magic header" - textFieldText: serverUnderloadPacketMagicHeader + textField.text: serverUnderloadPacketMagicHeader } TextFieldWithHeaderType { @@ -255,7 +255,7 @@ PageType { enabled: false headerText: "H4 - Transport packet magic header" - textFieldText: serverTransportPacketMagicHeader + textField.text: serverTransportPacketMagicHeader } } } diff --git a/client/ui/qml/Pages2/PageProtocolAwgSettings.qml b/client/ui/qml/Pages2/PageProtocolAwgSettings.qml index 3594cd9d..8c629b68 100644 --- a/client/ui/qml/Pages2/PageProtocolAwgSettings.qml +++ b/client/ui/qml/Pages2/PageProtocolAwgSettings.qml @@ -106,11 +106,11 @@ PageType { enabled: delegateItem.isEnabled headerText: qsTr("VPN address subnet") - textFieldText: subnetAddress + textField.text: subnetAddress textField.onEditingFinished: { - if (textFieldText !== subnetAddress) { - subnetAddress = textFieldText + if (textField.text !== subnetAddress) { + subnetAddress = textField.text } } @@ -125,13 +125,13 @@ PageType { enabled: delegateItem.isEnabled headerText: qsTr("Port") - textFieldText: port + textField.text: port textField.maximumLength: 5 textField.validator: IntValidator { bottom: 1; top: 65535 } textField.onEditingFinished: { - if (textFieldText !== port) { - port = textFieldText + if (textField.text !== port) { + port = textField.text } } @@ -144,16 +144,16 @@ PageType { Layout.topMargin: 16 headerText: qsTr("Jc - Junk packet count") - textFieldText: serverJunkPacketCount + textField.text: serverJunkPacketCount textField.validator: IntValidator { bottom: 0 } textField.onEditingFinished: { - if (textFieldText === "") { - textFieldText = "0" + if (textField.text === "") { + textField.text = "0" } - if (textFieldText !== serverJunkPacketCount) { - serverJunkPacketCount = textFieldText + if (textField.text !== serverJunkPacketCount) { + serverJunkPacketCount = textField.text } } @@ -166,12 +166,12 @@ PageType { Layout.topMargin: 16 headerText: qsTr("Jmin - Junk packet minimum size") - textFieldText: serverJunkPacketMinSize + textField.text: serverJunkPacketMinSize textField.validator: IntValidator { bottom: 0 } textField.onEditingFinished: { - if (textFieldText !== serverJunkPacketMinSize) { - serverJunkPacketMinSize = textFieldText + if (textField.text !== serverJunkPacketMinSize) { + serverJunkPacketMinSize = textField.text } } @@ -184,12 +184,12 @@ PageType { Layout.topMargin: 16 headerText: qsTr("Jmax - Junk packet maximum size") - textFieldText: serverJunkPacketMaxSize + textField.text: serverJunkPacketMaxSize textField.validator: IntValidator { bottom: 0 } textField.onEditingFinished: { - if (textFieldText !== serverJunkPacketMaxSize) { - serverJunkPacketMaxSize = textFieldText + if (textField.text !== serverJunkPacketMaxSize) { + serverJunkPacketMaxSize = textField.text } } @@ -202,12 +202,12 @@ PageType { Layout.topMargin: 16 headerText: qsTr("S1 - Init packet junk size") - textFieldText: serverInitPacketJunkSize + textField.text: serverInitPacketJunkSize textField.validator: IntValidator { bottom: 0 } textField.onEditingFinished: { - if (textFieldText !== serverInitPacketJunkSize) { - serverInitPacketJunkSize = textFieldText + if (textField.text !== serverInitPacketJunkSize) { + serverInitPacketJunkSize = textField.text } } @@ -226,12 +226,12 @@ PageType { Layout.topMargin: 16 headerText: qsTr("S2 - Response packet junk size") - textFieldText: serverResponsePacketJunkSize + textField.text: serverResponsePacketJunkSize textField.validator: IntValidator { bottom: 0 } textField.onEditingFinished: { - if (textFieldText !== serverResponsePacketJunkSize) { - serverResponsePacketJunkSize = textFieldText + if (textField.text !== serverResponsePacketJunkSize) { + serverResponsePacketJunkSize = textField.text } } @@ -250,12 +250,12 @@ PageType { Layout.topMargin: 16 headerText: qsTr("H1 - Init packet magic header") - textFieldText: serverInitPacketMagicHeader + textField.text: serverInitPacketMagicHeader textField.validator: IntValidator { bottom: 0 } textField.onEditingFinished: { - if (textFieldText !== serverInitPacketMagicHeader) { - serverInitPacketMagicHeader = textFieldText + if (textField.text !== serverInitPacketMagicHeader) { + serverInitPacketMagicHeader = textField.text } } @@ -268,12 +268,12 @@ PageType { Layout.topMargin: 16 headerText: qsTr("H2 - Response packet magic header") - textFieldText: serverResponsePacketMagicHeader + textField.text: serverResponsePacketMagicHeader textField.validator: IntValidator { bottom: 0 } textField.onEditingFinished: { - if (textFieldText !== serverResponsePacketMagicHeader) { - serverResponsePacketMagicHeader = textFieldText + if (textField.text !== serverResponsePacketMagicHeader) { + serverResponsePacketMagicHeader = textField.text } } @@ -286,12 +286,12 @@ PageType { Layout.topMargin: 16 headerText: qsTr("H4 - Transport packet magic header") - textFieldText: serverTransportPacketMagicHeader + textField.text: serverTransportPacketMagicHeader textField.validator: IntValidator { bottom: 0 } textField.onEditingFinished: { - if (textFieldText !== serverTransportPacketMagicHeader) { - serverTransportPacketMagicHeader = textFieldText + if (textField.text !== serverTransportPacketMagicHeader) { + serverTransportPacketMagicHeader = textField.text } } @@ -304,12 +304,12 @@ PageType { Layout.topMargin: 16 headerText: qsTr("H3 - Underload packet magic header") - textFieldText: serverUnderloadPacketMagicHeader + textField.text: serverUnderloadPacketMagicHeader textField.validator: IntValidator { bottom: 0 } textField.onEditingFinished: { - if (textFieldText !== serverUnderloadPacketMagicHeader) { - serverUnderloadPacketMagicHeader = textFieldText + if (textField.text !== serverUnderloadPacketMagicHeader) { + serverUnderloadPacketMagicHeader = textField.text } } diff --git a/client/ui/qml/Pages2/PageProtocolCloakSettings.qml b/client/ui/qml/Pages2/PageProtocolCloakSettings.qml index e90325ba..686ccd7b 100644 --- a/client/ui/qml/Pages2/PageProtocolCloakSettings.qml +++ b/client/ui/qml/Pages2/PageProtocolCloakSettings.qml @@ -89,18 +89,18 @@ PageType { Layout.topMargin: 32 headerText: qsTr("Disguised as traffic from") - textFieldText: site + textField.text: site textField.onEditingFinished: { - if (textFieldText !== site) { - var tmpText = textFieldText + if (textField.text !== site) { + var tmpText = textField.text tmpText = tmpText.toLocaleLowerCase() var indexHttps = tmpText.indexOf("https://") if (indexHttps === 0) { - tmpText = textFieldText.substring(8) + tmpText = textField.text.substring(8) } else { - site = textFieldText + site = textField.text } } } @@ -113,13 +113,13 @@ PageType { Layout.topMargin: 16 headerText: qsTr("Port") - textFieldText: port + textField.text: port textField.maximumLength: 5 textField.validator: IntValidator { bottom: 1; top: 65535 } textField.onEditingFinished: { - if (textFieldText !== port) { - port = textFieldText + if (textField.text !== port) { + port = textField.text } } } diff --git a/client/ui/qml/Pages2/PageProtocolOpenVpnSettings.qml b/client/ui/qml/Pages2/PageProtocolOpenVpnSettings.qml index 6c5ad23f..9cc628b7 100644 --- a/client/ui/qml/Pages2/PageProtocolOpenVpnSettings.qml +++ b/client/ui/qml/Pages2/PageProtocolOpenVpnSettings.qml @@ -88,13 +88,13 @@ PageType { Layout.topMargin: 32 headerText: qsTr("VPN address subnet") - textFieldText: subnetAddress + textField.text: subnetAddress parentFlickable: fl textField.onEditingFinished: { - if (textFieldText !== subnetAddress) { - subnetAddress = textFieldText + if (textField.text !== subnetAddress) { + subnetAddress = textField.text } } } @@ -137,13 +137,13 @@ PageType { enabled: isPortEditable headerText: qsTr("Port") - textFieldText: port + textField.text: port textField.maximumLength: 5 textField.validator: IntValidator { bottom: 1; top: 65535 } textField.onEditingFinished: { - if (textFieldText !== port) { - port = textFieldText + if (textField.text !== port) { + port = textField.text } } } diff --git a/client/ui/qml/Pages2/PageProtocolShadowSocksSettings.qml b/client/ui/qml/Pages2/PageProtocolShadowSocksSettings.qml index 44cbd1ce..5786012b 100644 --- a/client/ui/qml/Pages2/PageProtocolShadowSocksSettings.qml +++ b/client/ui/qml/Pages2/PageProtocolShadowSocksSettings.qml @@ -93,13 +93,13 @@ PageType { enabled: isPortEditable headerText: qsTr("Port") - textFieldText: port + textField.text: port textField.maximumLength: 5 textField.validator: IntValidator { bottom: 1; top: 65535 } textField.onEditingFinished: { - if (textFieldText !== port) { - port = textFieldText + if (textField.text !== port) { + port = textField.text } } } diff --git a/client/ui/qml/Pages2/PageProtocolWireGuardClientSettings.qml b/client/ui/qml/Pages2/PageProtocolWireGuardClientSettings.qml index 7413df38..a30c17e7 100644 --- a/client/ui/qml/Pages2/PageProtocolWireGuardClientSettings.qml +++ b/client/ui/qml/Pages2/PageProtocolWireGuardClientSettings.qml @@ -97,12 +97,12 @@ PageType { Layout.topMargin: 40 headerText: qsTr("MTU") - textFieldText: clientMtu + textField.text: clientMtu textField.validator: IntValidator { bottom: 576; top: 65535 } textField.onEditingFinished: { - if (textFieldText !== clientMtu) { - clientMtu = textFieldText + if (textField.text !== clientMtu) { + clientMtu = textField.text } } checkEmptyText: true @@ -124,7 +124,7 @@ PageType { enabled: false headerText: qsTr("Port") - textFieldText: port + textField.text: port } } } diff --git a/client/ui/qml/Pages2/PageProtocolWireGuardSettings.qml b/client/ui/qml/Pages2/PageProtocolWireGuardSettings.qml index f83d97fd..10523b74 100644 --- a/client/ui/qml/Pages2/PageProtocolWireGuardSettings.qml +++ b/client/ui/qml/Pages2/PageProtocolWireGuardSettings.qml @@ -90,11 +90,11 @@ PageType { enabled: delegateItem.isEnabled headerText: qsTr("VPN address subnet") - textFieldText: subnetAddress + textField.text: subnetAddress textField.onEditingFinished: { - if (textFieldText !== subnetAddress) { - subnetAddress = textFieldText + if (textField.text !== subnetAddress) { + subnetAddress = textField.text } } @@ -109,13 +109,13 @@ PageType { enabled: delegateItem.isEnabled headerText: qsTr("Port") - textFieldText: port + textField.text: port textField.maximumLength: 5 textField.validator: IntValidator { bottom: 1; top: 65535 } textField.onEditingFinished: { - if (textFieldText !== port) { - port = textFieldText + if (textField.text !== port) { + port = textField.text } } diff --git a/client/ui/qml/Pages2/PageProtocolXraySettings.qml b/client/ui/qml/Pages2/PageProtocolXraySettings.qml index 6d2ad3d1..90705d3e 100644 --- a/client/ui/qml/Pages2/PageProtocolXraySettings.qml +++ b/client/ui/qml/Pages2/PageProtocolXraySettings.qml @@ -86,18 +86,18 @@ PageType { Layout.topMargin: 32 headerText: qsTr("Disguised as traffic from") - textFieldText: site + textField.text: site textField.onEditingFinished: { - if (textFieldText !== site) { - var tmpText = textFieldText + if (textField.text !== site) { + var tmpText = textField.text tmpText = tmpText.toLocaleLowerCase() var indexHttps = tmpText.indexOf("https://") if (indexHttps === 0) { - tmpText = textFieldText.substring(8) + tmpText = textField.text.substring(8) } else { - site = textFieldText + site = textField.text } } } diff --git a/client/ui/qml/Pages2/PageServiceSocksProxySettings.qml b/client/ui/qml/Pages2/PageServiceSocksProxySettings.qml index 5eee9a1e..1b77267a 100644 --- a/client/ui/qml/Pages2/PageServiceSocksProxySettings.qml +++ b/client/ui/qml/Pages2/PageServiceSocksProxySettings.qml @@ -211,9 +211,9 @@ PageType { port = tempPort username = tempUsername password = tempPassword - portTextField.textFieldText = port - usernameTextField.textFieldText = username - passwordTextField.textFieldText = password + portTextField.textField.text = port + usernameTextField.textField.text = username + passwordTextField.textField.text = password } } @@ -231,14 +231,14 @@ PageType { parentFlickable: fl headerText: qsTr("Port") - textFieldText: port + textField.text: port textField.maximumLength: 5 textField.validator: IntValidator { bottom: 1; top: 65535 } textField.onEditingFinished: { - textFieldText = textField.text.replace(/^\s+|\s+$/g, '') - if (textFieldText !== port) { - port = textFieldText + textField.text = textField.text.replace(/^\s+|\s+$/g, '') + if (textField.text !== port) { + port = textField.text } } } @@ -251,14 +251,14 @@ PageType { parentFlickable: fl headerText: qsTr("Username") - textFieldPlaceholderText: "username" - textFieldText: username + textField.placeholderText: "username" + textField.text: username textField.maximumLength: 32 textField.onEditingFinished: { - textFieldText = textField.text.replace(/^\s+|\s+$/g, '') - if (textFieldText !== username) { - username = textFieldText + textField.text = textField.text.replace(/^\s+|\s+$/g, '') + if (textField.text !== username) { + username = textField.text } } } @@ -273,12 +273,12 @@ PageType { parentFlickable: fl headerText: qsTr("Password") - textFieldPlaceholderText: "password" - textFieldText: password + textField.placeholderText: "password" + textField.text: password textField.maximumLength: 32 textField.echoMode: hidePassword ? TextInput.Password : TextInput.Normal - buttonImageSource: textFieldText !== "" ? (hidePassword ? "qrc:/images/controls/eye.svg" : "qrc:/images/controls/eye-off.svg") + buttonImageSource: textField.text !== "" ? (hidePassword ? "qrc:/images/controls/eye.svg" : "qrc:/images/controls/eye-off.svg") : "" clickedFunc: function() { @@ -286,9 +286,9 @@ PageType { } textField.onFocusChanged: { - textFieldText = textField.text.replace(/^\s+|\s+$/g, '') - if (textFieldText !== password) { - password = textFieldText + textField.text = textField.text.replace(/^\s+|\s+$/g, '') + if (textField.text !== password) { + password = textField.text } } } @@ -309,19 +309,19 @@ PageType { portTextField.errorText = qsTr("The port must be in the range of 1 to 65535") return } - if (usernameTextField.textFieldText && passwordTextField.textFieldText === "") { + if (usernameTextField.textField.text && passwordTextField.textField.text === "") { passwordTextField.errorText = qsTr("Password cannot be empty") return - } else if (usernameTextField.textFieldText === "" && passwordTextField.textFieldText) { + } else if (usernameTextField.textField.text === "" && passwordTextField.textField.text) { usernameTextField.errorText = qsTr("Username cannot be empty") return } PageController.goToPage(PageEnum.PageSetupWizardInstalling) InstallController.updateContainer(Socks5ProxyConfigModel.getConfig()) - tempPort = portTextField.textFieldText - tempUsername = usernameTextField.textFieldText - tempPassword = passwordTextField.textFieldText + tempPort = portTextField.textField.text + tempUsername = usernameTextField.textField.text + tempPassword = passwordTextField.textField.text changeSettingsDrawer.closeTriggered() } } diff --git a/client/ui/qml/Pages2/PageSettingsAppSplitTunneling.qml b/client/ui/qml/Pages2/PageSettingsAppSplitTunneling.qml index a78ae446..b6920a8f 100644 --- a/client/ui/qml/Pages2/PageSettingsAppSplitTunneling.qml +++ b/client/ui/qml/Pages2/PageSettingsAppSplitTunneling.qml @@ -252,7 +252,7 @@ PageType { Layout.fillWidth: true - textFieldPlaceholderText: qsTr("application name") + textField.placeholderText: qsTr("application name") buttonImageSource: "qrc:/images/controls/plus.svg" rightButtonClickedOnEnter: true diff --git a/client/ui/qml/Pages2/PageSettingsDns.qml b/client/ui/qml/Pages2/PageSettingsDns.qml index 11e49cf9..d78c5aa8 100644 --- a/client/ui/qml/Pages2/PageSettingsDns.qml +++ b/client/ui/qml/Pages2/PageSettingsDns.qml @@ -67,7 +67,7 @@ PageType { Layout.fillWidth: true headerText: qsTr("Primary DNS") - textFieldText: SettingsController.primaryDns + textField.text: SettingsController.primaryDns textField.validator: RegularExpressionValidator { regularExpression: InstallController.ipAddressRegExp() } @@ -79,7 +79,7 @@ PageType { Layout.fillWidth: true headerText: qsTr("Secondary DNS") - textFieldText: SettingsController.secondaryDns + textField.text: SettingsController.secondaryDns textField.validator: RegularExpressionValidator { regularExpression: InstallController.ipAddressRegExp() } @@ -105,9 +105,9 @@ PageType { var yesButtonFunction = function() { SettingsController.primaryDns = "1.1.1.1" - primaryDns.textFieldText = SettingsController.primaryDns + primaryDns.textField.text = SettingsController.primaryDns SettingsController.secondaryDns = "1.0.0.1" - secondaryDns.textFieldText = SettingsController.secondaryDns + secondaryDns.textField.text = SettingsController.secondaryDns PageController.showNotificationMessage(qsTr("Settings have been reset")) } var noButtonFunction = function() { @@ -125,11 +125,11 @@ PageType { text: qsTr("Save") clickedFunc: function() { - if (primaryDns.textFieldText !== SettingsController.primaryDns) { - SettingsController.primaryDns = primaryDns.textFieldText + if (primaryDns.textField.text !== SettingsController.primaryDns) { + SettingsController.primaryDns = primaryDns.textField.text } - if (secondaryDns.textFieldText !== SettingsController.secondaryDns) { - SettingsController.secondaryDns = secondaryDns.textFieldText + if (secondaryDns.textField.text !== SettingsController.secondaryDns) { + SettingsController.secondaryDns = secondaryDns.textField.text } PageController.showNotificationMessage(qsTr("Settings saved")) } diff --git a/client/ui/qml/Pages2/PageSettingsServerInfo.qml b/client/ui/qml/Pages2/PageSettingsServerInfo.qml index 3172d31b..9abb6ae2 100644 --- a/client/ui/qml/Pages2/PageSettingsServerInfo.qml +++ b/client/ui/qml/Pages2/PageSettingsServerInfo.qml @@ -142,7 +142,7 @@ PageType { Layout.fillWidth: true headerText: qsTr("Server name") - textFieldText: root.processedServer.name + textField.text: root.processedServer.name textField.maximumLength: 30 checkEmptyText: true } @@ -155,12 +155,12 @@ PageType { text: qsTr("Save") clickedFunc: function() { - if (serverName.textFieldText === "") { + if (serverName.textField.text === "") { return } - if (serverName.textFieldText !== root.processedServer.name) { - ServersModel.setProcessedServerData("name", serverName.textFieldText); + if (serverName.textField.text !== root.processedServer.name) { + ServersModel.setProcessedServerData("name", serverName.textField.text); } serverNameEditDrawer.closeTriggered() } diff --git a/client/ui/qml/Pages2/PageSettingsSplitTunneling.qml b/client/ui/qml/Pages2/PageSettingsSplitTunneling.qml index 759ad9cd..9c355363 100644 --- a/client/ui/qml/Pages2/PageSettingsSplitTunneling.qml +++ b/client/ui/qml/Pages2/PageSettingsSplitTunneling.qml @@ -274,13 +274,13 @@ PageType { Layout.fillWidth: true rightButtonClickedOnEnter: true - textFieldPlaceholderText: qsTr("website or IP") + textField.placeholderText: qsTr("website or IP") buttonImageSource: "qrc:/images/controls/plus.svg" clickedFunc: function() { PageController.showBusyIndicator(true) - SitesController.addSite(textFieldText) - textFieldText = "" + SitesController.addSite(textField.text) + textField.text = "" PageController.showBusyIndicator(false) } } diff --git a/client/ui/qml/Pages2/PageSetupWizardConfigSource.qml b/client/ui/qml/Pages2/PageSetupWizardConfigSource.qml index 17d733d8..4ccfd247 100644 --- a/client/ui/qml/Pages2/PageSetupWizardConfigSource.qml +++ b/client/ui/qml/Pages2/PageSetupWizardConfigSource.qml @@ -163,12 +163,12 @@ PageType { Layout.rightMargin: 16 Layout.leftMargin: 16 - visible: textKey.textFieldText !== "" + visible: textKey.textField.text !== "" text: qsTr("Continue") clickedFunc: function() { - if (ImportController.extractConfigFromData(textKey.textFieldText)) { + if (ImportController.extractConfigFromData(textKey.textField.text)) { PageController.goToPage(PageEnum.PageSetupWizardViewConfig) } } diff --git a/client/ui/qml/Pages2/PageSetupWizardCredentials.qml b/client/ui/qml/Pages2/PageSetupWizardCredentials.qml index 20b85550..ca7e3a7c 100644 --- a/client/ui/qml/Pages2/PageSetupWizardCredentials.qml +++ b/client/ui/qml/Pages2/PageSetupWizardCredentials.qml @@ -82,24 +82,19 @@ PageType { reuseItems: true delegate: ColumnLayout { - property alias textField: _textField.textField - width: listView.width TextFieldWithHeaderType { - id: _textField + id: delegate Layout.fillWidth: true Layout.leftMargin: 16 Layout.rightMargin: 16 - property bool hidePassword: hideText - headerText: title - textField.echoMode: hideText ? TextInput.Password : TextInput.Normal - buttonImageSource: imageSource - textFieldPlaceholderText: placeholderText - textField.text: textFieldText + textField.echoMode: hideContent ? TextInput.Password : TextInput.Normal + textField.placeholderText: placeholderContent + textField.text: textField.text rightButtonClickedOnEnter: true @@ -108,17 +103,12 @@ PageType { } textField.onFocusChanged: { - var _currentIndex = listView.currentIndex - var _currentItem = listView.itemAtIndex(_currentIndex).children[0] - listView.model[_currentIndex].textFieldText = _currentItem.textFieldText.replace(/^\s+|\s+$/g, '') + textField.text = textField.text.replace(/^\s+|\s+$/g, '') } textField.onTextChanged: { - var _currentIndex = listView.currentIndex - textFieldText = textField.text - - if (_currentIndex === vars.secretDataIndex) { - buttonImageSource = textFieldText !== "" ? (hideText ? "qrc:/images/controls/eye.svg" : "qrc:/images/controls/eye-off.svg") : "" + if (hideContent) { + buttonImageSource = textField.text !== "" ? (hideContent ? "qrc:/images/controls/eye.svg" : "qrc:/images/controls/eye-off.svg") : "" } } } @@ -143,9 +133,9 @@ PageType { } InstallController.setShouldCreateServer(true) - var _hostname = listView.itemAtIndex(vars.hostnameIndex).children[0].textFieldText - var _username = listView.itemAtIndex(vars.usernameIndex).children[0].textFieldText - var _secretData = listView.itemAtIndex(vars.secretDataIndex).children[0].textFieldText + var _hostname = listView.itemAtIndex(vars.hostnameIndex).children[0].textField.text + var _username = listView.itemAtIndex(vars.usernameIndex).children[0].textField.text + var _secretData = listView.itemAtIndex(vars.secretDataIndex).children[0].textField.text InstallController.setProcessedServerCredentials(_hostname, _username, _secretData) @@ -194,23 +184,23 @@ PageType { function isCredentialsFilled() { var hasEmptyField = false - var _hostname = listView.itemAtIndex(vars.hostnameIndex).children[0] - if (_hostname.textFieldText === "") { - _hostname.errorText = qsTr("Ip address cannot be empty") + var hostnameItem = listView.itemAtIndex(vars.hostnameIndex).children[0] + if (hostnameItem.textField.text === "") { + hostnameItem.errorText = qsTr("Ip address cannot be empty") hasEmptyField = true - } else if (!_hostname.textField.acceptableInput) { - _hostname.errorText = qsTr("Enter the address in the format 255.255.255.255:88") + } else if (!hostnameItem.textField.acceptableInput) { + hostnameItem.errorText = qsTr("Enter the address in the format 255.255.255.255:88") } - var _username = listView.itemAtIndex(vars.usernameIndex).children[0] - if (_username.textFieldText === "") { - _username.errorText = qsTr("Login cannot be empty") + var usernameItem = listView.itemAtIndex(vars.usernameIndex).children[0] + if (usernameItem.textField.text === "") { + usernameItem.errorText = qsTr("Login cannot be empty") hasEmptyField = true } - var _secretData = listView.itemAtIndex(vars.secretDataIndex).children[0] - if (_secretData.textFieldText === "") { - _secretData.errorText = qsTr("Password/private key cannot be empty") + var secretDataItem = listView.itemAtIndex(vars.secretDataIndex).children[0] + if (secretDataItem.textField.text === "") { + secretDataItem.errorText = qsTr("Password/private key cannot be empty") hasEmptyField = true } @@ -218,46 +208,37 @@ PageType { } property list inputFields: [ - hostname, - username, - secretData + hostnameObject, + usernameObject, + secretDataObject ] QtObject { - id: hostname + id: hostnameObject property string title: qsTr("Server IP address [:port]") - readonly property string placeholderText: qsTr("255.255.255.255:22") - property string textFieldText: "" - property bool hideText: false - property string imageSource: "" - readonly property var clickedHandler: function() { - console.debug(">>> Server IP address text field was clicked!!!") - clicked() - } - } - - QtObject { - id: username - - property string title: qsTr("SSH Username") - readonly property string placeholderText: "root" - property string textFieldText: "" - property bool hideText: false - property string imageSource: "" + readonly property string placeholderContent: qsTr("255.255.255.255:22") + property bool hideContent: false readonly property var clickedHandler: undefined } QtObject { - id: secretData + id: usernameObject + + property string title: qsTr("SSH Username") + readonly property string placeholderContent: "root" + property bool hideContent: false + readonly property var clickedHandler: undefined + } + + QtObject { + id: secretDataObject property string title: qsTr("Password or SSH private key") - readonly property string placeholderText: "" - property string textFieldText: "" - property bool hideText: true - property string imageSource: textFieldText !== "" ? (hideText ? "qrc:/images/controls/eye.svg" : "qrc:/images/controls/eye-off.svg") : "" + readonly property string placeholderContent: "" + property bool hideContent: true readonly property var clickedHandler: function() { - hideText = !hideText + hideContent = !hideContent } } diff --git a/client/ui/qml/Pages2/PageSetupWizardProtocolSettings.qml b/client/ui/qml/Pages2/PageSetupWizardProtocolSettings.qml index 0de4da6b..50d1ea81 100644 --- a/client/ui/qml/Pages2/PageSetupWizardProtocolSettings.qml +++ b/client/ui/qml/Pages2/PageSetupWizardProtocolSettings.qml @@ -257,7 +257,7 @@ PageType { } PageController.goToPage(PageEnum.PageSetupWizardInstalling); - InstallController.install(dockerContainer, port.textFieldText, transportProtoSelector.currentIndex) + InstallController.install(dockerContainer, port.textField.text, transportProtoSelector.currentIndex) } } @@ -267,7 +267,7 @@ PageType { if (ProtocolProps.defaultPort(defaultContainerProto) < 0) { port.visible = false } else { - port.textFieldText = ProtocolProps.getPortForInstall(defaultContainerProto) + port.textField.text = ProtocolProps.getPortForInstall(defaultContainerProto) } transportProtoSelector.currentIndex = ProtocolProps.defaultTransportProto(defaultContainerProto) diff --git a/client/ui/qml/Pages2/PageSetupWizardTextKey.qml b/client/ui/qml/Pages2/PageSetupWizardTextKey.qml index 126a7c91..3cf154e4 100644 --- a/client/ui/qml/Pages2/PageSetupWizardTextKey.qml +++ b/client/ui/qml/Pages2/PageSetupWizardTextKey.qml @@ -51,7 +51,7 @@ PageType { Layout.leftMargin: 16 headerText: qsTr("Key") - textFieldPlaceholderText: "vpn://" + textField.placeholderText: "vpn://" buttonText: qsTr("Insert") clickedFunc: function() { @@ -75,7 +75,7 @@ PageType { text: qsTr("Continue") clickedFunc: function() { - if (ImportController.extractConfigFromData(textKey.textFieldText)) { + if (ImportController.extractConfigFromData(textKey.textField.text)) { PageController.goToPage(PageEnum.PageSetupWizardViewConfig) } } diff --git a/client/ui/qml/Pages2/PageShare.qml b/client/ui/qml/Pages2/PageShare.qml index add4dc61..27e851de 100644 --- a/client/ui/qml/Pages2/PageShare.qml +++ b/client/ui/qml/Pages2/PageShare.qml @@ -51,25 +51,25 @@ PageType { switch (type) { case PageShare.ConfigType.AmneziaConnection: { - ExportController.generateConnectionConfig(clientNameTextField.textFieldText); + ExportController.generateConnectionConfig(clientNameTextField.textField.text); break; } case PageShare.ConfigType.OpenVpn: { - ExportController.generateOpenVpnConfig(clientNameTextField.textFieldText) + ExportController.generateOpenVpnConfig(clientNameTextField.textField.text) shareConnectionDrawer.configCaption = qsTr("Save OpenVPN config") shareConnectionDrawer.configExtension = ".ovpn" shareConnectionDrawer.configFileName = "amnezia_for_openvpn" break } case PageShare.ConfigType.WireGuard: { - ExportController.generateWireGuardConfig(clientNameTextField.textFieldText) + ExportController.generateWireGuardConfig(clientNameTextField.textField.text) shareConnectionDrawer.configCaption = qsTr("Save WireGuard config") shareConnectionDrawer.configExtension = ".conf" shareConnectionDrawer.configFileName = "amnezia_for_wireguard" break } case PageShare.ConfigType.Awg: { - ExportController.generateAwgConfig(clientNameTextField.textFieldText) + ExportController.generateAwgConfig(clientNameTextField.textField.text) shareConnectionDrawer.configCaption = qsTr("Save AmneziaWG config") shareConnectionDrawer.configExtension = ".conf" shareConnectionDrawer.configFileName = "amnezia_for_awg" @@ -90,7 +90,7 @@ PageType { break } case PageShare.ConfigType.Xray: { - ExportController.generateXrayConfig(clientNameTextField.textFieldText) + ExportController.generateXrayConfig(clientNameTextField.textField.text) shareConnectionDrawer.configCaption = qsTr("Save XRay config") shareConnectionDrawer.configExtension = ".json" shareConnectionDrawer.configFileName = "amnezia_for_xray" @@ -296,7 +296,7 @@ PageType { visible: accessTypeSelector.currentIndex === 0 headerText: qsTr("User name") - textFieldText: "New client" + textField.text: "New client" textField.maximumLength: 20 checkEmptyText: true @@ -525,7 +525,7 @@ PageType { parentFlickable: a clickedFunc: function(){ - if (clientNameTextField.textFieldText !== "") { + if (clientNameTextField.textField.text !== "") { ExportController.generateConfig(root.connectionTypesModel[exportTypeSelector.currentIndex].type) } } @@ -555,14 +555,14 @@ PageType { id: searchTextField Layout.fillWidth: true - textFieldPlaceholderText: qsTr("Search") + textField.placeholderText: qsTr("Search") Keys.onEscapePressed: { root.isSearchBarVisible = false } function navigateTo() { - if (searchTextField.textFieldText === "") { + if (searchTextField.textField.text === "") { root.isSearchBarVisible = false } } @@ -601,7 +601,7 @@ PageType { sourceModel: ClientManagementModel filters: RegExpFilter { roleName: "clientName" - pattern: ".*" + searchTextField.textFieldText + ".*" + pattern: ".*" + searchTextField.textField.text + ".*" caseSensitivity: Qt.CaseInsensitive } } @@ -765,7 +765,7 @@ PageType { id: clientNameEditor Layout.fillWidth: true headerText: qsTr("Client name") - textFieldText: clientName + textField.text: clientName textField.maximumLength: 20 checkEmptyText: true } @@ -778,14 +778,14 @@ PageType { text: qsTr("Save") clickedFunc: function() { - if (clientNameEditor.textFieldText === "") { + if (clientNameEditor.textField.text === "") { return } - if (clientNameEditor.textFieldText !== clientName) { + if (clientNameEditor.textField.text !== clientName) { PageController.showBusyIndicator(true) ExportController.renameClient(index, - clientNameEditor.textFieldText, + clientNameEditor.textField.text, ContainersModel.getProcessedContainerIndex(), ServersModel.getProcessedServerCredentials()) PageController.showBusyIndicator(false) diff --git a/client/ui/qml/main2.qml b/client/ui/qml/main2.qml index 8b73e62d..7cd5790b 100644 --- a/client/ui/qml/main2.qml +++ b/client/ui/qml/main2.qml @@ -176,12 +176,12 @@ Window { Connections { target: privateKeyPassphraseDrawer function onOpened() { - passphrase.textFieldText = "" + passphrase.textField.text = "" passphrase.textField.forceActiveFocus() } function onAboutToHide() { - if (passphrase.textFieldText !== "") { + if (passphrase.textField.text !== "") { PageController.showBusyIndicator(true) } } @@ -222,7 +222,7 @@ Window { clickedFunc: function() { privateKeyPassphraseDrawer.closeTriggered() - PageController.passphraseRequestDrawerClosed(passphrase.textFieldText) + PageController.passphraseRequestDrawerClosed(passphrase.textField.text) } } } From 36045c6694a94b3001ae40ba9f15f19531a6dc61 Mon Sep 17 00:00:00 2001 From: "vladimir.kuznetsov" Date: Sun, 26 Jan 2025 14:13:30 +0700 Subject: [PATCH 2/7] bugfix: fixed scrolling by keys on PageSettingsApiServerInfo --- .../qml/Pages2/PageSettingsApiServerInfo.qml | 125 ++++++++++++------ 1 file changed, 83 insertions(+), 42 deletions(-) diff --git a/client/ui/qml/Pages2/PageSettingsApiServerInfo.qml b/client/ui/qml/Pages2/PageSettingsApiServerInfo.qml index 39207486..1fc17218 100644 --- a/client/ui/qml/Pages2/PageSettingsApiServerInfo.qml +++ b/client/ui/qml/Pages2/PageSettingsApiServerInfo.qml @@ -15,61 +15,100 @@ import "../Components" PageType { id: root - FlickableType { - id: fl - anchors.top: parent.top - anchors.bottom: parent.bottom - contentHeight: content.height + property list labelsModel: [ + regionObject, + priceObject, + endDateObject, + speedObject + ] - ColumnLayout { - id: content + QtObject { + id: regionObject - anchors.top: parent.top - anchors.left: parent.left - anchors.right: parent.right + readonly property string title: qsTr("For the region") + readonly property string contentKey: "region" + readonly property string objectImageSource: "qrc:/images/controls/map-pin.svg" + } + QtObject { + id: priceObject + + readonly property string title: qsTr("Price") + readonly property string contentKey: "price" + readonly property string objectImageSource: "qrc:/images/controls/tag.svg" + } + + QtObject { + id: endDateObject + + readonly property string title: qsTr("Valid until") + readonly property string contentKey: "endDate" + readonly property string objectImageSource: "qrc:/images/controls/history.svg" + } + + QtObject { + id: speedObject + + readonly property string title: qsTr("Speed") + readonly property string contentKey: "speed" + readonly property string objectImageSource: "qrc:/images/controls/gauge.svg" + } + + ListView { + id: listView + anchors.fill: parent + + property bool isFocusable: true + + Keys.onTabPressed: { + FocusController.nextKeyTabItem() + } + + Keys.onBacktabPressed: { + FocusController.previousKeyTabItem() + } + + Keys.onUpPressed: { + FocusController.nextKeyUpItem() + } + + Keys.onDownPressed: { + FocusController.nextKeyDownItem() + } + + Keys.onLeftPressed: { + FocusController.nextKeyLeftItem() + } + + Keys.onRightPressed: { + FocusController.nextKeyRightItem() + } + + ScrollBar.vertical: ScrollBarType {} + + model: labelsModel + clip: true + reuseItems: true + + delegate: ColumnLayout { + width: listView.width spacing: 0 LabelWithImageType { Layout.fillWidth: true Layout.margins: 16 - imageSource: "qrc:/images/controls/map-pin.svg" - leftText: qsTr("For the region") - rightText: ApiServicesModel.getSelectedServiceData("region") - } - - LabelWithImageType { - Layout.fillWidth: true - Layout.margins: 16 - - imageSource: "qrc:/images/controls/tag.svg" - leftText: qsTr("Price") - rightText: ApiServicesModel.getSelectedServiceData("price") - } - - LabelWithImageType { - property bool showSubscriptionEndDate: ServersModel.getProcessedServerData("isCountrySelectionAvailable") - - Layout.fillWidth: true - Layout.margins: 16 - - imageSource: "qrc:/images/controls/history.svg" - leftText: showSubscriptionEndDate ? qsTr("Valid until") : qsTr("Work period") - rightText: showSubscriptionEndDate ? ApiServicesModel.getSelectedServiceData("endDate") - : ApiServicesModel.getSelectedServiceData("workPeriod") + imageSource: objectImageSource + leftText: title + rightText: ApiServicesModel.getSelectedServiceData(contentKey) visible: rightText !== "" } + } - LabelWithImageType { - Layout.fillWidth: true - Layout.margins: 16 - - imageSource: "qrc:/images/controls/gauge.svg" - leftText: qsTr("Speed") - rightText: ApiServicesModel.getSelectedServiceData("speed") - } + footer: ColumnLayout { + width: listView.width + spacing: 0 ParagraphTextType { Layout.fillWidth: true @@ -88,6 +127,8 @@ PageType { return text.replace("%1", LanguageModel.getCurrentSiteUrl()) } + visible: text !== "" + MouseArea { anchors.fill: parent acceptedButtons: Qt.NoButton From e707471b04b16a7a08456fccde3f568373a545b1 Mon Sep 17 00:00:00 2001 From: "vladimir.kuznetsov" Date: Sun, 26 Jan 2025 14:56:27 +0700 Subject: [PATCH 3/7] chore: fixed log output with split tunneling info --- client/vpnconnection.cpp | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/client/vpnconnection.cpp b/client/vpnconnection.cpp index ac881bd7..eda93b6b 100644 --- a/client/vpnconnection.cpp +++ b/client/vpnconnection.cpp @@ -215,10 +215,15 @@ ErrorCode VpnConnection::lastError() const void VpnConnection::connectToVpn(int serverIndex, const ServerCredentials &credentials, DockerContainer container, const QJsonObject &vpnConfiguration) { - qDebug() << QString("ConnectToVpn, Server index is %1, container is %2, route mode is") + qDebug() << QString("Trying to connect to VPN, server index is %1, container is %2") .arg(serverIndex) - .arg(ContainerProps::containerToString(container)) - << m_settings->routeMode(); + .arg(ContainerProps::containerToString(container)); + qDebug() << QString("Site split tunneling is %1, route mode is %2") + .arg(m_settings->isSitesSplitTunnelingEnabled() ? "enabled" : "diabled") + .arg(m_settings->routeMode()); + qDebug() << QString("App split tunneling is %1, route mode is %2") + .arg(m_settings->isAppsSplitTunnelingEnabled() ? "enabled" : "diabled") + .arg(m_settings->getAppsRouteMode()); #if !defined(Q_OS_ANDROID) && !defined(Q_OS_IOS) if (!m_IpcClient) { m_IpcClient = new IpcClient(this); From 76640311abd34e072fc04c08ff39e778a2ff2f68 Mon Sep 17 00:00:00 2001 From: "vladimir.kuznetsov" Date: Sun, 26 Jan 2025 14:56:46 +0700 Subject: [PATCH 4/7] chore: hide "open logs folder" button for mobule platforms --- client/ui/qml/Pages2/PageSettingsLogging.qml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/client/ui/qml/Pages2/PageSettingsLogging.qml b/client/ui/qml/Pages2/PageSettingsLogging.qml index 7d85e2b3..2c760e37 100644 --- a/client/ui/qml/Pages2/PageSettingsLogging.qml +++ b/client/ui/qml/Pages2/PageSettingsLogging.qml @@ -137,6 +137,8 @@ PageType { Layout.topMargin: -8 Layout.bottomMargin: -8 + visible: !GC.isMobile() + text: qsTr("Open logs folder") leftImageSource: "qrc:/images/controls/folder-open.svg" isSmallLeftImage: true From 3011a0e3066fcc44da2d776b45b7903c832a5da2 Mon Sep 17 00:00:00 2001 From: "vladimir.kuznetsov" Date: Mon, 27 Jan 2025 11:59:56 +0700 Subject: [PATCH 5/7] chore: fixed again log output with split tunneling info --- client/protocols/xrayprotocol.cpp | 136 ++++++++++++++---------------- client/protocols/xrayprotocol.h | 10 ++- client/vpnconnection.cpp | 23 ++--- 3 files changed, 82 insertions(+), 87 deletions(-) diff --git a/client/protocols/xrayprotocol.cpp b/client/protocols/xrayprotocol.cpp index 7c69ccde..faad8e94 100755 --- a/client/protocols/xrayprotocol.cpp +++ b/client/protocols/xrayprotocol.cpp @@ -1,16 +1,14 @@ #include "xrayprotocol.h" -#include "utilities.h" -#include "core/networkUtilities.h" - #include #include #include #include +#include "core/networkUtilities.h" +#include "utilities.h" -XrayProtocol::XrayProtocol(const QJsonObject &configuration, QObject *parent): - VpnProtocol(configuration, parent) +XrayProtocol::XrayProtocol(const QJsonObject &configuration, QObject *parent) : VpnProtocol(configuration, parent) { readXrayConfiguration(configuration); m_routeGateway = NetworkUtilities::getGatewayAndIface(); @@ -45,10 +43,7 @@ ErrorCode XrayProtocol::start() QStringList args = QStringList() << "-c" << m_xrayCfgFile.fileName() << "-format=json"; - qDebug().noquote() << "XrayProtocol::start()" - << xrayExecPath() << args.join(" "); - - + qDebug().noquote() << "XrayProtocol::start()" << xrayExecPath() << args.join(" "); m_xrayProcess.setProcessChannelMode(QProcess::MergedChannels); m_xrayProcess.setProgram(xrayExecPath()); @@ -66,14 +61,15 @@ ErrorCode XrayProtocol::start() #endif }); - connect(&m_xrayProcess, QOverload::of(&QProcess::finished), this, [this](int exitCode, QProcess::ExitStatus exitStatus) { - qDebug().noquote() << "XrayProtocol finished, exitCode, exitStatus" << exitCode << exitStatus; - setConnectionState(Vpn::ConnectionState::Disconnected); - if ((exitStatus != QProcess::NormalExit) || (exitCode != 0)) { - emit protocolError(amnezia::ErrorCode::XrayExecutableCrashed); - emit setConnectionState(Vpn::ConnectionState::Error); - } - }); + connect(&m_xrayProcess, QOverload::of(&QProcess::finished), this, + [this](int exitCode, QProcess::ExitStatus exitStatus) { + qDebug().noquote() << "XrayProtocol finished, exitCode, exitStatus" << exitCode << exitStatus; + setConnectionState(Vpn::ConnectionState::Disconnected); + if ((exitStatus != QProcess::NormalExit) || (exitCode != 0)) { + emit protocolError(amnezia::ErrorCode::XrayExecutableCrashed); + emit setConnectionState(Vpn::ConnectionState::Error); + } + }); m_xrayProcess.start(); m_xrayProcess.waitForStarted(); @@ -82,11 +78,10 @@ ErrorCode XrayProtocol::start() setConnectionState(Vpn::ConnectionState::Connecting); QThread::msleep(1000); return startTun2Sock(); - } - else return ErrorCode::XrayExecutableMissing; + } else + return ErrorCode::XrayExecutableMissing; } - ErrorCode XrayProtocol::startTun2Sock() { m_t2sProcess->start(); @@ -98,71 +93,68 @@ ErrorCode XrayProtocol::startTun2Sock() connect(m_t2sProcess.data(), &IpcProcessTun2SocksReplica::stateChanged, this, [&](QProcess::ProcessState newState) { qDebug() << "PrivilegedProcess stateChanged" << newState; }); - connect(m_t2sProcess.data(), &IpcProcessTun2SocksReplica::setConnectionState, this, - [&](int vpnState) { - qDebug() << "PrivilegedProcess setConnectionState " << vpnState; - if (vpnState == Vpn::ConnectionState::Connected) - { - setConnectionState(Vpn::ConnectionState::Connecting); - QList dnsAddr; - dnsAddr.push_back(QHostAddress(m_configData.value(config_key::dns1).toString())); - dnsAddr.push_back(QHostAddress(m_configData.value(config_key::dns2).toString())); + connect(m_t2sProcess.data(), &IpcProcessTun2SocksReplica::setConnectionState, this, [&](int vpnState) { + qDebug() << "PrivilegedProcess setConnectionState " << vpnState; + if (vpnState == Vpn::ConnectionState::Connected) { + setConnectionState(Vpn::ConnectionState::Connecting); + QList dnsAddr; + dnsAddr.push_back(QHostAddress(m_configData.value(config_key::dns1).toString())); + dnsAddr.push_back(QHostAddress(m_configData.value(config_key::dns2).toString())); #ifdef Q_OS_WIN - QThread::msleep(8000); + QThread::msleep(8000); #endif #ifdef Q_OS_MACOS - QThread::msleep(5000); - IpcClient::Interface()->createTun("utun22", amnezia::protocols::xray::defaultLocalAddr); - IpcClient::Interface()->updateResolvers("utun22", dnsAddr); + QThread::msleep(5000); + IpcClient::Interface()->createTun("utun22", amnezia::protocols::xray::defaultLocalAddr); + IpcClient::Interface()->updateResolvers("utun22", dnsAddr); #endif #ifdef Q_OS_LINUX - QThread::msleep(1000); - IpcClient::Interface()->createTun("tun2", amnezia::protocols::xray::defaultLocalAddr); - IpcClient::Interface()->updateResolvers("tun2", dnsAddr); + QThread::msleep(1000); + IpcClient::Interface()->createTun("tun2", amnezia::protocols::xray::defaultLocalAddr); + IpcClient::Interface()->updateResolvers("tun2", dnsAddr); #endif #if defined(Q_OS_LINUX) || defined(Q_OS_MACOS) - // killSwitch toggle - if (QVariant(m_configData.value(config_key::killSwitchOption).toString()).toBool()) { - m_configData.insert("vpnServer", m_remoteAddress); - IpcClient::Interface()->enableKillSwitch(m_configData, 0); - } + // killSwitch toggle + if (QVariant(m_configData.value(config_key::killSwitchOption).toString()).toBool()) { + m_configData.insert("vpnServer", m_remoteAddress); + IpcClient::Interface()->enableKillSwitch(m_configData, 0); + } #endif - if (m_routeMode == 0) { - IpcClient::Interface()->routeAddList(m_vpnGateway, QStringList() << "0.0.0.0/1"); - IpcClient::Interface()->routeAddList(m_vpnGateway, QStringList() << "128.0.0.0/1"); - IpcClient::Interface()->routeAddList(m_routeGateway, QStringList() << m_remoteAddress); - } - IpcClient::Interface()->StopRoutingIpv6(); + if (m_routeMode == Settings::RouteMode::VpnAllSites) { + IpcClient::Interface()->routeAddList(m_vpnGateway, QStringList() << "0.0.0.0/1"); + IpcClient::Interface()->routeAddList(m_vpnGateway, QStringList() << "128.0.0.0/1"); + IpcClient::Interface()->routeAddList(m_routeGateway, QStringList() << m_remoteAddress); + } + IpcClient::Interface()->StopRoutingIpv6(); #ifdef Q_OS_WIN - IpcClient::Interface()->updateResolvers("tun2", dnsAddr); - QList netInterfaces = QNetworkInterface::allInterfaces(); - for (int i = 0; i < netInterfaces.size(); i++) { - for (int j = 0; j < netInterfaces.at(i).addressEntries().size(); j++) - { - // killSwitch toggle - if (m_vpnLocalAddress == netInterfaces.at(i).addressEntries().at(j).ip().toString()) { - if (QVariant(m_configData.value(config_key::killSwitchOption).toString()).toBool()) { - IpcClient::Interface()->enableKillSwitch(QJsonObject(), netInterfaces.at(i).index()); - } - m_configData.insert("vpnAdapterIndex", netInterfaces.at(i).index()); - m_configData.insert("vpnGateway", m_vpnGateway); - m_configData.insert("vpnServer", m_remoteAddress); - IpcClient::Interface()->enablePeerTraffic(m_configData); - } + IpcClient::Interface()->updateResolvers("tun2", dnsAddr); + QList netInterfaces = QNetworkInterface::allInterfaces(); + for (int i = 0; i < netInterfaces.size(); i++) { + for (int j = 0; j < netInterfaces.at(i).addressEntries().size(); j++) { + // killSwitch toggle + if (m_vpnLocalAddress == netInterfaces.at(i).addressEntries().at(j).ip().toString()) { + if (QVariant(m_configData.value(config_key::killSwitchOption).toString()).toBool()) { + IpcClient::Interface()->enableKillSwitch(QJsonObject(), netInterfaces.at(i).index()); } + m_configData.insert("vpnAdapterIndex", netInterfaces.at(i).index()); + m_configData.insert("vpnGateway", m_vpnGateway); + m_configData.insert("vpnServer", m_remoteAddress); + IpcClient::Interface()->enablePeerTraffic(m_configData); } -#endif - setConnectionState(Vpn::ConnectionState::Connected); } + } +#endif + setConnectionState(Vpn::ConnectionState::Connected); + } #if !defined(Q_OS_MACOS) - if (vpnState == Vpn::ConnectionState::Disconnected) { - setConnectionState(Vpn::ConnectionState::Disconnected); - IpcClient::Interface()->deleteTun("tun2"); - IpcClient::Interface()->StartRoutingIpv6(); - IpcClient::Interface()->clearSavedRoutes(); - } + if (vpnState == Vpn::ConnectionState::Disconnected) { + setConnectionState(Vpn::ConnectionState::Disconnected); + IpcClient::Interface()->deleteTun("tun2"); + IpcClient::Interface()->StartRoutingIpv6(); + IpcClient::Interface()->clearSavedRoutes(); + } #endif - }); + }); return ErrorCode::NoError; } @@ -204,7 +196,7 @@ void XrayProtocol::readXrayConfiguration(const QJsonObject &configuration) m_localPort = QString(amnezia::protocols::xray::defaultLocalProxyPort).toInt(); m_remoteHost = configuration.value(amnezia::config_key::hostName).toString(); m_remoteAddress = NetworkUtilities::getIPAddress(m_remoteHost); - m_routeMode = configuration.value(amnezia::config_key::splitTunnelType).toInt(); + m_routeMode = static_cast(configuration.value(amnezia::config_key::splitTunnelType).toInt()); m_primaryDNS = configuration.value(amnezia::config_key::dns1).toString(); m_secondaryDNS = configuration.value(amnezia::config_key::dns2).toString(); } diff --git a/client/protocols/xrayprotocol.h b/client/protocols/xrayprotocol.h index ee632333..c79ef608 100644 --- a/client/protocols/xrayprotocol.h +++ b/client/protocols/xrayprotocol.h @@ -1,14 +1,16 @@ #ifndef XRAYPROTOCOL_H #define XRAYPROTOCOL_H -#include "openvpnprotocol.h" #include "QProcess" + #include "containers/containers_defs.h" +#include "openvpnprotocol.h" +#include "settings.h" class XrayProtocol : public VpnProtocol { public: - XrayProtocol(const QJsonObject& configuration, QObject* parent = nullptr); + XrayProtocol(const QJsonObject &configuration, QObject *parent = nullptr); virtual ~XrayProtocol() override; ErrorCode start() override; @@ -24,11 +26,12 @@ protected: private: static QString xrayExecPath(); static QString tun2SocksExecPath(); + private: int m_localPort; QString m_remoteHost; QString m_remoteAddress; - int m_routeMode; + Settings::RouteMode m_routeMode; QJsonObject m_configData; QString m_primaryDNS; QString m_secondaryDNS; @@ -37,7 +40,6 @@ private: QSharedPointer m_t2sProcess; #endif QTemporaryFile m_xrayCfgFile; - }; #endif // XRAYPROTOCOL_H diff --git a/client/vpnconnection.cpp b/client/vpnconnection.cpp index eda93b6b..042c51c7 100644 --- a/client/vpnconnection.cpp +++ b/client/vpnconnection.cpp @@ -218,12 +218,6 @@ void VpnConnection::connectToVpn(int serverIndex, const ServerCredentials &crede qDebug() << QString("Trying to connect to VPN, server index is %1, container is %2") .arg(serverIndex) .arg(ContainerProps::containerToString(container)); - qDebug() << QString("Site split tunneling is %1, route mode is %2") - .arg(m_settings->isSitesSplitTunnelingEnabled() ? "enabled" : "diabled") - .arg(m_settings->routeMode()); - qDebug() << QString("App split tunneling is %1, route mode is %2") - .arg(m_settings->isAppsSplitTunnelingEnabled() ? "enabled" : "diabled") - .arg(m_settings->getAppsRouteMode()); #if !defined(Q_OS_ANDROID) && !defined(Q_OS_IOS) if (!m_IpcClient) { m_IpcClient = new IpcClient(this); @@ -346,26 +340,26 @@ void VpnConnection::appendSplitTunnelingConfig() } } - Settings::RouteMode routeMode = Settings::RouteMode::VpnAllSites; + Settings::RouteMode sitesRouteMode = Settings::RouteMode::VpnAllSites; QJsonArray sitesJsonArray; if (m_settings->isSitesSplitTunnelingEnabled()) { - routeMode = m_settings->routeMode(); + sitesRouteMode = m_settings->routeMode(); if (allowSiteBasedSplitTunneling) { - auto sites = m_settings->getVpnIps(routeMode); + auto sites = m_settings->getVpnIps(sitesRouteMode); for (const auto &site : sites) { sitesJsonArray.append(site); } // Allow traffic to Amnezia DNS - if (routeMode == Settings::VpnOnlyForwardSites) { + if (sitesRouteMode == Settings::VpnOnlyForwardSites) { sitesJsonArray.append(m_vpnConfiguration.value(config_key::dns1).toString()); sitesJsonArray.append(m_vpnConfiguration.value(config_key::dns2).toString()); } } } - m_vpnConfiguration.insert(config_key::splitTunnelType, routeMode); + m_vpnConfiguration.insert(config_key::splitTunnelType, sitesRouteMode); m_vpnConfiguration.insert(config_key::splitTunnelSites, sitesJsonArray); Settings::AppsRouteMode appsRouteMode = Settings::AppsRouteMode::VpnAllApps; @@ -381,6 +375,13 @@ void VpnConnection::appendSplitTunnelingConfig() m_vpnConfiguration.insert(config_key::appSplitTunnelType, appsRouteMode); m_vpnConfiguration.insert(config_key::splitTunnelApps, appsJsonArray); + + qDebug() << QString("Site split tunneling is %1, route mode is %2") + .arg(m_settings->isSitesSplitTunnelingEnabled() ? "enabled" : "disabled") + .arg(sitesRouteMode); + qDebug() << QString("App split tunneling is %1, route mode is %2") + .arg(m_settings->isAppsSplitTunnelingEnabled() ? "enabled" : "disabled") + .arg(appsRouteMode); } #ifdef Q_OS_ANDROID From f79bfa9d2ed6e639e7cac27e1ec8741a82625d65 Mon Sep 17 00:00:00 2001 From: "vladimir.kuznetsov" Date: Mon, 27 Jan 2025 12:14:50 +0700 Subject: [PATCH 6/7] chore: bump version --- CMakeLists.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 434b195f..98397bbb 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -2,7 +2,7 @@ cmake_minimum_required(VERSION 3.25.0 FATAL_ERROR) set(PROJECT AmneziaVPN) -project(${PROJECT} VERSION 4.8.3.1 +project(${PROJECT} VERSION 4.8.3.2 DESCRIPTION "AmneziaVPN" HOMEPAGE_URL "https://amnezia.org/" ) @@ -11,7 +11,7 @@ string(TIMESTAMP CURRENT_DATE "%Y-%m-%d") set(RELEASE_DATE "${CURRENT_DATE}") set(APP_MAJOR_VERSION ${CMAKE_PROJECT_VERSION_MAJOR}.${CMAKE_PROJECT_VERSION_MINOR}.${CMAKE_PROJECT_VERSION_PATCH}) -set(APP_ANDROID_VERSION_CODE 2074) +set(APP_ANDROID_VERSION_CODE 2075) if(${CMAKE_SYSTEM_NAME} STREQUAL "Linux") set(MZ_PLATFORM_NAME "linux") From a15ea0e8a17b4bb2b61b678ccbe32b3131dc8843 Mon Sep 17 00:00:00 2001 From: "vladimir.kuznetsov" Date: Tue, 28 Jan 2025 14:55:08 +0700 Subject: [PATCH 7/7] chore: returned the backup page for androidTV --- client/ui/qml/Pages2/PageSettings.qml | 5 +---- client/ui/qml/Pages2/PageSettingsSplitTunneling.qml | 5 +---- 2 files changed, 2 insertions(+), 8 deletions(-) diff --git a/client/ui/qml/Pages2/PageSettings.qml b/client/ui/qml/Pages2/PageSettings.qml index c44e52ae..a47bb535 100644 --- a/client/ui/qml/Pages2/PageSettings.qml +++ b/client/ui/qml/Pages2/PageSettings.qml @@ -87,7 +87,6 @@ PageType { LabelWithButtonType { id: backup - visible: !SettingsController.isOnTv() Layout.fillWidth: true text: qsTr("Backup") @@ -99,9 +98,7 @@ PageType { } } - DividerType { - visible: !SettingsController.isOnTv() - } + DividerType {} LabelWithButtonType { id: about diff --git a/client/ui/qml/Pages2/PageSettingsSplitTunneling.qml b/client/ui/qml/Pages2/PageSettingsSplitTunneling.qml index 9c355363..f5978687 100644 --- a/client/ui/qml/Pages2/PageSettingsSplitTunneling.qml +++ b/client/ui/qml/Pages2/PageSettingsSplitTunneling.qml @@ -338,7 +338,6 @@ PageType { LabelWithButtonType { id: exportSitesButton - enabled: !SettingsController.isOnTv() Layout.fillWidth: true text: qsTr("Save site list") @@ -362,9 +361,7 @@ PageType { } } - DividerType { - enabled: !SettingsController.isOnTv() - } + DividerType {} } }