From c7c7c8eb0162010512388ba3a03f259a7a5e083b Mon Sep 17 00:00:00 2001 From: agalehaga <157917463+agalehaga@users.noreply.github.com> Date: Fri, 23 Feb 2024 19:55:59 +0200 Subject: [PATCH] added export awg native format (#635) add export awg native format --- client/ui/controllers/exportController.cpp | 40 +++++++++++++++++++ client/ui/controllers/exportController.h | 1 + .../qml/Components/ShareConnectionDrawer.qml | 14 ------- client/ui/qml/Pages2/PageShare.qml | 20 +++++++++- 4 files changed, 60 insertions(+), 15 deletions(-) diff --git a/client/ui/controllers/exportController.cpp b/client/ui/controllers/exportController.cpp index 0c328326..57d864e9 100644 --- a/client/ui/controllers/exportController.cpp +++ b/client/ui/controllers/exportController.cpp @@ -8,6 +8,7 @@ #include #include +#include "configurators/awg_configurator.h" #include "configurators/cloak_configurator.h" #include "configurators/openvpn_configurator.h" #include "configurators/shadowsocks_configurator.h" @@ -228,6 +229,45 @@ void ExportController::generateWireGuardConfig(const QString &clientName) emit exportConfigChanged(); } +void ExportController::generateAwgConfig(const QString &clientName) +{ + clearPreviousConfig(); + + int serverIndex = m_serversModel->getProcessedServerIndex(); + ServerCredentials credentials = m_serversModel->getServerCredentials(serverIndex); + + DockerContainer container = static_cast(m_containersModel->getCurrentlyProcessedContainerIndex()); + QJsonObject containerConfig = m_containersModel->getContainerConfig(container); + containerConfig.insert(config_key::container, ContainerProps::containerToString(container)); + + QString clientId; + ErrorCode errorCode = ErrorCode::NoError; + QString config = m_configurator->awgConfigurator->genAwgConfig(credentials, container, containerConfig, + clientId, &errorCode); + if (errorCode) { + emit exportErrorOccurred(errorString(errorCode)); + return; + } + config = m_configurator->processConfigWithExportSettings(serverIndex, container, Proto::Awg, config); + + auto configJson = QJsonDocument::fromJson(config.toUtf8()).object(); + QStringList lines = configJson.value(config_key::config).toString().replace("\r", "").split("\n"); + for (const QString &line : lines) { + m_config.append(line + "\n"); + } + + qrcodegen::QrCode qr = qrcodegen::QrCode::encodeText(m_config.toUtf8(), qrcodegen::QrCode::Ecc::LOW); + m_qrCodes << svgToBase64(QString::fromStdString(toSvgString(qr, 1))); + + errorCode = m_clientManagementModel->appendClient(clientId, clientName, container, credentials); + if (errorCode) { + emit exportErrorOccurred(errorString(errorCode)); + return; + } + + emit exportConfigChanged(); +} + void ExportController::generateShadowSocksConfig() { clearPreviousConfig(); diff --git a/client/ui/controllers/exportController.h b/client/ui/controllers/exportController.h index a6dc468b..e5bd1657 100644 --- a/client/ui/controllers/exportController.h +++ b/client/ui/controllers/exportController.h @@ -34,6 +34,7 @@ public slots: void generateConnectionConfig(const QString &clientName); void generateOpenVpnConfig(const QString &clientName); void generateWireGuardConfig(const QString &clientName); + void generateAwgConfig(const QString &clientName); void generateShadowSocksConfig(); void generateCloakConfig(); diff --git a/client/ui/qml/Components/ShareConnectionDrawer.qml b/client/ui/qml/Components/ShareConnectionDrawer.qml index c209c1ce..aec0b810 100644 --- a/client/ui/qml/Components/ShareConnectionDrawer.qml +++ b/client/ui/qml/Components/ShareConnectionDrawer.qml @@ -107,13 +107,6 @@ DrawerType2 { text: qsTr("Copy") imageSource: "qrc:/images/controls/copy.svg" - - clickedFunc: function() { - configText.selectAll() - configText.copy() - configText.select(0, 0) - PageController.showNotificationMessage(qsTr("Copied")) - } } BasicButtonType { @@ -132,13 +125,6 @@ DrawerType2 { text: qsTr("Copy config string") imageSource: "qrc:/images/controls/copy.svg" - - clickedFunc: function() { - nativeConfigString.selectAll() - nativeConfigString.copy() - nativeConfigString.select(0, 0) - PageController.showNotificationMessage(qsTr("Copied")) - } } BasicButtonType { diff --git a/client/ui/qml/Pages2/PageShare.qml b/client/ui/qml/Pages2/PageShare.qml index cd012e27..cd7e7958 100644 --- a/client/ui/qml/Pages2/PageShare.qml +++ b/client/ui/qml/Pages2/PageShare.qml @@ -22,6 +22,7 @@ PageType { AmneziaConnection, OpenVpn, WireGuard, + Awg, ShadowSocks, Cloak } @@ -48,7 +49,10 @@ PageType { PageController.showBusyIndicator(true) switch (type) { - case PageShare.ConfigType.AmneziaConnection: ExportController.generateConnectionConfig(clientNameTextField.textFieldText); break; + case PageShare.ConfigType.AmneziaConnection: { + ExportController.generateConnectionConfig(clientNameTextField.textFieldText); + break; + } case PageShare.ConfigType.OpenVpn: { ExportController.generateOpenVpnConfig(clientNameTextField.textFieldText) shareConnectionDrawer.configCaption = qsTr("Save OpenVPN config") @@ -63,6 +67,13 @@ PageType { shareConnectionDrawer.configFileName = "amnezia_for_wireguard" break } + case PageShare.ConfigType.Awg: { + ExportController.generateAwgConfig(clientNameTextField.textFieldText) + shareConnectionDrawer.configCaption = qsTr("Save AmneziaWG config") + shareConnectionDrawer.configExtension = ".conf" + shareConnectionDrawer.configFileName = "amnezia_for_awg" + break + } case PageShare.ConfigType.ShadowSocks: { ExportController.generateShadowSocksConfig() shareConnectionDrawer.configCaption = qsTr("Save ShadowSocks config") @@ -110,6 +121,11 @@ PageType { property string name: qsTr("WireGuard native format") property var type: PageShare.ConfigType.WireGuard } + QtObject { + id: awgConnectionFormat + property string name: qsTr("AmneziaWG native format") + property var type: PageShare.ConfigType.Awg + } QtObject { id: shadowSocksConnectionFormat property string name: qsTr("ShadowSocks native format") @@ -402,6 +418,8 @@ PageType { root.connectionTypesModel.push(openVpnConnectionFormat) } else if (index === ContainerProps.containerFromString("amnezia-wireguard")) { root.connectionTypesModel.push(wireGuardConnectionFormat) + } else if (index === ContainerProps.containerFromString("amnezia-awg")) { + root.connectionTypesModel.push(awgConnectionFormat) } else if (index === ContainerProps.containerFromString("amnezia-shadowsocks")) { root.connectionTypesModel.push(openVpnConnectionFormat) root.connectionTypesModel.push(shadowSocksConnectionFormat)