added the ability to change awg parameters on the protocol settings page

This commit is contained in:
vladimir.kuznetsov 2023-10-06 16:43:52 +05:00
parent 9df262d502
commit b7a65343af
9 changed files with 224 additions and 80 deletions

View file

@ -3,6 +3,8 @@
#include <QJsonDocument> #include <QJsonDocument>
#include <QJsonObject> #include <QJsonObject>
#include "core/servercontroller.h"
AmneziaWireGuardConfigurator::AmneziaWireGuardConfigurator(std::shared_ptr<Settings> settings, QObject *parent) AmneziaWireGuardConfigurator::AmneziaWireGuardConfigurator(std::shared_ptr<Settings> settings, QObject *parent)
: WireguardConfigurator(settings, true, parent) : WireguardConfigurator(settings, true, parent)
{ {
@ -15,46 +17,43 @@ QString AmneziaWireGuardConfigurator::genAmneziaWireGuardConfig(const ServerCred
QString config = WireguardConfigurator::genWireguardConfig(credentials, container, containerConfig, errorCode); QString config = WireguardConfigurator::genWireguardConfig(credentials, container, containerConfig, errorCode);
QJsonObject jsonConfig = QJsonDocument::fromJson(config.toUtf8()).object(); QJsonObject jsonConfig = QJsonDocument::fromJson(config.toUtf8()).object();
QJsonObject awgConfig = containerConfig.value(config_key::amneziaWireguard).toObject();
auto junkPacketCount = ServerController serverController(m_settings);
awgConfig.value(config_key::junkPacketCount).toString(protocols::amneziawireguard::defaultJunkPacketCount); QString serverConfig = serverController.getTextFileFromContainer(container, credentials, protocols::amneziawireguard::serverConfigPath, errorCode);
auto junkPacketMinSize =
awgConfig.value(config_key::junkPacketMinSize).toString(protocols::amneziawireguard::defaultJunkPacketMinSize);
auto junkPacketMaxSize =
awgConfig.value(config_key::junkPacketMaxSize).toString(protocols::amneziawireguard::defaultJunkPacketMaxSize);
auto initPacketJunkSize =
awgConfig.value(config_key::initPacketJunkSize).toString(protocols::amneziawireguard::defaultInitPacketJunkSize);
auto responsePacketJunkSize =
awgConfig.value(config_key::responsePacketJunkSize).toString(protocols::amneziawireguard::defaultResponsePacketJunkSize);
auto initPacketMagicHeader =
awgConfig.value(config_key::initPacketMagicHeader).toString(protocols::amneziawireguard::defaultInitPacketMagicHeader);
auto responsePacketMagicHeader =
awgConfig.value(config_key::responsePacketMagicHeader).toString(protocols::amneziawireguard::defaultResponsePacketMagicHeader);
auto underloadPacketMagicHeader =
awgConfig.value(config_key::underloadPacketMagicHeader).toString(protocols::amneziawireguard::defaultUnderloadPacketMagicHeader);
auto transportPacketMagicHeader =
awgConfig.value(config_key::transportPacketMagicHeader).toString(protocols::amneziawireguard::defaultTransportPacketMagicHeader);
config.replace("$JUNK_PACKET_COUNT", junkPacketCount); QMap<QString, QString> serverConfigMap;
config.replace("$JUNK_PACKET_MIN_SIZE", junkPacketMinSize); auto serverConfigLines = serverConfig.split("\n");
config.replace("$JUNK_PACKET_MAX_SIZE", junkPacketMaxSize); for (auto &line : serverConfigLines) {
config.replace("$INIT_PACKET_JUNK_SIZE", initPacketJunkSize); auto trimmedLine = line.trimmed();
config.replace("$RESPONSE_PACKET_JUNK_SIZE", responsePacketJunkSize); if (trimmedLine.startsWith("[") && trimmedLine.endsWith("]")) {
config.replace("$INIT_PACKET_MAGIC_HEADER", initPacketMagicHeader); continue;
config.replace("$RESPONSE_PACKET_MAGIC_HEADER", responsePacketMagicHeader); } else {
config.replace("$UNDERLOAD_PACKET_MAGIC_HEADER", underloadPacketMagicHeader); QStringList parts = trimmedLine.split(" = ");
config.replace("$TRANSPORT_PACKET_MAGIC_HEADER", transportPacketMagicHeader); if (parts.count() == 2) {
serverConfigMap.insert(parts[0].trimmed(), parts[1].trimmed());
}
}
}
jsonConfig[config_key::junkPacketCount] = junkPacketCount; config.replace("$JUNK_PACKET_COUNT", serverConfigMap.value(config_key::junkPacketCount));
jsonConfig[config_key::junkPacketMinSize] = junkPacketMinSize; config.replace("$JUNK_PACKET_MIN_SIZE", serverConfigMap.value(config_key::junkPacketMinSize));
jsonConfig[config_key::junkPacketMaxSize] = junkPacketMaxSize; config.replace("$JUNK_PACKET_MAX_SIZE", serverConfigMap.value(config_key::junkPacketMaxSize));
jsonConfig[config_key::initPacketJunkSize] = initPacketJunkSize; config.replace("$INIT_PACKET_JUNK_SIZE", serverConfigMap.value(config_key::initPacketJunkSize));
jsonConfig[config_key::responsePacketJunkSize] = responsePacketJunkSize; config.replace("$RESPONSE_PACKET_JUNK_SIZE", serverConfigMap.value(config_key::responsePacketJunkSize));
jsonConfig[config_key::initPacketMagicHeader] = initPacketMagicHeader; config.replace("$INIT_PACKET_MAGIC_HEADER", serverConfigMap.value(config_key::initPacketMagicHeader));
jsonConfig[config_key::responsePacketMagicHeader] = responsePacketMagicHeader; config.replace("$RESPONSE_PACKET_MAGIC_HEADER", serverConfigMap.value(config_key::responsePacketMagicHeader));
jsonConfig[config_key::underloadPacketMagicHeader] = underloadPacketMagicHeader; config.replace("$UNDERLOAD_PACKET_MAGIC_HEADER", serverConfigMap.value(config_key::underloadPacketMagicHeader));
jsonConfig[config_key::transportPacketMagicHeader] = transportPacketMagicHeader; config.replace("$TRANSPORT_PACKET_MAGIC_HEADER", serverConfigMap.value(config_key::transportPacketMagicHeader));
jsonConfig[config_key::junkPacketCount] = serverConfigMap.value(config_key::junkPacketCount);
jsonConfig[config_key::junkPacketMinSize] = serverConfigMap.value(config_key::junkPacketMinSize);
jsonConfig[config_key::junkPacketMaxSize] = serverConfigMap.value(config_key::junkPacketMaxSize);
jsonConfig[config_key::initPacketJunkSize] = serverConfigMap.value(config_key::initPacketJunkSize);
jsonConfig[config_key::responsePacketJunkSize] = serverConfigMap.value(config_key::responsePacketJunkSize);
jsonConfig[config_key::initPacketMagicHeader] = serverConfigMap.value(config_key::initPacketMagicHeader);
jsonConfig[config_key::responsePacketMagicHeader] = serverConfigMap.value(config_key::responsePacketMagicHeader);
jsonConfig[config_key::underloadPacketMagicHeader] = serverConfigMap.value(config_key::underloadPacketMagicHeader);
jsonConfig[config_key::transportPacketMagicHeader] = serverConfigMap.value(config_key::transportPacketMagicHeader);
return QJsonDocument(jsonConfig).toJson(); return QJsonDocument(jsonConfig).toJson();
} }

View file

@ -30,6 +30,9 @@ WireguardConfigurator::WireguardConfigurator(std::shared_ptr<Settings> settings,
: amnezia::protocols::wireguard::serverPskKeyPath; : amnezia::protocols::wireguard::serverPskKeyPath;
m_configTemplate = m_isAmneziaWireGuard ? ProtocolScriptType::amnezia_wireguard_template m_configTemplate = m_isAmneziaWireGuard ? ProtocolScriptType::amnezia_wireguard_template
: ProtocolScriptType::wireguard_template; : ProtocolScriptType::wireguard_template;
m_protocolName = m_isAmneziaWireGuard ? config_key::amneziaWireguard : config_key::wireguard;
m_defaultPort = m_isAmneziaWireGuard ? protocols::wireguard::defaultPort : protocols::amneziawireguard::defaultPort;
} }
WireguardConfigurator::ConnectionData WireguardConfigurator::genClientKeys() WireguardConfigurator::ConnectionData WireguardConfigurator::genClientKeys()
@ -70,10 +73,7 @@ WireguardConfigurator::ConnectionData WireguardConfigurator::prepareWireguardCon
{ {
WireguardConfigurator::ConnectionData connData = WireguardConfigurator::genClientKeys(); WireguardConfigurator::ConnectionData connData = WireguardConfigurator::genClientKeys();
connData.host = credentials.hostName; connData.host = credentials.hostName;
connData.port = containerConfig.value(m_isAmneziaWireGuard ? config_key::amneziaWireguard : config_key::wireguard) connData.port = containerConfig.value(m_protocolName).toObject().value(config_key::port).toString(m_defaultPort);
.toObject()
.value(config_key::port)
.toString(protocols::wireguard::defaultPort);
if (connData.clientPrivKey.isEmpty() || connData.clientPubKey.isEmpty()) { if (connData.clientPrivKey.isEmpty() || connData.clientPubKey.isEmpty()) {
if (errorCode) if (errorCode)

View file

@ -42,6 +42,8 @@ private:
QString m_serverPublicKeyPath; QString m_serverPublicKeyPath;
QString m_serverPskKeyPath; QString m_serverPskKeyPath;
amnezia::ProtocolScriptType m_configTemplate; amnezia::ProtocolScriptType m_configTemplate;
QString m_protocolName;
QString m_defaultPort;
}; };
#endif // WIREGUARD_CONFIGURATOR_H #endif // WIREGUARD_CONFIGURATOR_H

View file

@ -338,6 +338,10 @@ bool ServerController::isReinstallContainerRequired(DockerContainer container, c
return true; return true;
} }
if (container == DockerContainer::AmneziaWireGuard) {
return true;
}
return false; return false;
} }

View file

@ -1,5 +1,7 @@
#include "amneziaWireGuardConfigModel.h" #include "amneziaWireGuardConfigModel.h"
#include <QJsonDocument>
#include "protocols/protocols_defs.h" #include "protocols/protocols_defs.h"
AmneziaWireGuardConfigModel::AmneziaWireGuardConfigModel(QObject *parent) : QAbstractListModel(parent) AmneziaWireGuardConfigModel::AmneziaWireGuardConfigModel(QObject *parent) : QAbstractListModel(parent)
@ -20,7 +22,27 @@ bool AmneziaWireGuardConfigModel::setData(const QModelIndex &index, const QVaria
switch (role) { switch (role) {
case Roles::PortRole: m_protocolConfig.insert(config_key::port, value.toString()); break; case Roles::PortRole: m_protocolConfig.insert(config_key::port, value.toString()); break;
case Roles::CipherRole: m_protocolConfig.insert(config_key::cipher, value.toString()); break; case Roles::JunkPacketCountRole: m_protocolConfig.insert(config_key::junkPacketCount, value.toString()); break;
case Roles::JunkPacketMinSizeRole: m_protocolConfig.insert(config_key::junkPacketMinSize, value.toString()); break;
case Roles::JunkPacketMaxSizeRole: m_protocolConfig.insert(config_key::junkPacketMaxSize, value.toString()); break;
case Roles::InitPacketJunkSizeRole:
m_protocolConfig.insert(config_key::initPacketJunkSize, value.toString());
break;
case Roles::ResponsePacketJunkSizeRole:
m_protocolConfig.insert(config_key::responsePacketJunkSize, value.toString());
break;
case Roles::InitPacketMagicHeaderRole:
m_protocolConfig.insert(config_key::initPacketMagicHeader, value.toString());
break;
case Roles::ResponsePacketMagicHeaderRole:
m_protocolConfig.insert(config_key::responsePacketMagicHeader, value.toString());
break;
case Roles::UnderloadPacketMagicHeaderRole:
m_protocolConfig.insert(config_key::underloadPacketMagicHeader, value.toString());
break;
case Roles::TransportPacketMagicHeaderRole:
m_protocolConfig.insert(config_key::transportPacketMagicHeader, value.toString());
break;
} }
emit dataChanged(index, index, QList { role }); emit dataChanged(index, index, QList { role });
@ -34,9 +56,16 @@ QVariant AmneziaWireGuardConfigModel::data(const QModelIndex &index, int role) c
} }
switch (role) { switch (role) {
case Roles::PortRole: return m_protocolConfig.value(config_key::port).toString(protocols::shadowsocks::defaultPort); case Roles::PortRole: return m_protocolConfig.value(config_key::port).toString();
case Roles::CipherRole: case Roles::JunkPacketCountRole: return m_protocolConfig.value(config_key::junkPacketCount);
return m_protocolConfig.value(config_key::cipher).toString(protocols::shadowsocks::defaultCipher); case Roles::JunkPacketMinSizeRole: return m_protocolConfig.value(config_key::junkPacketMinSize);
case Roles::JunkPacketMaxSizeRole: return m_protocolConfig.value(config_key::junkPacketMaxSize);
case Roles::InitPacketJunkSizeRole: return m_protocolConfig.value(config_key::initPacketJunkSize);
case Roles::ResponsePacketJunkSizeRole: return m_protocolConfig.value(config_key::responsePacketJunkSize);
case Roles::InitPacketMagicHeaderRole: return m_protocolConfig.value(config_key::initPacketMagicHeader);
case Roles::ResponsePacketMagicHeaderRole: return m_protocolConfig.value(config_key::responsePacketMagicHeader);
case Roles::UnderloadPacketMagicHeaderRole: return m_protocolConfig.value(config_key::underloadPacketMagicHeader);
case Roles::TransportPacketMagicHeaderRole: return m_protocolConfig.value(config_key::transportPacketMagicHeader);
} }
return QVariant(); return QVariant();
@ -48,14 +77,44 @@ void AmneziaWireGuardConfigModel::updateModel(const QJsonObject &config)
m_container = ContainerProps::containerFromString(config.value(config_key::container).toString()); m_container = ContainerProps::containerFromString(config.value(config_key::container).toString());
m_fullConfig = config; m_fullConfig = config;
QJsonObject protocolConfig = config.value(config_key::wireguard).toObject();
QJsonObject protocolConfig = config.value(config_key::amneziaWireguard).toObject();
m_protocolConfig[config_key::port] =
protocolConfig.value(config_key::port).toString(protocols::amneziawireguard::defaultPort);
m_protocolConfig[config_key::junkPacketCount] =
protocolConfig.value(config_key::junkPacketCount).toString(protocols::amneziawireguard::defaultJunkPacketCount);
m_protocolConfig[config_key::junkPacketMinSize] =
protocolConfig.value(config_key::junkPacketMinSize)
.toString(protocols::amneziawireguard::defaultJunkPacketMinSize);
m_protocolConfig[config_key::junkPacketMaxSize] =
protocolConfig.value(config_key::junkPacketMaxSize)
.toString(protocols::amneziawireguard::defaultJunkPacketMaxSize);
m_protocolConfig[config_key::initPacketJunkSize] =
protocolConfig.value(config_key::initPacketJunkSize)
.toString(protocols::amneziawireguard::defaultInitPacketJunkSize);
m_protocolConfig[config_key::responsePacketJunkSize] =
protocolConfig.value(config_key::responsePacketJunkSize)
.toString(protocols::amneziawireguard::defaultResponsePacketJunkSize);
m_protocolConfig[config_key::initPacketMagicHeader] =
protocolConfig.value(config_key::initPacketMagicHeader)
.toString(protocols::amneziawireguard::defaultInitPacketMagicHeader);
m_protocolConfig[config_key::responsePacketMagicHeader] =
protocolConfig.value(config_key::responsePacketMagicHeader)
.toString(protocols::amneziawireguard::defaultResponsePacketMagicHeader);
m_protocolConfig[config_key::underloadPacketMagicHeader] =
protocolConfig.value(config_key::underloadPacketMagicHeader)
.toString(protocols::amneziawireguard::defaultUnderloadPacketMagicHeader);
m_protocolConfig[config_key::transportPacketMagicHeader] =
protocolConfig.value(config_key::transportPacketMagicHeader)
.toString(protocols::amneziawireguard::defaultTransportPacketMagicHeader);
endResetModel(); endResetModel();
} }
QJsonObject AmneziaWireGuardConfigModel::getConfig() QJsonObject AmneziaWireGuardConfigModel::getConfig()
{ {
m_fullConfig.insert(config_key::wireguard, m_protocolConfig); m_fullConfig.insert(config_key::amneziaWireguard, m_protocolConfig);
return m_fullConfig; return m_fullConfig;
} }
@ -64,7 +123,15 @@ QHash<int, QByteArray> AmneziaWireGuardConfigModel::roleNames() const
QHash<int, QByteArray> roles; QHash<int, QByteArray> roles;
roles[PortRole] = "port"; roles[PortRole] = "port";
roles[CipherRole] = "cipher"; roles[JunkPacketCountRole] = "junkPacketCount";
roles[JunkPacketMinSizeRole] = "junkPacketMinSize";
roles[JunkPacketMaxSizeRole] = "junkPacketMaxSize";
roles[InitPacketJunkSizeRole] = "initPacketJunkSize";
roles[ResponsePacketJunkSizeRole] = "responsePacketJunkSize";
roles[InitPacketMagicHeaderRole] = "initPacketMagicHeader";
roles[ResponsePacketMagicHeaderRole] = "responsePacketMagicHeader";
roles[UnderloadPacketMagicHeaderRole] = "underloadPacketMagicHeader";
roles[TransportPacketMagicHeaderRole] = "transportPacketMagicHeader";
return roles; return roles;
} }

View file

@ -13,7 +13,15 @@ class AmneziaWireGuardConfigModel : public QAbstractListModel
public: public:
enum Roles { enum Roles {
PortRole = Qt::UserRole + 1, PortRole = Qt::UserRole + 1,
CipherRole JunkPacketCountRole,
JunkPacketMinSizeRole,
JunkPacketMaxSizeRole,
InitPacketJunkSizeRole,
ResponsePacketJunkSizeRole,
InitPacketMagicHeaderRole,
ResponsePacketMagicHeaderRole,
UnderloadPacketMagicHeaderRole,
TransportPacketMagicHeaderRole
}; };
explicit AmneziaWireGuardConfigModel(QObject *parent = nullptr); explicit AmneziaWireGuardConfigModel(QObject *parent = nullptr);

View file

@ -65,7 +65,7 @@ ListView {
break break
} }
case ContainerEnum.AmneziaWireGuard: { case ContainerEnum.AmneziaWireGuard: {
WireGuardConfigModel.updateModel(config) AmneziaWireGuardConfigModel.updateModel(config)
PageController.goToPage(PageEnum.PageProtocolAmneziaWireGuardSettings) PageController.goToPage(PageEnum.PageProtocolAmneziaWireGuardSettings)
break break
} }

View file

@ -12,6 +12,7 @@ Item {
property string headerTextColor: "#878b91" property string headerTextColor: "#878b91"
property alias errorText: errorField.text property alias errorText: errorField.text
property bool checkEmptyText: false
property string buttonText property string buttonText
property string buttonImageSource property string buttonImageSource
@ -98,6 +99,12 @@ Item {
root.errorText = "" root.errorText = ""
} }
onActiveFocusChanged: {
if (checkEmptyText && textFieldText === "") {
errorText = qsTr("The field can't be empty")
}
}
MouseArea { MouseArea {
anchors.fill: parent anchors.fill: parent
acceptedButtons: Qt.RightButton acceptedButtons: Qt.RightButton

View file

@ -4,6 +4,8 @@ import QtQuick.Layouts
import SortFilterProxyModel 0.2 import SortFilterProxyModel 0.2
import PageEnum 1.0
import "./" import "./"
import "../Controls2" import "../Controls2"
import "../Controls2/TextTypes" import "../Controls2/TextTypes"
@ -75,6 +77,7 @@ PageType {
} }
TextFieldWithHeaderType { TextFieldWithHeaderType {
id: portTextField
Layout.fillWidth: true Layout.fillWidth: true
Layout.topMargin: 40 Layout.topMargin: 40
@ -88,132 +91,175 @@ PageType {
port = textFieldText port = textFieldText
} }
} }
checkEmptyText: true
} }
TextFieldWithHeaderType { TextFieldWithHeaderType {
id: junkPacketCountTextField
Layout.fillWidth: true Layout.fillWidth: true
Layout.topMargin: 16 Layout.topMargin: 16
headerText: qsTr("Junk packet count") headerText: qsTr("Junk packet count")
textFieldText: port textFieldText: junkPacketCount
textField.validator: IntValidator { bottom: 0 }
textField.onEditingFinished: { textField.onEditingFinished: {
if (textFieldText !== port) { console.log("1")
port = textFieldText if (textFieldText === "") {
textFieldText = "0"
}
if (textFieldText !== junkPacketCount) {
junkPacketCount = textFieldText
} }
} }
checkEmptyText: true
} }
TextFieldWithHeaderType { TextFieldWithHeaderType {
id: junkPacketMinSizeTextField
Layout.fillWidth: true Layout.fillWidth: true
Layout.topMargin: 16 Layout.topMargin: 16
headerText: qsTr("Junk packet minimum size") headerText: qsTr("Junk packet minimum size")
textFieldText: port textFieldText: junkPacketMinSize
textField.validator: IntValidator { bottom: 0 }
textField.onEditingFinished: { textField.onEditingFinished: {
if (textFieldText !== port) { if (textFieldText !== junkPacketMinSize) {
port = textFieldText junkPacketMinSize = textFieldText
} }
} }
checkEmptyText: true
} }
TextFieldWithHeaderType { TextFieldWithHeaderType {
id: junkPacketMaxSizeTextField
Layout.fillWidth: true Layout.fillWidth: true
Layout.topMargin: 16 Layout.topMargin: 16
headerText: qsTr("Junk packet maximum size") headerText: qsTr("Junk packet maximum size")
textFieldText: port textFieldText: junkPacketMaxSize
textField.validator: IntValidator { bottom: 0 }
textField.onEditingFinished: { textField.onEditingFinished: {
if (textFieldText !== port) { if (textFieldText !== junkPacketMaxSize) {
port = textFieldText junkPacketMaxSize = textFieldText
} }
} }
checkEmptyText: true
} }
TextFieldWithHeaderType { TextFieldWithHeaderType {
id: initPacketJunkSizeTextField
Layout.fillWidth: true Layout.fillWidth: true
Layout.topMargin: 16 Layout.topMargin: 16
headerText: qsTr("Init packet junk size") headerText: qsTr("Init packet junk size")
textFieldText: port textFieldText: initPacketJunkSize
textField.validator: IntValidator { bottom: 0 }
textField.onEditingFinished: { textField.onEditingFinished: {
if (textFieldText !== port) { if (textFieldText !== initPacketJunkSize) {
port = textFieldText initPacketJunkSize = textFieldText
} }
} }
checkEmptyText: true
} }
TextFieldWithHeaderType { TextFieldWithHeaderType {
id: responsePacketJunkSizeTextField
Layout.fillWidth: true Layout.fillWidth: true
Layout.topMargin: 16 Layout.topMargin: 16
headerText: qsTr("Response packet junk size") headerText: qsTr("Response packet junk size")
textFieldText: port textFieldText: responsePacketJunkSize
textField.validator: IntValidator { bottom: 0 }
textField.onEditingFinished: { textField.onEditingFinished: {
if (textFieldText !== port) { if (textFieldText !== responsePacketJunkSize) {
port = textFieldText responsePacketJunkSize = textFieldText
} }
} }
checkEmptyText: true
} }
TextFieldWithHeaderType { TextFieldWithHeaderType {
id: initPacketMagicHeaderTextField
Layout.fillWidth: true Layout.fillWidth: true
Layout.topMargin: 16 Layout.topMargin: 16
headerText: qsTr("Init packet magic header") headerText: qsTr("Init packet magic header")
textFieldText: port textFieldText: initPacketMagicHeader
textField.validator: IntValidator { bottom: 0 }
textField.onEditingFinished: { textField.onEditingFinished: {
if (textFieldText !== port) { if (textFieldText !== initPacketMagicHeader) {
port = textFieldText initPacketMagicHeader = textFieldText
} }
} }
checkEmptyText: true
} }
TextFieldWithHeaderType { TextFieldWithHeaderType {
id: responsePacketMagicHeaderTextField
Layout.fillWidth: true Layout.fillWidth: true
Layout.topMargin: 16 Layout.topMargin: 16
headerText: qsTr("Response packet magic header") headerText: qsTr("Response packet magic header")
textFieldText: port textFieldText: responsePacketMagicHeader
textField.validator: IntValidator { bottom: 0 }
textField.onEditingFinished: { textField.onEditingFinished: {
if (textFieldText !== port) { if (textFieldText !== responsePacketMagicHeader) {
port = textFieldText responsePacketMagicHeader = textFieldText
} }
} }
checkEmptyText: true
} }
TextFieldWithHeaderType { TextFieldWithHeaderType {
id: transportPacketMagicHeaderTextField
Layout.fillWidth: true Layout.fillWidth: true
Layout.topMargin: 16 Layout.topMargin: 16
headerText: qsTr("Transport packet magic header") headerText: qsTr("Transport packet magic header")
textFieldText: port textFieldText: transportPacketMagicHeader
textField.validator: IntValidator { bottom: 0 }
textField.onEditingFinished: { textField.onEditingFinished: {
if (textFieldText !== port) { if (textFieldText !== transportPacketMagicHeader) {
port = textFieldText transportPacketMagicHeader = textFieldText
} }
} }
checkEmptyText: true
} }
TextFieldWithHeaderType { TextFieldWithHeaderType {
id: underloadPacketMagicHeaderTextField
Layout.fillWidth: true Layout.fillWidth: true
Layout.topMargin: 16 Layout.topMargin: 16
headerText: qsTr("Underload packet magic header") headerText: qsTr("Underload packet magic header")
textFieldText: port textFieldText: underloadPacketMagicHeader
textField.validator: IntValidator { bottom: 0 }
textField.onEditingFinished: { textField.onEditingFinished: {
if (textFieldText !== port) { if (textFieldText !== underloadPacketMagicHeader) {
port = textFieldText underloadPacketMagicHeader = textFieldText
} }
} }
checkEmptyText: true
} }
BasicButtonType { BasicButtonType {
@ -251,13 +297,24 @@ PageType {
Layout.topMargin: 24 Layout.topMargin: 24
Layout.bottomMargin: 24 Layout.bottomMargin: 24
enabled: underloadPacketMagicHeaderTextField.errorText === "" &&
transportPacketMagicHeaderTextField.errorText === "" &&
responsePacketMagicHeaderTextField.errorText === "" &&
initPacketMagicHeaderTextField.errorText === "" &&
responsePacketJunkSizeTextField.errorText === "" &&
initPacketJunkSizeTextField.errorText === "" &&
junkPacketMaxSizeTextField.errorText === "" &&
junkPacketMinSizeTextField.errorText === "" &&
junkPacketCountTextField.errorText === "" &&
portTextField.errorText === ""
text: qsTr("Save and Restart Amnezia") text: qsTr("Save and Restart Amnezia")
onClicked: { onClicked: {
forceActiveFocus() forceActiveFocus()
// PageController.showBusyIndicator(true) PageController.showBusyIndicator(true)
// InstallController.updateContainer(ShadowSocksConfigModel.getConfig()) InstallController.updateContainer(AmneziaWireGuardConfigModel.getConfig())
// PageController.showBusyIndicator(false) PageController.showBusyIndicator(false)
} }
} }
} }