diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index 83be4c91..952df01c 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -14,8 +14,8 @@ jobs: runs-on: ubuntu-20.04 env: - QT_VERSION: 6.5.1 - QIF_VERSION: 4.6 + QT_VERSION: 6.6.2 + QIF_VERSION: 4.7 steps: - name: 'Install Qt' @@ -72,8 +72,8 @@ jobs: runs-on: windows-latest env: - QT_VERSION: 6.5.1 - QIF_VERSION: 4.6 + QT_VERSION: 6.6.2 + QIF_VERSION: 4.7 BUILD_ARCH: 64 steps: @@ -134,7 +134,7 @@ jobs: runs-on: macos-13 env: - QT_VERSION: 6.5.2 + QT_VERSION: 6.6.2 CC: cc CXX: c++ @@ -227,7 +227,7 @@ jobs: env: # Keep compat with MacOS 10.15 aka Catalina by Qt 6.4 QT_VERSION: 6.4.3 - QIF_VERSION: 4.6 + QIF_VERSION: 4.7 steps: - name: 'Setup xcode' @@ -286,7 +286,7 @@ jobs: env: ANDROID_BUILD_PLATFORM: android-34 - QT_VERSION: 6.6.1 + QT_VERSION: 6.6.2 QT_MODULES: 'qtremoteobjects qt5compat qtimageformats qtshadertools' steps: 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..d816cd41 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 { @@ -201,7 +187,7 @@ DrawerType2 { anchors.topMargin: 16 backButtonFunction: function() { - configContentDrawer.open() + configContentDrawer.close() } } diff --git a/client/ui/qml/Pages2/PageSettingsApplication.qml b/client/ui/qml/Pages2/PageSettingsApplication.qml index 372cd69e..af029b7b 100644 --- a/client/ui/qml/Pages2/PageSettingsApplication.qml +++ b/client/ui/qml/Pages2/PageSettingsApplication.qml @@ -84,6 +84,27 @@ PageType { visible: !GC.isMobile() } + SwitcherType { + visible: !GC.isMobile() + + Layout.fillWidth: true + Layout.margins: 16 + + text: qsTr("Auto connect") + descriptionText: qsTr("Connect to VPN on app start") + + checked: SettingsController.isAutoConnectEnabled() + onCheckedChanged: { + if (checked !== SettingsController.isAutoConnectEnabled()) { + SettingsController.toggleAutoConnect(checked) + } + } + } + + DividerType { + visible: !GC.isMobile() + } + SwitcherType { visible: !GC.isMobile() diff --git a/client/ui/qml/Pages2/PageSettingsConnection.qml b/client/ui/qml/Pages2/PageSettingsConnection.qml index 3a0c5c3c..4d88b397 100644 --- a/client/ui/qml/Pages2/PageSettingsConnection.qml +++ b/client/ui/qml/Pages2/PageSettingsConnection.qml @@ -41,27 +41,6 @@ PageType { headerText: qsTr("Connection") } - SwitcherType { - visible: !GC.isMobile() - - Layout.fillWidth: true - Layout.margins: 16 - - text: qsTr("Auto connect") - descriptionText: qsTr("Connect to VPN on app start") - - checked: SettingsController.isAutoConnectEnabled() - onCheckedChanged: { - if (checked !== SettingsController.isAutoConnectEnabled()) { - SettingsController.toggleAutoConnect(checked) - } - } - } - - DividerType { - visible: !GC.isMobile() - } - SwitcherType { Layout.fillWidth: true Layout.margins: 16 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) diff --git a/deploy/build_macos.sh b/deploy/build_macos.sh index 0d64a9ec..ffdbd20b 100755 --- a/deploy/build_macos.sh +++ b/deploy/build_macos.sh @@ -146,7 +146,8 @@ if [ "${MAC_CERT_PW+x}" ]; then fi echo "Building DMG installer..." -hdiutil create -size 120mb -volname AmneziaVPN -srcfolder $BUILD_DIR/installer/$APP_NAME.app -ov -format UDZO $DMG_FILENAME +# Allow Terminal to make changes in Privacy & Security > App Management +hdiutil create -size 256mb -volname AmneziaVPN -srcfolder $BUILD_DIR/installer/$APP_NAME.app -ov -format UDZO $DMG_FILENAME if [ "${MAC_CERT_PW+x}" ]; then echo "Signing DMG installer..."