From a9bb6f809940dc83fa49e91ae9d0ce2c92dc9a8a Mon Sep 17 00:00:00 2001 From: Dmitriy Karpushin Date: Tue, 4 Apr 2023 17:10:58 +0300 Subject: [PATCH 1/4] Fix to build at least x86_64 version of Amnezia desktop app on Apple Silicon --- CMakeLists.txt | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CMakeLists.txt b/CMakeLists.txt index e8dbd7c7f..f1e5d37cc 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -7,6 +7,10 @@ if(ANDROID) set(QT_ANDROID_BUILD_ALL_ABIS ON) endif() +if(APPLE AND NOT IOS) + set(CMAKE_OSX_ARCHITECTURES "x86_64") +endif() + add_subdirectory(client) if(NOT IOS AND NOT ANDROID) From 48d673c853b60c048cafac0c2ac4ca30df62d9dd Mon Sep 17 00:00:00 2001 From: "vladimir.kuznetsov" Date: Tue, 4 Apr 2023 18:20:19 +0300 Subject: [PATCH 2/4] fixed getting default port and default transport protocol in isServerPortBusy function --- client/core/servercontroller.cpp | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/client/core/servercontroller.cpp b/client/core/servercontroller.cpp index 67a21bba5..2be9d38f6 100644 --- a/client/core/servercontroller.cpp +++ b/client/core/servercontroller.cpp @@ -871,13 +871,16 @@ ErrorCode ServerController::isServerPortBusy(const ServerCredentials &credential stdOut += data + "\n"; }; - const QString containerString = ProtocolProps::protoToString(ContainerProps::defaultProtocol(container)); + const Proto protocol = ContainerProps::defaultProtocol(container); + const QString containerString = ProtocolProps::protoToString(protocol); const QJsonObject containerConfig = config.value(containerString).toObject(); QStringList fixedPorts = ContainerProps::fixedPortsForContainer(container); - QString port = containerConfig.value(config_key::port).toString(protocols::openvpn::defaultPort); - QString transportProto = containerConfig.value(config_key::transport_proto).toString(protocols::openvpn::defaultTransportProto); + QString defaultPort("%1"); + QString port = containerConfig.value(config_key::port).toString(defaultPort.arg(ProtocolProps::defaultPort(protocol))); + QString defaultTransportProto = ProtocolProps::transportProtoToString(ProtocolProps::defaultTransportProto(protocol), protocol); + QString transportProto = containerConfig.value(config_key::transport_proto).toString(defaultTransportProto); QString script = QString("sudo lsof -i -P -n | grep -E ':%1 ").arg(port); for (auto &port : fixedPorts) { From 6e67946ae204d7dcd2926675551afe2828b21fba Mon Sep 17 00:00:00 2001 From: "vladimir.kuznetsov" Date: Tue, 4 Apr 2023 19:05:13 +0300 Subject: [PATCH 3/4] Removed the ability to add multiple servers with the same connection credentials via the "Add server" button --- .../AdvancedServerSettingsLogic.cpp | 2 +- .../ui/pages_logic/ServerContainersLogic.cpp | 6 ++-- client/ui/uilogic.cpp | 36 +++++++++++-------- client/ui/uilogic.h | 2 +- 4 files changed, 26 insertions(+), 20 deletions(-) diff --git a/client/ui/pages_logic/AdvancedServerSettingsLogic.cpp b/client/ui/pages_logic/AdvancedServerSettingsLogic.cpp index 187af9ee5..182e8bedc 100644 --- a/client/ui/pages_logic/AdvancedServerSettingsLogic.cpp +++ b/client/ui/pages_logic/AdvancedServerSettingsLogic.cpp @@ -68,7 +68,7 @@ void AdvancedServerSettingsLogic::onPushButtonScanServerClicked() bool isServerCreated; auto containersCount = m_settings->containers(uiLogic()->m_selectedServerIndex).size(); - ErrorCode errorCode = uiLogic()->addAlreadyInstalledContainersGui(false, isServerCreated); + ErrorCode errorCode = uiLogic()->addAlreadyInstalledContainersGui(isServerCreated); if (errorCode != ErrorCode::NoError) { emit uiLogic()->showWarningMessage(tr("Error occurred while scanning the server.") + "\n" + tr("Error message: ") + errorString(errorCode) + "\n" + diff --git a/client/ui/pages_logic/ServerContainersLogic.cpp b/client/ui/pages_logic/ServerContainersLogic.cpp index 870a10dbc..9df750e19 100644 --- a/client/ui/pages_logic/ServerContainersLogic.cpp +++ b/client/ui/pages_logic/ServerContainersLogic.cpp @@ -4,9 +4,7 @@ #include -#include "protocols/CloakLogic.h" -#include "protocols/OpenVpnLogic.h" -#include "protocols/ShadowSocksLogic.h" +#include "protocols/PageProtocolLogicBase.h" #include "core/servercontroller.h" #include @@ -90,7 +88,7 @@ void ServerContainersLogic::onPushButtonContinueClicked(DockerContainer c, int p qApp->processEvents(); bool isServerCreated = false; - ErrorCode errorCode = uiLogic()->addAlreadyInstalledContainersGui(false, isServerCreated); + ErrorCode errorCode = uiLogic()->addAlreadyInstalledContainersGui(isServerCreated); if (errorCode == ErrorCode::NoError) { if (!uiLogic()->isContainerAlreadyAddedToGui(c)) { diff --git a/client/ui/uilogic.cpp b/client/ui/uilogic.cpp index 3dbd7b862..a257152cc 100644 --- a/client/ui/uilogic.cpp +++ b/client/ui/uilogic.cpp @@ -332,7 +332,7 @@ void UiLogic::installServer(QPair &container) }; bool isServerCreated = false; - ErrorCode errorCode = addAlreadyInstalledContainersGui(true, isServerCreated); + ErrorCode errorCode = addAlreadyInstalledContainersGui(isServerCreated); if (errorCode == ErrorCode::NoError) { if (!isContainerAlreadyAddedToGui(container.first)) { progressBarFunc.setTextFunc(QString("Installing %1").arg(ContainerProps::containerToString(container.first))); @@ -520,18 +520,26 @@ void UiLogic::registerPagesLogic() registerPageLogic(); } -ErrorCode UiLogic::addAlreadyInstalledContainersGui(bool createNewServer, bool &isServerCreated) +ErrorCode UiLogic::addAlreadyInstalledContainersGui(bool &isServerCreated) { isServerCreated = false; - ServerCredentials credentials; - if (createNewServer) { - credentials = m_installCredentials; - } else { - credentials = m_settings->serverCredentials(m_selectedServerIndex); + ServerCredentials installCredentials = m_installCredentials; + bool createNewServer = true; + int serverIndex; + + for (int i = 0; i < m_settings->serversCount(); i++) { + const ServerCredentials credentials = m_settings->serverCredentials(i); + if (m_installCredentials.hostName == credentials.hostName && m_installCredentials.port == credentials.port) { + createNewServer = false; + isServerCreated = true; + installCredentials = credentials; + serverIndex = i; + break; + } } QMap installedContainers; - ErrorCode errorCode = m_serverController->getAlreadyInstalledContainers(credentials, installedContainers); + ErrorCode errorCode = m_serverController->getAlreadyInstalledContainers(installCredentials, installedContainers); if (errorCode != ErrorCode::NoError) { return errorCode; } @@ -540,10 +548,10 @@ ErrorCode UiLogic::addAlreadyInstalledContainersGui(bool createNewServer, bool & QJsonObject server; QJsonArray containerConfigs; if (createNewServer) { - server.insert(config_key::hostName, credentials.hostName); - server.insert(config_key::userName, credentials.userName); - server.insert(config_key::password, credentials.password); - server.insert(config_key::port, credentials.port); + server.insert(config_key::hostName, installCredentials.hostName); + server.insert(config_key::userName, installCredentials.userName); + server.insert(config_key::password, installCredentials.password); + server.insert(config_key::port, installCredentials.port); server.insert(config_key::description, m_settings->nextAvailableServerName()); } @@ -556,8 +564,8 @@ ErrorCode UiLogic::addAlreadyInstalledContainersGui(bool createNewServer, bool & containerConfigs.append(container.value()); server.insert(config_key::containers, containerConfigs); } else { - m_settings->setContainerConfig(m_selectedServerIndex, container.key(), container.value()); - m_settings->setDefaultContainer(m_selectedServerIndex, installedContainers.firstKey()); + m_settings->setContainerConfig(serverIndex, container.key(), container.value()); + m_settings->setDefaultContainer(serverIndex, installedContainers.firstKey()); } } diff --git a/client/ui/uilogic.h b/client/ui/uilogic.h index 92035fe57..b7e6f3aed 100644 --- a/client/ui/uilogic.h +++ b/client/ui/uilogic.h @@ -117,7 +117,7 @@ public: Q_INVOKABLE void saveBinaryFile(const QString& desc, QString ext, const QString& data); Q_INVOKABLE void copyToClipboard(const QString& text); - Q_INVOKABLE amnezia::ErrorCode addAlreadyInstalledContainersGui(bool createNewServer, bool &isServerCreated); + Q_INVOKABLE amnezia::ErrorCode addAlreadyInstalledContainersGui(bool &isServerCreated); void shareTempFile(const QString &suggestedName, QString ext, const QString& data); From 7e717754a307fd9170c576db09c3acfca5620620 Mon Sep 17 00:00:00 2001 From: pokamest Date: Wed, 5 Apr 2023 01:43:42 +0100 Subject: [PATCH 4/4] getOpenFileName fix for Android --- client/ui/pages_logic/AppSettingsLogic.cpp | 6 +++--- client/ui/pages_logic/StartPageLogic.cpp | 2 +- client/utilities.cpp | 17 +++++++++++++++++ client/utilities.h | 8 ++++++++ 4 files changed, 29 insertions(+), 4 deletions(-) diff --git a/client/ui/pages_logic/AppSettingsLogic.cpp b/client/ui/pages_logic/AppSettingsLogic.cpp index e53580090..81e5c037a 100644 --- a/client/ui/pages_logic/AppSettingsLogic.cpp +++ b/client/ui/pages_logic/AppSettingsLogic.cpp @@ -8,6 +8,7 @@ #include #include #include +#include using namespace amnezia; using namespace PageEnumNS; @@ -82,8 +83,8 @@ void AppSettingsLogic::onPushButtonBackupAppConfigClicked() void AppSettingsLogic::onPushButtonRestoreAppConfigClicked() { - QString fileName = QFileDialog::getOpenFileName(Q_NULLPTR, tr("Open backup"), - QStandardPaths::writableLocation(QStandardPaths::DocumentsLocation), "*.backup"); + QString fileName = Utils::getOpenFileName(Q_NULLPTR, tr("Open backup"), + QStandardPaths::writableLocation(QStandardPaths::DocumentsLocation), "*.backup"); if (fileName.isEmpty()) return; @@ -98,6 +99,5 @@ void AppSettingsLogic::onPushButtonRestoreAppConfigClicked() } else { emit uiLogic()->showWarningMessage(tr("Can't import config, file is corrupted.")); } - } diff --git a/client/ui/pages_logic/StartPageLogic.cpp b/client/ui/pages_logic/StartPageLogic.cpp index 7eb67adfa..9fbb2efe2 100644 --- a/client/ui/pages_logic/StartPageLogic.cpp +++ b/client/ui/pages_logic/StartPageLogic.cpp @@ -167,7 +167,7 @@ void StartPageLogic::onPushButtonImport() void StartPageLogic::onPushButtonImportOpenFile() { - QString fileName = QFileDialog::getOpenFileName(Q_NULLPTR, tr("Open config file"), + QString fileName = Utils::getOpenFileName(Q_NULLPTR, tr("Open config file"), QStandardPaths::writableLocation(QStandardPaths::DocumentsLocation), "*.vpn *.ovpn *.conf"); if (fileName.isEmpty()) return; diff --git a/client/utilities.cpp b/client/utilities.cpp index e5d2fd52b..c661636a2 100644 --- a/client/utilities.cpp +++ b/client/utilities.cpp @@ -247,6 +247,23 @@ QString Utils::certUtilPath() #endif } +QString Utils::getOpenFileName(QWidget *parent, const QString &caption, const QString &dir, const QString &filter, QString *selectedFilter, QFileDialog::Options options) +{ + QString fileName = QFileDialog::getOpenFileName(parent, caption, dir, filter, selectedFilter, options); + +#ifdef Q_OS_ANDROID + // patch for files containing spaces etc + const QString sep {"raw%3A%2F"}; + if (fileName.startsWith("content://") && fileName.contains(sep)) { + QString contentUrl = fileName.split(sep).at(0); + QString rawUrl = fileName.split(sep).at(1); + rawUrl.replace(" ", "%20"); + fileName = contentUrl + sep + rawUrl; + } +#endif + return fileName; +} + #ifdef Q_OS_WIN // Inspired from http://stackoverflow.com/a/15281070/1529139 // and http://stackoverflow.com/q/40059902/1529139 diff --git a/client/utilities.h b/client/utilities.h index 932b9b27e..6020e5328 100644 --- a/client/utilities.h +++ b/client/utilities.h @@ -1,6 +1,7 @@ #ifndef UTILITIES_H #define UTILITIES_H +#include #include #include #include @@ -50,6 +51,13 @@ public: static QString wireguardExecPath(); static QString certUtilPath(); + static QString getOpenFileName(QWidget *parent = nullptr, + const QString &caption = QString(), + const QString &dir = QString(), + const QString &filter = QString(), + QString *selectedFilter = nullptr, + QFileDialog::Options options = QFileDialog::Options()); + #ifdef Q_OS_WIN static bool signalCtrl(DWORD dwProcessId, DWORD dwCtrlEvent);