feat: awg 2 support (#1836)

* Add updated awg container

* add missing files

* Hide uninstalled AwgLegacy container

* Fix resources file

* Add role for allowed for installation containers

* Add native config sharing for new Awg container

* Fix not opening awg settings

* Remove AwgLegacy from wizard manual installation page

* Fix AmneziaWG settings

* chore: update link to submodule

* refactor: remove j1-j3 and itime

* chore: return s3 s4 fields to ui

* fix: awg2 native config compatability

* chore: update packet size validation

* feat: add awg2 support in self-hosted containers

* fix: delete parameters from server config

* feat: add H-parameters  validation as a strings

* chore: update link to submodule

* chore: add containers type for awg 1.5 and awg 2

* chore: fixed s3/s4 visibility for awg 1

---------

Co-authored-by: aiamnezia <ai@amnezia.org>
This commit is contained in:
vkamn
2025-12-11 15:18:36 +08:00
committed by GitHub
parent ac77b4ee75
commit 40950b92ee
48 changed files with 586 additions and 501 deletions
@@ -281,100 +281,6 @@ PageType {
}
}
AwgTextField {
id: controlledJunk1TextField
Layout.leftMargin: 16
Layout.rightMargin: 16
headerText: qsTr("J1 - First controlled junk packet")
textField.text: clientControlledJunk1
textField.validator: null
checkEmptyText: false
textField.onEditingFinished: {
if (textField.text !== clientControlledJunk1) {
clientControlledJunk1 = textField.text
}
}
textField.onActiveFocusChanged: {
if (textField.activeFocus) {
smartScroll.scrollToItem(controlledJunk1TextField)
}
}
}
AwgTextField {
id: controlledJunk2TextField
Layout.leftMargin: 16
Layout.rightMargin: 16
headerText: qsTr("J2 - Second controlled junk packet")
textField.text: clientControlledJunk2
textField.validator: null
checkEmptyText: false
textField.onEditingFinished: {
if (textField.text !== clientControlledJunk2) {
clientControlledJunk2 = textField.text
}
}
textField.onActiveFocusChanged: {
if (textField.activeFocus) {
smartScroll.scrollToItem(controlledJunk2TextField)
}
}
}
AwgTextField {
id: controlledJunk3TextField
Layout.leftMargin: 16
Layout.rightMargin: 16
headerText: qsTr("J3 - Third controlled junk packet")
textField.text: clientControlledJunk3
textField.validator: null
checkEmptyText: false
textField.onEditingFinished: {
if (textField.text !== clientControlledJunk3) {
clientControlledJunk3 = textField.text
}
}
textField.onActiveFocusChanged: {
if (textField.activeFocus) {
smartScroll.scrollToItem(controlledJunk3TextField)
}
}
}
AwgTextField {
id: iTimeTextField
Layout.leftMargin: 16
Layout.rightMargin: 16
headerText: qsTr("Itime - Special handshake timeout")
textField.text: clientSpecialHandshakeTimeout
checkEmptyText: false
textField.onEditingFinished: {
if (textField.text !== clientSpecialHandshakeTimeout) {
clientSpecialHandshakeTimeout = textField.text
}
}
textField.onActiveFocusChanged: {
if (textField.activeFocus) {
smartScroll.scrollToItem(iTimeTextField)
}
}
}
Header2TextType {
Layout.fillWidth: true
@@ -421,29 +327,29 @@ PageType {
textField.text: serverResponsePacketJunkSize
}
// AwgTextField {
// id: cookieReplyPacketJunkSizeTextField
AwgTextField {
id: cookieReplyPacketJunkSizeTextField
// Layout.leftMargin: 16
// Layout.rightMargin: 16
Layout.leftMargin: 16
Layout.rightMargin: 16
// enabled: false
enabled: false
// headerText: "S3 - Cookie Reply packet junk size"
// textField.text: serverCookieReplyPacketJunkSize
// }
headerText: "S3 - Cookie Reply packet junk size"
textField.text: serverCookieReplyPacketJunkSize
}
// AwgTextField {
// id: transportPacketJunkSizeTextField
AwgTextField {
id: transportPacketJunkSizeTextField
// Layout.leftMargin: 16
// Layout.rightMargin: 16
Layout.leftMargin: 16
Layout.rightMargin: 16
// enabled: false
enabled: false
// headerText: "S4 - Transport packet junk size"
// textField.text: serverTransportPacketJunkSize
// }
headerText: "S4 - Transport packet junk size"
textField.text: serverTransportPacketJunkSize
}
AwgTextField {
id: initPacketMagicHeaderTextField
@@ -234,37 +234,53 @@ PageType {
}
}
// AwgTextField {
// id: cookieReplyPacketJunkSizeTextField
AwgTextField {
id: cookieReplyPacketJunkSizeTextField
// Layout.leftMargin: 16
// Layout.rightMargin: 16
Layout.leftMargin: 16
Layout.rightMargin: 16
// headerText: qsTr("S3 - Cookie reply packet junk size")
// textField.text: serverCookieReplyPacketJunkSize
visible: isAwg2
// textField.onEditingFinished: {
// if (textField.text !== serverCookieReplyPacketJunkSize) {
// serverCookieReplyPacketJunkSize = textField.text
// }
// }
// }
headerText: qsTr("S3 - Cookie reply packet junk size")
textField.text: serverCookieReplyPacketJunkSize
// AwgTextField {
// id: transportPacketJunkSizeTextField
textField.onEditingFinished: {
if (textField.text !== serverCookieReplyPacketJunkSize) {
serverCookieReplyPacketJunkSize = textField.text
}
}
// Layout.leftMargin: 16
// Layout.rightMargin: 16
textField.onActiveFocusChanged: {
if (textField.activeFocus) {
smartScroll.scrollToItem(cookieReplyPacketJunkSizeTextField)
}
}
}
// headerText: qsTr("S4 - Transport packet junk size")
// textField.text: serverTransportPacketJunkSize
AwgTextField {
id: transportPacketJunkSizeTextField
// textField.onEditingFinished: {
// if (textField.text !== serverTransportPacketJunkSize) {
// serverTransportPacketJunkSize = textField.text
// }
// }
// }
Layout.leftMargin: 16
Layout.rightMargin: 16
visible: isAwg2
headerText: qsTr("S4 - Transport packet junk size")
textField.text: serverTransportPacketJunkSize
textField.onEditingFinished: {
if (textField.text !== serverTransportPacketJunkSize) {
serverTransportPacketJunkSize = textField.text
}
}
textField.onActiveFocusChanged: {
if (textField.activeFocus) {
smartScroll.scrollToItem(transportPacketJunkSizeTextField)
}
}
}
AwgTextField {
id: initPacketMagicHeaderTextField
@@ -274,6 +290,9 @@ PageType {
headerText: qsTr("H1 - Init packet magic header")
textField.text: serverInitPacketMagicHeader
textField.validator: RegularExpressionValidator {
regularExpression: /^(\d+)(-\d+)?$/
}
textField.onEditingFinished: {
if (textField.text !== serverInitPacketMagicHeader) {
@@ -296,6 +315,9 @@ PageType {
headerText: qsTr("H2 - Response packet magic header")
textField.text: serverResponsePacketMagicHeader
textField.validator: RegularExpressionValidator {
regularExpression: /^(\d+)(-\d+)?$/
}
textField.onEditingFinished: {
if (textField.text !== serverResponsePacketMagicHeader) {
@@ -318,6 +340,9 @@ PageType {
headerText: qsTr("H3 - Underload packet magic header")
textField.text: serverUnderloadPacketMagicHeader
textField.validator: RegularExpressionValidator {
regularExpression: /^(\d+)(-\d+)?$/
}
textField.onEditingFinished: {
if (textField.text !== serverUnderloadPacketMagicHeader) {
@@ -340,6 +365,9 @@ PageType {
headerText: qsTr("H4 - Transport packet magic header")
textField.text: serverTransportPacketMagicHeader
textField.validator: RegularExpressionValidator {
regularExpression: /^(\d+)(-\d+)?$/
}
textField.onEditingFinished: {
if (textField.text !== serverTransportPacketMagicHeader) {
@@ -368,8 +396,8 @@ PageType {
responsePacketMagicHeaderTextField.errorText === "" &&
initPacketMagicHeaderTextField.errorText === "" &&
responsePacketJunkSizeTextField.errorText === "" &&
// cookieReplyHeaderJunkTextField.errorText === "" &&
// transportHeaderJunkTextField.errorText === "" &&
cookieReplyPacketJunkSizeTextField.errorText === "" &&
transportPacketJunkSizeTextField.errorText === "" &&
initPacketJunkSizeTextField.errorText === "" &&
junkPacketMaxSizeTextField.errorText === "" &&
junkPacketMinSizeTextField.errorText === "" &&
@@ -396,17 +424,12 @@ PageType {
}
if (AwgConfigModel.isPacketSizeEqual(parseInt(initPacketJunkSizeTextField.textField.text),
parseInt(responsePacketJunkSizeTextField.textField.text))) {
PageController.showErrorMessage(qsTr("The value of the field S1 + message initiation size (148) must not equal S2 + message response size (92)"))
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)"))
return
}
// if (AwgConfigModel.isPacketSizeEqual(parseInt(initPacketJunkSizeTextField.textField.text),
// 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)"))
// return
// }
}
var headerText = qsTr("Save settings?")
@@ -26,6 +26,10 @@ PageType {
ValueFilter {
roleName: "isSupported"
value: true
},
ValueFilter {
roleName: "isInstallationAllowed"
value: true
}
]
sorters: RoleSorter {
+4
View File
@@ -459,6 +459,10 @@ PageType {
root.connectionTypesModel.push(wireGuardConnectionFormat)
} else if (index === ContainerProps.containerFromString("amnezia-awg")) {
root.connectionTypesModel.push(awgConnectionFormat)
} else if (index === ContainerProps.containerFromString("amnezia-awg2")) {
root.connectionTypesModel.push(awgConnectionFormat)
} else if (index === ContainerProps.containerFromString("amnezia-awg1.5")) {
root.connectionTypesModel.push(awgConnectionFormat)
} else if (index === ContainerProps.containerFromString("amnezia-shadowsocks")) {
root.connectionTypesModel.push(openVpnConnectionFormat)
root.connectionTypesModel.push(shadowSocksConnectionFormat)