From fcb75e837d655f27d9aaa604cb0b7bc130c31d97 Mon Sep 17 00:00:00 2001 From: lunardunno <126363523+lunardunno@users.noreply.github.com> Date: Wed, 19 Mar 2025 18:51:49 +0400 Subject: [PATCH 1/6] chore: correcting version (#1480) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Сorrecting version Correction: return to the correct version * Correction for SH --- CMakeLists.txt | 4 ++-- client/core/controllers/serverController.cpp | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 4692f28f..0ccae139 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -2,7 +2,7 @@ cmake_minimum_required(VERSION 3.25.0 FATAL_ERROR) set(PROJECT AmneziaVPN) -project(${PROJECT} VERSION 4.8.4.3 +project(${PROJECT} VERSION 4.8.4.4 DESCRIPTION "AmneziaVPN" HOMEPAGE_URL "https://amnezia.org/" ) @@ -11,7 +11,7 @@ string(TIMESTAMP CURRENT_DATE "%Y-%m-%d") set(RELEASE_DATE "${CURRENT_DATE}") set(APP_MAJOR_VERSION ${CMAKE_PROJECT_VERSION_MAJOR}.${CMAKE_PROJECT_VERSION_MINOR}.${CMAKE_PROJECT_VERSION_PATCH}) -set(APP_ANDROID_VERSION_CODE 2080) +set(APP_ANDROID_VERSION_CODE 2081) if(${CMAKE_SYSTEM_NAME} STREQUAL "Linux") set(MZ_PLATFORM_NAME "linux") diff --git a/client/core/controllers/serverController.cpp b/client/core/controllers/serverController.cpp index 05283195..1788297c 100644 --- a/client/core/controllers/serverController.cpp +++ b/client/core/controllers/serverController.cpp @@ -709,7 +709,7 @@ ErrorCode ServerController::isServerPortBusy(const ServerCredentials &credential QString transportProto = containerConfig.value(config_key::transport_proto).toString(defaultTransportProto); // TODO reimplement with netstat - QString script = QString("which lsof &>/dev/null || true && sudo lsof -i -P -n 2>/dev/null | grep -E ':%1 ").arg(port); + QString script = QString("which lsof > /dev/null 2>&1 || true && sudo lsof -i -P -n 2>/dev/null | grep -E ':%1 ").arg(port); for (auto &port : fixedPorts) { script = script.append("|:%1").arg(port); } From 00f314039d93c0187653bd74ca883261d5b8573e Mon Sep 17 00:00:00 2001 From: lunardunno <126363523+lunardunno@users.noreply.github.com> Date: Thu, 20 Mar 2025 07:24:37 +0400 Subject: [PATCH 2/6] Patch for user checking. (#1481) * Direct use of the $HOME variable. * Sudo check witch variable $HOME. Direct use of the $HOME variable. * Changing for Error 208 Changing description and title for error 208 * Revert "Changing for Error 208" This reverts commit f45624c023474a7b8b5e6919f83c67fb122716a8. * Changing for Error 207 Changing description and title for Error 207 --- client/core/controllers/serverController.cpp | 2 +- client/core/defs.h | 2 +- client/core/errorstrings.cpp | 2 +- client/server_scripts/check_user_in_sudo.sh | 2 +- client/server_scripts/prepare_host.sh | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/client/core/controllers/serverController.cpp b/client/core/controllers/serverController.cpp index 1788297c..d8c94f4d 100644 --- a/client/core/controllers/serverController.cpp +++ b/client/core/controllers/serverController.cpp @@ -771,7 +771,7 @@ ErrorCode ServerController::isUserInSudo(const ServerCredentials &credentials, D ErrorCode error = runScript(credentials, replaceVars(scriptData, genVarsForScript(credentials)), cbReadStdOut, cbReadStdErr); if (credentials.userName != "root" && stdOut.contains("sudo:") && !stdOut.contains("uname:") && stdOut.contains("not found")) - return ErrorCode::SudoPackageIsNotPreinstalled; + return ErrorCode::ServerSudoPackageIsNotPreinstalled; if (credentials.userName != "root" && !stdOut.contains("sudo") && !stdOut.contains("wheel")) return ErrorCode::ServerUserNotInSudo; if (stdOut.contains("can't cd to") || stdOut.contains("Permission denied") || stdOut.contains("No such file or directory")) diff --git a/client/core/defs.h b/client/core/defs.h index e073d030..2e683314 100644 --- a/client/core/defs.h +++ b/client/core/defs.h @@ -54,7 +54,7 @@ namespace amnezia ServerCancelInstallation = 204, ServerUserNotInSudo = 205, ServerPacketManagerError = 206, - SudoPackageIsNotPreinstalled = 207, + ServerSudoPackageIsNotPreinstalled = 207, ServerUserDirectoryNotAccessible = 208, ServerUserNotAllowedInSudoers = 209, ServerUserPasswordRequired = 210, diff --git a/client/core/errorstrings.cpp b/client/core/errorstrings.cpp index a3d54601..9dcd8065 100644 --- a/client/core/errorstrings.cpp +++ b/client/core/errorstrings.cpp @@ -22,7 +22,7 @@ QString errorString(ErrorCode code) { case(ErrorCode::ServerCancelInstallation): errorMessage = QObject::tr("Installation canceled by user"); break; case(ErrorCode::ServerUserNotInSudo): errorMessage = QObject::tr("The user is not a member of the sudo group"); break; case(ErrorCode::ServerPacketManagerError): errorMessage = QObject::tr("Server error: Package manager error"); break; - case(ErrorCode::SudoPackageIsNotPreinstalled): errorMessage = QObject::tr("The sudo package is not pre-installed"); break; + case(ErrorCode::ServerSudoPackageIsNotPreinstalled): errorMessage = QObject::tr("The sudo package is not pre-installed on the server"); break; case(ErrorCode::ServerUserDirectoryNotAccessible): errorMessage = QObject::tr("The server user's home directory is not accessible"); break; case(ErrorCode::ServerUserNotAllowedInSudoers): errorMessage = QObject::tr("Action not allowed in sudoers"); break; case(ErrorCode::ServerUserPasswordRequired): errorMessage = QObject::tr("The user's password is required"); break; diff --git a/client/server_scripts/check_user_in_sudo.sh b/client/server_scripts/check_user_in_sudo.sh index 974131dd..685e6a18 100644 --- a/client/server_scripts/check_user_in_sudo.sh +++ b/client/server_scripts/check_user_in_sudo.sh @@ -4,7 +4,7 @@ elif which yum > /dev/null 2>&1; then pm=$(which yum); opt="--version";\ elif which pacman > /dev/null 2>&1; then pm=$(which pacman); opt="--version";\ else pm="uname"; opt="-a";\ fi;\ -CUR_USER=$(whoami 2>/dev/null || echo ~ | sed 's/.*\///');\ +CUR_USER=$(whoami 2>/dev/null || echo $HOME | sed 's/.*\///');\ echo $LANG | grep -qE '^(en_US.UTF-8|C.UTF-8|C)$' || export LC_ALL=C;\ sudo -K;\ cd ~;\ diff --git a/client/server_scripts/prepare_host.sh b/client/server_scripts/prepare_host.sh index 22a50e31..1cc56a01 100644 --- a/client/server_scripts/prepare_host.sh +++ b/client/server_scripts/prepare_host.sh @@ -1,4 +1,4 @@ -CUR_USER=$(whoami 2>/dev/null || echo ~ | sed 's/.*\///');\ +CUR_USER=$(whoami 2>/dev/null || echo $HOME | sed 's/.*\///');\ sudo mkdir -p $DOCKERFILE_FOLDER;\ sudo chown $CUR_USER $DOCKERFILE_FOLDER;\ if ! sudo docker network ls | grep -q amnezia-dns-net; then sudo docker network create \ From 92689d084cfd82bc735e26d40c84de1b63810549 Mon Sep 17 00:00:00 2001 From: Nethius Date: Fri, 21 Mar 2025 10:25:44 +0700 Subject: [PATCH 3/6] feature/old api proxy (#1484) * feature: proxy old api requests through gateway * chore: bump version --- CMakeLists.txt | 4 +- .../controllers/api/apiConfigsController.cpp | 54 +++++++------------ 2 files changed, 20 insertions(+), 38 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 0ccae139..21cd78f8 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -2,7 +2,7 @@ cmake_minimum_required(VERSION 3.25.0 FATAL_ERROR) set(PROJECT AmneziaVPN) -project(${PROJECT} VERSION 4.8.4.4 +project(${PROJECT} VERSION 4.8.4.5 DESCRIPTION "AmneziaVPN" HOMEPAGE_URL "https://amnezia.org/" ) @@ -11,7 +11,7 @@ string(TIMESTAMP CURRENT_DATE "%Y-%m-%d") set(RELEASE_DATE "${CURRENT_DATE}") set(APP_MAJOR_VERSION ${CMAKE_PROJECT_VERSION_MAJOR}.${CMAKE_PROJECT_VERSION_MINOR}.${CMAKE_PROJECT_VERSION_PATCH}) -set(APP_ANDROID_VERSION_CODE 2081) +set(APP_ANDROID_VERSION_CODE 2082) if(${CMAKE_SYSTEM_NAME} STREQUAL "Linux") set(MZ_PLATFORM_NAME "linux") diff --git a/client/ui/controllers/api/apiConfigsController.cpp b/client/ui/controllers/api/apiConfigsController.cpp index b8696201..00e6ae3d 100644 --- a/client/ui/controllers/api/apiConfigsController.cpp +++ b/client/ui/controllers/api/apiConfigsController.cpp @@ -19,7 +19,7 @@ namespace constexpr char cloak[] = "cloak"; constexpr char awg[] = "awg"; - constexpr char apiEdnpoint[] = "api_endpoint"; + constexpr char apiEndpoint[] = "api_endpoint"; constexpr char accessToken[] = "api_key"; constexpr char certificate[] = "certificate"; constexpr char publicKey[] = "public_key"; @@ -251,7 +251,6 @@ bool ApiConfigsController::updateServiceFromGateway(const int serverIndex, const newServerConfig.insert(configKey::apiConfig, newApiConfig); newServerConfig.insert(configKey::authData, authData); - // newServerConfig.insert( m_serversModel->editServer(newServerConfig, serverIndex); if (reloadServiceConfig) { @@ -270,54 +269,37 @@ bool ApiConfigsController::updateServiceFromGateway(const int serverIndex, const bool ApiConfigsController::updateServiceFromTelegram(const int serverIndex) { - auto serverConfig = m_serversModel->getServerConfig(serverIndex); - auto installationUuid = m_settings->getInstallationUuid(true); - #ifdef Q_OS_IOS IosController::Instance()->requestInetAccess(); QThread::msleep(10); #endif - if (serverConfig.value(config_key::configVersion).toInt()) { - QNetworkRequest request; - request.setTransferTimeout(apiDefs::requestTimeoutMsecs); - request.setHeader(QNetworkRequest::ContentTypeHeader, "application/json"); - request.setRawHeader("Authorization", "Api-Key " + serverConfig.value(configKey::accessToken).toString().toUtf8()); - QString endpoint = serverConfig.value(configKey::apiEdnpoint).toString(); - request.setUrl(endpoint); + GatewayController gatewayController(m_settings->getGatewayEndpoint(), m_settings->isDevGatewayEnv(), apiDefs::requestTimeoutMsecs); - QString protocol = serverConfig.value(configKey::protocol).toString(); + auto serverConfig = m_serversModel->getServerConfig(serverIndex); + auto installationUuid = m_settings->getInstallationUuid(true); - ApiPayloadData apiPayloadData = generateApiPayloadData(protocol); + QString serviceProtocol = serverConfig.value(configKey::protocol).toString(); + ApiPayloadData apiPayloadData = generateApiPayloadData(serviceProtocol); - QJsonObject apiPayload = fillApiPayload(protocol, apiPayloadData); - apiPayload[configKey::uuid] = installationUuid; + QJsonObject apiPayload = fillApiPayload(serviceProtocol, apiPayloadData); + apiPayload[configKey::uuid] = installationUuid; + apiPayload[configKey::accessToken] = serverConfig.value(configKey::accessToken).toString(); + apiPayload[configKey::apiEndpoint] = serverConfig.value(configKey::apiEndpoint).toString(); - QByteArray requestBody = QJsonDocument(apiPayload).toJson(); + QByteArray responseBody; + ErrorCode errorCode = gatewayController.post(QString("%1v1/proxy_config"), apiPayload, responseBody); - QNetworkReply *reply = amnApp->networkManager()->post(request, requestBody); + if (errorCode == ErrorCode::NoError) { + fillServerConfig(serviceProtocol, apiPayloadData, responseBody, serverConfig); - QEventLoop wait; - connect(reply, &QNetworkReply::finished, &wait, &QEventLoop::quit); - - QList sslErrors; - connect(reply, &QNetworkReply::sslErrors, [this, &sslErrors](const QList &errors) { sslErrors = errors; }); - wait.exec(); - - auto errorCode = apiUtils::checkNetworkReplyErrors(sslErrors, reply); - if (errorCode != ErrorCode::NoError) { - reply->deleteLater(); - emit errorOccurred(errorCode); - return false; - } - - auto apiResponseBody = reply->readAll(); - reply->deleteLater(); - fillServerConfig(protocol, apiPayloadData, apiResponseBody, serverConfig); m_serversModel->editServer(serverConfig, serverIndex); emit updateServerFromApiFinished(); + return true; + } else { + emit errorOccurred(errorCode); + return false; } - return true; } bool ApiConfigsController::deactivateDevice() From 2a6e6a1e2494b8d0a94b25a72fe15d1057b81b23 Mon Sep 17 00:00:00 2001 From: Nethius Date: Fri, 21 Mar 2025 14:12:56 +0700 Subject: [PATCH 4/6] chore: bump version (#1485) --- CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 21cd78f8..b1246970 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -2,7 +2,7 @@ cmake_minimum_required(VERSION 3.25.0 FATAL_ERROR) set(PROJECT AmneziaVPN) -project(${PROJECT} VERSION 4.8.4.5 +project(${PROJECT} VERSION 4.8.5.0 DESCRIPTION "AmneziaVPN" HOMEPAGE_URL "https://amnezia.org/" ) From 050066132b964a504522c9bbf472ca7f121186b9 Mon Sep 17 00:00:00 2001 From: Anton Sosnin Date: Mon, 24 Mar 2025 09:35:22 +0200 Subject: [PATCH 5/6] Fix iOS initial translation loading (#1477) --- client/core/controllers/coreController.cpp | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/client/core/controllers/coreController.cpp b/client/core/controllers/coreController.cpp index 82232c99..d8f199e9 100644 --- a/client/core/controllers/coreController.cpp +++ b/client/core/controllers/coreController.cpp @@ -1,5 +1,6 @@ #include "coreController.h" +#include #include #if defined(Q_OS_ANDROID) @@ -238,7 +239,23 @@ void CoreController::updateTranslator(const QLocale &locale) QCoreApplication::removeTranslator(m_translator.get()); } - QString strFileName = QString(":/translations/amneziavpn") + QLatin1String("_") + locale.name() + ".qm"; + QStringList availableTranslations; + QDirIterator it(":/translations", QStringList("amneziavpn_*.qm"), QDir::Files); + while (it.hasNext()) { + availableTranslations << it.next(); + } + + // This code allow to load translation for the language only, without country code + const QString lang = locale.name().split("_").first(); + const QString translationFilePrefix = QString(":/translations/amneziavpn_") + lang; + QString strFileName = QString(":/translations/amneziavpn_%1.qm").arg(locale.name()); + for (const QString &translation : availableTranslations) { + if (translation.contains(translationFilePrefix)) { + strFileName = translation; + break; + } + } + if (m_translator->load(strFileName)) { if (QCoreApplication::installTranslator(m_translator.get())) { m_settings->setAppLanguage(locale); From f1b045f8a89f050e915368cedc01aea73b5a0fb6 Mon Sep 17 00:00:00 2001 From: Nethius Date: Sun, 30 Mar 2025 12:53:26 +0700 Subject: [PATCH 6/6] fixed selecting the default button on PageSetupWizardEasy (#1502) --- client/ui/qml/Pages2/PageSetupWizardEasy.qml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/ui/qml/Pages2/PageSetupWizardEasy.qml b/client/ui/qml/Pages2/PageSetupWizardEasy.qml index 353eeb32..ae04f635 100644 --- a/client/ui/qml/Pages2/PageSetupWizardEasy.qml +++ b/client/ui/qml/Pages2/PageSetupWizardEasy.qml @@ -78,7 +78,7 @@ PageType { height: containers.contentItem.height spacing: 16 - currentIndex: 1 + currentIndex: 0 clip: true interactive: false model: proxyContainersModel