2023-09-22 00:37:55 +05:00
import QtQuick
import QtQuick . Controls
import QtQuick . Layouts
2024-12-31 04:16:52 +01:00
import QtCore
2023-09-22 00:37:55 +05:00
import SortFilterProxyModel 0.2
2023-10-06 16:43:52 +05:00
import PageEnum 1.0
2026-04-30 14:53:03 +08:00
import ProtocolEnum 1.0
2024-08-20 16:54:05 +07:00
import Style 1.0
2023-10-06 16:43:52 +05:00
2023-09-22 00:37:55 +05:00
import "./"
import "../Controls2"
import "../Controls2/TextTypes"
import "../Config"
import "../Components"
2024-02-17 23:09:05 +02:00
2023-09-22 00:37:55 +05:00
PageType {
id: root
2025-08-06 04:35:51 +02:00
BackButtonType {
id: backButton
2023-09-22 00:37:55 +05:00
anchors.top: parent . top
anchors.left: parent . left
anchors.right: parent . right
2026-04-30 14:53:03 +08:00
anchors.topMargin: 20 + PageController . safeAreaTopMargin
2023-09-22 00:37:55 +05:00
2025-08-06 04:35:51 +02:00
onActiveFocusChanged: {
if ( backButton . enabled && backButton . activeFocus ) {
listView . positionViewAtBeginning ( )
}
2023-09-22 00:37:55 +05:00
}
}
2025-11-12 10:57:53 +03:00
SmartScroll {
id: smartScroll
listView: listView
}
2025-08-06 04:35:51 +02:00
ListViewType {
id: listView
2025-01-08 09:12:55 +03:00
2025-08-11 13:40:28 +08:00
anchors.top: backButton . bottom
2023-09-22 00:37:55 +05:00
anchors.bottom: parent . bottom
2025-08-06 04:35:51 +02:00
anchors.left: parent . left
anchors.right: parent . right
2023-09-22 00:37:55 +05:00
2025-08-06 04:35:51 +02:00
model: AwgConfigModel
2024-12-31 04:16:52 +01:00
2025-08-06 04:35:51 +02:00
delegate: ColumnLayout {
id: delegateItem
2023-09-22 00:37:55 +05:00
2025-08-06 04:35:51 +02:00
width: listView . width
2023-09-22 00:37:55 +05:00
2025-08-06 04:35:51 +02:00
property alias vpnAddressSubnetTextField: vpnAddressSubnetTextField
2026-04-30 14:53:03 +08:00
property bool isEnabled: ServersUiController . isProcessedServerHasWriteAccess ( )
2023-09-22 00:37:55 +05:00
2025-08-06 04:35:51 +02:00
spacing: 0
2023-09-22 00:37:55 +05:00
2025-08-06 04:35:51 +02:00
BaseHeaderType {
Layout.fillWidth: true
Layout.leftMargin: 16
Layout.rightMargin: 16
2023-09-22 00:37:55 +05:00
2025-08-06 04:35:51 +02:00
headerText: qsTr ( "AmneziaWG settings" )
}
2023-09-22 00:37:55 +05:00
2025-08-06 04:35:51 +02:00
TextFieldWithHeaderType {
id: vpnAddressSubnetTextField
2023-09-22 00:37:55 +05:00
2025-08-06 04:35:51 +02:00
Layout.fillWidth: true
Layout.topMargin: 40
Layout.leftMargin: 16
Layout.rightMargin: 16
2024-02-17 23:09:05 +02:00
2025-08-06 04:35:51 +02:00
enabled: delegateItem . isEnabled
2023-09-22 00:37:55 +05:00
2025-08-06 04:35:51 +02:00
headerText: qsTr ( "VPN address subnet" )
textField.text: subnetAddress
2023-09-22 00:37:55 +05:00
2025-08-06 04:35:51 +02:00
textField.onEditingFinished: {
if ( textField . text !== subnetAddress ) {
subnetAddress = textField . text
}
}
2023-09-22 00:37:55 +05:00
2025-11-12 10:57:53 +03:00
textField.onActiveFocusChanged: {
if ( textField . activeFocus ) {
smartScroll . scrollToItem ( vpnAddressSubnetTextField )
}
}
2025-08-06 04:35:51 +02:00
checkEmptyText: true
}
2023-09-22 00:37:55 +05:00
2025-08-06 04:35:51 +02:00
TextFieldWithHeaderType {
id: portTextField
Layout.fillWidth: true
Layout.topMargin: 16
Layout.leftMargin: 16
Layout.rightMargin: 16
2023-09-22 00:37:55 +05:00
2025-08-06 04:35:51 +02:00
enabled: delegateItem . isEnabled
2023-09-22 00:37:55 +05:00
2025-08-06 04:35:51 +02:00
headerText: qsTr ( "Port" )
textField.text: port
textField.maximumLength: 5
textField.validator: IntValidator { bottom: 1 ; top: 65535 }
2023-09-22 00:37:55 +05:00
2025-08-06 04:35:51 +02:00
textField.onEditingFinished: {
if ( textField . text !== port ) {
port = textField . text
}
2024-12-31 04:16:52 +01:00
}
2024-09-13 12:38:48 +04:00
2025-11-12 10:57:53 +03:00
textField.onActiveFocusChanged: {
if ( textField . activeFocus ) {
smartScroll . scrollToItem ( portTextField )
}
}
2025-08-06 04:35:51 +02:00
checkEmptyText: true
}
2025-01-02 08:07:12 +01:00
2025-08-06 04:35:51 +02:00
AwgTextField {
id: junkPacketCountTextField
2023-09-22 00:37:55 +05:00
2025-08-06 04:35:51 +02:00
Layout.leftMargin: 16
Layout.rightMargin: 16
2023-10-06 16:43:52 +05:00
2025-08-06 04:35:51 +02:00
headerText: qsTr ( "Jc - Junk packet count" )
textField.text: serverJunkPacketCount
2025-01-02 08:07:12 +01:00
2025-08-06 04:35:51 +02:00
textField.onEditingFinished: {
if ( textField . text !== serverJunkPacketCount ) {
serverJunkPacketCount = textField . text
2025-01-02 08:07:12 +01:00
}
}
2025-11-12 10:57:53 +03:00
textField.onActiveFocusChanged: {
if ( textField . activeFocus ) {
smartScroll . scrollToItem ( junkPacketCountTextField )
}
}
2025-08-06 04:35:51 +02:00
}
2025-01-02 08:07:12 +01:00
2025-08-06 04:35:51 +02:00
AwgTextField {
id: junkPacketMinSizeTextField
2025-01-02 08:07:12 +01:00
2025-08-06 04:35:51 +02:00
Layout.leftMargin: 16
Layout.rightMargin: 16
2025-01-02 08:07:12 +01:00
2025-08-06 04:35:51 +02:00
headerText: qsTr ( "Jmin - Junk packet minimum size" )
textField.text: serverJunkPacketMinSize
2024-02-17 23:09:05 +02:00
2025-08-06 04:35:51 +02:00
textField.onEditingFinished: {
if ( textField . text !== serverJunkPacketMinSize ) {
serverJunkPacketMinSize = textField . text
2024-12-31 04:16:52 +01:00
}
}
2025-11-12 10:57:53 +03:00
textField.onActiveFocusChanged: {
if ( textField . activeFocus ) {
smartScroll . scrollToItem ( junkPacketMinSizeTextField )
}
}
2025-08-06 04:35:51 +02:00
}
2023-09-22 00:37:55 +05:00
2025-08-06 04:35:51 +02:00
AwgTextField {
id: junkPacketMaxSizeTextField
2024-12-31 04:16:52 +01:00
2025-08-06 04:35:51 +02:00
Layout.leftMargin: 16
Layout.rightMargin: 16
2023-09-22 00:37:55 +05:00
2025-08-06 04:35:51 +02:00
headerText: qsTr ( "Jmax - Junk packet maximum size" )
textField.text: serverJunkPacketMaxSize
2024-02-17 23:09:05 +02:00
2025-08-06 04:35:51 +02:00
textField.onEditingFinished: {
if ( textField . text !== serverJunkPacketMaxSize ) {
serverJunkPacketMaxSize = textField . text
2024-12-31 04:16:52 +01:00
}
}
2025-11-12 10:57:53 +03:00
textField.onActiveFocusChanged: {
if ( textField . activeFocus ) {
smartScroll . scrollToItem ( junkPacketMaxSizeTextField )
}
}
2025-08-06 04:35:51 +02:00
}
2023-09-22 00:37:55 +05:00
2025-08-06 04:35:51 +02:00
AwgTextField {
id: initPacketJunkSizeTextField
2024-02-17 23:09:05 +02:00
2025-08-06 04:35:51 +02:00
Layout.leftMargin: 16
Layout.rightMargin: 16
headerText: qsTr ( "S1 - Init packet junk size" )
textField.text: serverInitPacketJunkSize
textField.onEditingFinished: {
if ( textField . text !== serverInitPacketJunkSize ) {
serverInitPacketJunkSize = textField . text
2024-12-31 04:16:52 +01:00
}
}
2025-11-12 10:57:53 +03:00
textField.onActiveFocusChanged: {
if ( textField . activeFocus ) {
smartScroll . scrollToItem ( initPacketJunkSizeTextField )
}
}
2025-08-06 04:35:51 +02:00
}
2023-09-22 00:37:55 +05:00
2025-08-06 04:35:51 +02:00
AwgTextField {
id: responsePacketJunkSizeTextField
2024-02-17 23:09:05 +02:00
2025-08-06 04:35:51 +02:00
Layout.leftMargin: 16
Layout.rightMargin: 16
headerText: qsTr ( "S2 - Response packet junk size" )
textField.text: serverResponsePacketJunkSize
textField.onEditingFinished: {
if ( textField . text !== serverResponsePacketJunkSize ) {
serverResponsePacketJunkSize = textField . text
2024-12-31 04:16:52 +01:00
}
}
2025-11-12 10:57:53 +03:00
textField.onActiveFocusChanged: {
if ( textField . activeFocus ) {
smartScroll . scrollToItem ( responsePacketJunkSizeTextField )
}
}
2025-08-06 04:35:51 +02:00
}
2023-09-22 00:37:55 +05:00
2025-12-11 15:18:36 +08:00
AwgTextField {
id: cookieReplyPacketJunkSizeTextField
Layout.leftMargin: 16
Layout.rightMargin: 16
2024-02-17 23:09:05 +02:00
2025-12-11 15:18:36 +08:00
visible: isAwg2
headerText: qsTr ( "S3 - Cookie reply packet junk size" )
textField.text: serverCookieReplyPacketJunkSize
textField.onEditingFinished: {
if ( textField . text !== serverCookieReplyPacketJunkSize ) {
serverCookieReplyPacketJunkSize = textField . text
}
}
textField.onActiveFocusChanged: {
if ( textField . activeFocus ) {
smartScroll . scrollToItem ( cookieReplyPacketJunkSizeTextField )
}
}
}
2025-08-06 04:35:51 +02:00
2025-12-11 15:18:36 +08:00
AwgTextField {
id: transportPacketJunkSizeTextField
2025-08-06 04:35:51 +02:00
2025-12-11 15:18:36 +08:00
Layout.leftMargin: 16
Layout.rightMargin: 16
2025-08-06 04:35:51 +02:00
2025-12-11 15:18:36 +08:00
visible: isAwg2
2025-08-06 04:35:51 +02:00
2025-12-11 15:18:36 +08:00
headerText: qsTr ( "S4 - Transport packet junk size" )
textField.text: serverTransportPacketJunkSize
2025-08-06 04:35:51 +02:00
2025-12-11 15:18:36 +08:00
textField.onEditingFinished: {
if ( textField . text !== serverTransportPacketJunkSize ) {
serverTransportPacketJunkSize = textField . text
}
}
2025-08-06 04:35:51 +02:00
2025-12-11 15:18:36 +08:00
textField.onActiveFocusChanged: {
if ( textField . activeFocus ) {
smartScroll . scrollToItem ( transportPacketJunkSizeTextField )
}
}
}
2025-08-06 04:35:51 +02:00
AwgTextField {
id: initPacketMagicHeaderTextField
Layout.leftMargin: 16
Layout.rightMargin: 16
headerText: qsTr ( "H1 - Init packet magic header" )
textField.text: serverInitPacketMagicHeader
2025-12-11 15:18:36 +08:00
textField.validator: RegularExpressionValidator {
regularExpression: /^(\d+)(-\d+)?$/
}
2025-08-06 04:35:51 +02:00
textField.onEditingFinished: {
if ( textField . text !== serverInitPacketMagicHeader ) {
serverInitPacketMagicHeader = textField . text
2024-12-31 04:16:52 +01:00
}
}
2025-11-12 10:57:53 +03:00
textField.onActiveFocusChanged: {
if ( textField . activeFocus ) {
smartScroll . scrollToItem ( initPacketMagicHeaderTextField )
}
}
2025-08-06 04:35:51 +02:00
}
2023-09-22 00:37:55 +05:00
2025-08-06 04:35:51 +02:00
AwgTextField {
id: responsePacketMagicHeaderTextField
Layout.leftMargin: 16
Layout.rightMargin: 16
headerText: qsTr ( "H2 - Response packet magic header" )
textField.text: serverResponsePacketMagicHeader
2025-12-11 15:18:36 +08:00
textField.validator: RegularExpressionValidator {
regularExpression: /^(\d+)(-\d+)?$/
}
2025-08-06 04:35:51 +02:00
textField.onEditingFinished: {
if ( textField . text !== serverResponsePacketMagicHeader ) {
serverResponsePacketMagicHeader = textField . text
2024-12-31 04:16:52 +01:00
}
}
2025-11-12 10:57:53 +03:00
textField.onActiveFocusChanged: {
if ( textField . activeFocus ) {
smartScroll . scrollToItem ( responsePacketMagicHeaderTextField )
}
}
2025-08-06 04:35:51 +02:00
}
2023-09-22 00:37:55 +05:00
2025-08-06 04:35:51 +02:00
AwgTextField {
id: underloadPacketMagicHeaderTextField
2023-10-06 16:43:52 +05:00
2025-08-06 04:35:51 +02:00
Layout.leftMargin: 16
Layout.rightMargin: 16
headerText: qsTr ( "H3 - Underload packet magic header" )
textField.text: serverUnderloadPacketMagicHeader
2025-12-11 15:18:36 +08:00
textField.validator: RegularExpressionValidator {
regularExpression: /^(\d+)(-\d+)?$/
}
2025-08-06 04:35:51 +02:00
textField.onEditingFinished: {
if ( textField . text !== serverUnderloadPacketMagicHeader ) {
serverUnderloadPacketMagicHeader = textField . text
2024-12-31 04:16:52 +01:00
}
2025-07-07 12:03:25 +08:00
}
2025-11-12 10:57:53 +03:00
textField.onActiveFocusChanged: {
if ( textField . activeFocus ) {
smartScroll . scrollToItem ( underloadPacketMagicHeaderTextField )
}
}
2025-08-06 04:35:51 +02:00
}
2024-02-17 23:09:05 +02:00
2025-08-06 04:35:51 +02:00
AwgTextField {
id: transportPacketMagicHeaderTextField
2025-07-07 12:03:25 +08:00
2025-08-06 04:35:51 +02:00
Layout.leftMargin: 16
Layout.rightMargin: 16
headerText: qsTr ( "H4 - Transport packet magic header" )
textField.text: serverTransportPacketMagicHeader
2025-12-11 15:18:36 +08:00
textField.validator: RegularExpressionValidator {
regularExpression: /^(\d+)(-\d+)?$/
}
2025-08-06 04:35:51 +02:00
textField.onEditingFinished: {
if ( textField . text !== serverTransportPacketMagicHeader ) {
serverTransportPacketMagicHeader = textField . text
2025-07-07 12:03:25 +08:00
}
2024-12-31 04:16:52 +01:00
}
2025-11-12 10:57:53 +03:00
textField.onActiveFocusChanged: {
if ( textField . activeFocus ) {
smartScroll . scrollToItem ( transportPacketMagicHeaderTextField )
}
}
2025-08-06 04:35:51 +02:00
}
2024-12-31 04:16:52 +01:00
2025-12-18 22:25:20 +08:00
AwgTextField {
id: specialJunk1TextField
Layout.leftMargin: 16
Layout.rightMargin: 16
headerText: qsTr ( "I1 - Special junk 1" )
textField.text: serverSpecialJunk1
2025-12-26 22:55:57 +08:00
checkEmptyText: false
2025-12-18 22:25:20 +08:00
textField.onEditingFinished: {
if ( textField . text !== serverSpecialJunk1 ) {
serverSpecialJunk1 = textField . text
}
}
textField.onActiveFocusChanged: {
if ( textField . activeFocus ) {
smartScroll . scrollToItem ( specialJunk1TextField )
}
}
}
AwgTextField {
id: specialJunk2TextField
Layout.leftMargin: 16
Layout.rightMargin: 16
headerText: qsTr ( "I2 - Special junk 2" )
textField.text: serverSpecialJunk2
2025-12-26 22:55:57 +08:00
checkEmptyText: false
2025-12-18 22:25:20 +08:00
textField.onEditingFinished: {
if ( textField . text !== serverSpecialJunk2 ) {
serverSpecialJunk2 = textField . text
}
}
textField.onActiveFocusChanged: {
if ( textField . activeFocus ) {
smartScroll . scrollToItem ( specialJunk2TextField )
}
}
}
AwgTextField {
id: specialJunk3TextField
Layout.leftMargin: 16
Layout.rightMargin: 16
headerText: qsTr ( "I3 - Special junk 3" )
textField.text: serverSpecialJunk3
2025-12-26 22:55:57 +08:00
checkEmptyText: false
2025-12-18 22:25:20 +08:00
textField.onEditingFinished: {
if ( textField . text !== serverSpecialJunk3 ) {
serverSpecialJunk3 = textField . text
}
}
textField.onActiveFocusChanged: {
if ( textField . activeFocus ) {
smartScroll . scrollToItem ( specialJunk3TextField )
}
}
}
AwgTextField {
id: specialJunk4TextField
Layout.leftMargin: 16
Layout.rightMargin: 16
headerText: qsTr ( "I4 - Special junk 4" )
textField.text: serverSpecialJunk4
2025-12-26 22:55:57 +08:00
checkEmptyText: false
2025-12-18 22:25:20 +08:00
textField.onEditingFinished: {
if ( textField . text !== serverSpecialJunk4 ) {
serverSpecialJunk4 = textField . text
}
}
textField.onActiveFocusChanged: {
if ( textField . activeFocus ) {
smartScroll . scrollToItem ( specialJunk4TextField )
}
}
}
AwgTextField {
id: specialJunk5TextField
Layout.leftMargin: 16
Layout.rightMargin: 16
headerText: qsTr ( "I5 - Special junk 5" )
textField.text: serverSpecialJunk5
2026-04-27 13:18:50 +08:00
checkEmptyText: false
2025-12-18 22:25:20 +08:00
textField.onEditingFinished: {
if ( textField . text !== serverSpecialJunk5 ) {
serverSpecialJunk5 = textField . text
}
}
textField.onActiveFocusChanged: {
if ( textField . activeFocus ) {
smartScroll . scrollToItem ( specialJunk5TextField )
}
}
}
2025-08-06 04:35:51 +02:00
BasicButtonType {
id: saveRestartButton
Layout.fillWidth: true
Layout.topMargin: 24
Layout.bottomMargin: 24
Layout.leftMargin: 16
Layout.rightMargin: 16
enabled: underloadPacketMagicHeaderTextField . errorText === "" &&
transportPacketMagicHeaderTextField . errorText === "" &&
responsePacketMagicHeaderTextField . errorText === "" &&
initPacketMagicHeaderTextField . errorText === "" &&
responsePacketJunkSizeTextField . errorText === "" &&
2025-12-11 15:18:36 +08:00
cookieReplyPacketJunkSizeTextField . errorText === "" &&
transportPacketJunkSizeTextField . errorText === "" &&
2025-08-06 04:35:51 +02:00
initPacketJunkSizeTextField . errorText === "" &&
junkPacketMaxSizeTextField . errorText === "" &&
junkPacketMinSizeTextField . errorText === "" &&
junkPacketCountTextField . errorText === "" &&
portTextField . errorText === "" &&
vpnAddressSubnetTextField . errorText === ""
text: qsTr ( "Save" )
onActiveFocusChanged: {
if ( activeFocus ) {
listView . positionViewAtEnd ( )
2024-12-31 04:16:52 +01:00
}
}
2023-09-22 00:37:55 +05:00
2025-08-06 04:35:51 +02:00
clickedFunc: function ( ) {
2025-12-26 22:55:57 +08:00
forceActiveFocus ( )
2025-08-06 04:35:51 +02:00
if ( delegateItem . isEnabled ) {
if ( AwgConfigModel . isHeadersEqual ( underloadPacketMagicHeaderTextField . textField . text ,
transportPacketMagicHeaderTextField . textField . text ,
responsePacketMagicHeaderTextField . textField . text ,
initPacketMagicHeaderTextField . textField . text ) ) {
PageController . showErrorMessage ( qsTr ( "The values of the H1-H4 fields must be unique" ) )
return
}
2024-12-31 04:16:52 +01:00
2025-08-06 04:35:51 +02:00
if ( AwgConfigModel . isPacketSizeEqual ( parseInt ( initPacketJunkSizeTextField . textField . text ) ,
2025-12-11 15:18:36 +08:00
parseInt ( responsePacketJunkSizeTextField . textField . text ) ,
parseInt ( cookieReplyPacketJunkSizeTextField . textField . text ) ,
parseInt ( transportPacketJunkSizeTextField . textField . text ) ) ) {
PageController . showErrorMessage ( qsTr ( "The value of the field S1 + message initiation size (148) must not equal S2 + message response size (92) + S3 + cookie reply size (64) + S4 + transport packet size (32)" ) )
2025-08-06 04:35:51 +02:00
return
2023-09-22 00:37:55 +05:00
}
2024-12-31 04:16:52 +01:00
}
2023-09-22 00:37:55 +05:00
2025-08-06 04:35:51 +02:00
var headerText = qsTr ( "Save settings?" )
var descriptionText = qsTr ( "All users with whom you shared a connection with will no longer be able to connect to it." )
var yesButtonText = qsTr ( "Continue" )
var noButtonText = qsTr ( "Cancel" )
var yesButtonFunction = function ( ) {
2026-05-28 10:57:08 +08:00
if ( ConnectionController . isConnected && ServersUiController . serverDefaultContainer ( ServersUiController . defaultServerId ) === ServersUiController . processedContainerIndex ) {
2025-08-06 04:35:51 +02:00
PageController . showNotificationMessage ( qsTr ( "Unable change settings while there is an active connection" ) )
return
2024-12-31 04:16:52 +01:00
}
2023-10-06 16:43:52 +05:00
2025-08-06 04:35:51 +02:00
PageController . goToPage ( PageEnum . PageSetupWizardInstalling ) ;
2026-06-04 15:45:53 +01:00
InstallController . updateServerConfig ( ServersUiController . processedServerId , ServersUiController . processedContainerIndex , ProtocolEnum . Awg )
2025-08-06 04:35:51 +02:00
}
2024-02-17 23:09:05 +02:00
2025-08-06 04:35:51 +02:00
var noButtonFunction = function ( ) { }
2023-09-22 00:37:55 +05:00
2025-08-06 04:35:51 +02:00
showQuestionDrawer ( headerText , descriptionText , yesButtonText , noButtonText , yesButtonFunction , noButtonFunction )
2023-09-22 00:37:55 +05:00
}
}
}
}
}