mirror of
https://github.com/amnezia-vpn/amnezia-client.git
synced 2026-06-24 02:00:24 +07:00
Compare commits
3 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 7c95458aae | |||
| 8c72dd1072 | |||
| 2990508fcf |
@@ -23,9 +23,6 @@ jobs:
|
|||||||
- 'recipes/**'
|
- 'recipes/**'
|
||||||
- 'conanfile.py'
|
- 'conanfile.py'
|
||||||
- '.github/workflows/deploy.yml'
|
- '.github/workflows/deploy.yml'
|
||||||
- 'cmake/conan_provider.cmake'
|
|
||||||
- 'cmake/platform_settings.cmake'
|
|
||||||
- 'cmake/recipes_bootstrap.cmake'
|
|
||||||
|
|
||||||
Bake-Prebuilts-Linux:
|
Bake-Prebuilts-Linux:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
|
|||||||
+6
-4
@@ -4,7 +4,9 @@ set(CMAKE_CXX_STANDARD 17)
|
|||||||
set(CMAKE_CXX_STANDARD_REQUIRED ON)
|
set(CMAKE_CXX_STANDARD_REQUIRED ON)
|
||||||
|
|
||||||
set(PROJECT AmneziaVPN)
|
set(PROJECT AmneziaVPN)
|
||||||
set(AMNEZIAVPN_VERSION 4.9.0.2)
|
if(NOT AMNEZIAVPN_VERSION)
|
||||||
|
set(AMNEZIAVPN_VERSION 4.9.0.1 CACHE STRING "Client app version")
|
||||||
|
endif()
|
||||||
|
|
||||||
set(QT_CREATOR_SKIP_PACKAGE_MANAGER_SETUP ON CACHE BOOL "" FORCE)
|
set(QT_CREATOR_SKIP_PACKAGE_MANAGER_SETUP ON CACHE BOOL "" FORCE)
|
||||||
set(CMAKE_PROJECT_TOP_LEVEL_INCLUDES
|
set(CMAKE_PROJECT_TOP_LEVEL_INCLUDES
|
||||||
@@ -18,9 +20,9 @@ project(${PROJECT} VERSION ${AMNEZIAVPN_VERSION}
|
|||||||
HOMEPAGE_URL "https://amnezia.org/"
|
HOMEPAGE_URL "https://amnezia.org/"
|
||||||
)
|
)
|
||||||
|
|
||||||
# trigger conan to kick off `conan install` globally
|
|
||||||
find_package(OpenSSL REQUIRED)
|
|
||||||
if (PREBUILTS_ONLY)
|
if (PREBUILTS_ONLY)
|
||||||
|
# trigger conan to kick off `conan install`
|
||||||
|
find_package(OpenSSL REQUIRED)
|
||||||
return()
|
return()
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
@@ -28,7 +30,7 @@ string(TIMESTAMP CURRENT_DATE "%Y-%m-%d")
|
|||||||
set(RELEASE_DATE "${CURRENT_DATE}")
|
set(RELEASE_DATE "${CURRENT_DATE}")
|
||||||
|
|
||||||
set(APP_MAJOR_VERSION ${CMAKE_PROJECT_VERSION_MAJOR}.${CMAKE_PROJECT_VERSION_MINOR}.${CMAKE_PROJECT_VERSION_PATCH})
|
set(APP_MAJOR_VERSION ${CMAKE_PROJECT_VERSION_MAJOR}.${CMAKE_PROJECT_VERSION_MINOR}.${CMAKE_PROJECT_VERSION_PATCH})
|
||||||
set(APP_ANDROID_VERSION_CODE 2123)
|
set(APP_ANDROID_VERSION_CODE 2122)
|
||||||
|
|
||||||
if(${CMAKE_SYSTEM_NAME} STREQUAL "Linux")
|
if(${CMAKE_SYSTEM_NAME} STREQUAL "Linux")
|
||||||
set(MZ_PLATFORM_NAME "linux")
|
set(MZ_PLATFORM_NAME "linux")
|
||||||
|
|||||||
+35
-35
@@ -1,6 +1,8 @@
|
|||||||
cmake_minimum_required(VERSION 3.25.0 FATAL_ERROR)
|
cmake_minimum_required(VERSION 3.25.0 FATAL_ERROR)
|
||||||
|
|
||||||
set(PROJECT AmneziaVPN)
|
include(${CMAKE_CURRENT_LIST_DIR}/cmake/clientBrandingDefaults.cmake)
|
||||||
|
|
||||||
|
set(PROJECT ${CLIENT_TARGET_NAME})
|
||||||
project(${PROJECT})
|
project(${PROJECT})
|
||||||
|
|
||||||
set_property(GLOBAL PROPERTY USE_FOLDERS ON)
|
set_property(GLOBAL PROPERTY USE_FOLDERS ON)
|
||||||
@@ -56,6 +58,9 @@ qt_add_executable(${PROJECT} MANUAL_FINALIZATION)
|
|||||||
target_include_directories(${PROJECT} PUBLIC
|
target_include_directories(${PROJECT} PUBLIC
|
||||||
$<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}>
|
$<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}>
|
||||||
)
|
)
|
||||||
|
target_compile_definitions(${PROJECT} PRIVATE
|
||||||
|
CLIENT_KEYCHAIN_NAME_STR=\"${CLIENT_KEYCHAIN_NAME}\"
|
||||||
|
)
|
||||||
|
|
||||||
if(WIN32 OR (APPLE AND NOT IOS AND NOT MACOS_NE) OR (LINUX AND NOT ANDROID))
|
if(WIN32 OR (APPLE AND NOT IOS AND NOT MACOS_NE) OR (LINUX AND NOT ANDROID))
|
||||||
qt_add_repc_replicas(${PROJECT} ${CMAKE_CURRENT_LIST_DIR}/../ipc/ipc_interface.rep)
|
qt_add_repc_replicas(${PROJECT} ${CMAKE_CURRENT_LIST_DIR}/../ipc/ipc_interface.rep)
|
||||||
@@ -66,21 +71,26 @@ qt6_add_resources(QRC ${QRC}
|
|||||||
${CMAKE_CURRENT_LIST_DIR}/images/images.qrc
|
${CMAKE_CURRENT_LIST_DIR}/images/images.qrc
|
||||||
${CMAKE_CURRENT_LIST_DIR}/images/flagKit.qrc
|
${CMAKE_CURRENT_LIST_DIR}/images/flagKit.qrc
|
||||||
${CMAKE_CURRENT_LIST_DIR}/client_scripts/clientScripts.qrc
|
${CMAKE_CURRENT_LIST_DIR}/client_scripts/clientScripts.qrc
|
||||||
${CMAKE_CURRENT_LIST_DIR}/ui/qml/qml.qrc
|
${CLIENT_QML_QRC_FILE}
|
||||||
${CMAKE_CURRENT_LIST_DIR}/server_scripts/serverScripts.qrc
|
${CMAKE_CURRENT_LIST_DIR}/server_scripts/serverScripts.qrc
|
||||||
|
${CLIENT_EXTRA_QRC}
|
||||||
)
|
)
|
||||||
|
|
||||||
# -- i18n begin
|
# -- i18n begin
|
||||||
set(AMNEZIAVPN_TS_FILES
|
if(CLIENT_TS_FILES)
|
||||||
${CMAKE_CURRENT_LIST_DIR}/translations/amneziavpn_ru_RU.ts
|
set(AMNEZIAVPN_TS_FILES ${CLIENT_TS_FILES})
|
||||||
${CMAKE_CURRENT_LIST_DIR}/translations/amneziavpn_zh_CN.ts
|
else()
|
||||||
${CMAKE_CURRENT_LIST_DIR}/translations/amneziavpn_fa_IR.ts
|
set(AMNEZIAVPN_TS_FILES
|
||||||
${CMAKE_CURRENT_LIST_DIR}/translations/amneziavpn_ar_EG.ts
|
${CMAKE_CURRENT_LIST_DIR}/translations/${CLIENT_TS_PREFIX}_ru_RU.ts
|
||||||
${CMAKE_CURRENT_LIST_DIR}/translations/amneziavpn_my_MM.ts
|
${CMAKE_CURRENT_LIST_DIR}/translations/${CLIENT_TS_PREFIX}_zh_CN.ts
|
||||||
${CMAKE_CURRENT_LIST_DIR}/translations/amneziavpn_uk_UA.ts
|
${CMAKE_CURRENT_LIST_DIR}/translations/${CLIENT_TS_PREFIX}_fa_IR.ts
|
||||||
${CMAKE_CURRENT_LIST_DIR}/translations/amneziavpn_ur_PK.ts
|
${CMAKE_CURRENT_LIST_DIR}/translations/${CLIENT_TS_PREFIX}_ar_EG.ts
|
||||||
${CMAKE_CURRENT_LIST_DIR}/translations/amneziavpn_hi_IN.ts
|
${CMAKE_CURRENT_LIST_DIR}/translations/${CLIENT_TS_PREFIX}_my_MM.ts
|
||||||
)
|
${CMAKE_CURRENT_LIST_DIR}/translations/${CLIENT_TS_PREFIX}_uk_UA.ts
|
||||||
|
${CMAKE_CURRENT_LIST_DIR}/translations/${CLIENT_TS_PREFIX}_ur_PK.ts
|
||||||
|
${CMAKE_CURRENT_LIST_DIR}/translations/${CLIENT_TS_PREFIX}_hi_IN.ts
|
||||||
|
)
|
||||||
|
endif()
|
||||||
|
|
||||||
qt6_add_translations(${PROJECT}
|
qt6_add_translations(${PROJECT}
|
||||||
TS_FILES ${AMNEZIAVPN_TS_FILES}
|
TS_FILES ${AMNEZIAVPN_TS_FILES}
|
||||||
@@ -121,6 +131,17 @@ include_directories(mozilla/shared)
|
|||||||
include_directories(mozilla/models)
|
include_directories(mozilla/models)
|
||||||
|
|
||||||
configure_file(${CMAKE_CURRENT_LIST_DIR}/../version.h.in ${CMAKE_CURRENT_BINARY_DIR}/version.h)
|
configure_file(${CMAKE_CURRENT_LIST_DIR}/../version.h.in ${CMAKE_CURRENT_BINARY_DIR}/version.h)
|
||||||
|
file(MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/core/utils)
|
||||||
|
configure_file(
|
||||||
|
${CMAKE_CURRENT_LIST_DIR}/core/utils/appUiConfig.h.in
|
||||||
|
${CMAKE_CURRENT_BINARY_DIR}/core/utils/appUiConfig.h
|
||||||
|
@ONLY
|
||||||
|
)
|
||||||
|
configure_file(
|
||||||
|
${CMAKE_CURRENT_LIST_DIR}/core/utils/swiftInteropConfig.h.in
|
||||||
|
${CMAKE_CURRENT_BINARY_DIR}/core/utils/swiftInteropConfig.h
|
||||||
|
@ONLY
|
||||||
|
)
|
||||||
|
|
||||||
if(CMAKE_BUILD_TYPE STREQUAL "Debug")
|
if(CMAKE_BUILD_TYPE STREQUAL "Debug")
|
||||||
target_compile_definitions(${PROJECT} PRIVATE "MZ_DEBUG")
|
target_compile_definitions(${PROJECT} PRIVATE "MZ_DEBUG")
|
||||||
@@ -212,32 +233,11 @@ endif()
|
|||||||
|
|
||||||
install(TARGETS ${PROJECT}
|
install(TARGETS ${PROJECT}
|
||||||
DESTINATION ${CMAKE_INSTALL_BINDIR}
|
DESTINATION ${CMAKE_INSTALL_BINDIR}
|
||||||
RUNTIME_DEPENDENCY_SET client_deps
|
|
||||||
COMPONENT AmneziaVPN
|
COMPONENT AmneziaVPN
|
||||||
)
|
)
|
||||||
|
install(FILES $<TARGET_RUNTIME_DLLS:${PROJECT}>
|
||||||
if(APPLE)
|
DESTINATION ${CMAKE_INSTALL_BINDIR}
|
||||||
set(RUNTIME_DEPS_DIR ${CMAKE_INSTALL_BINDIR}/AmneziaVPN.app/Contents/Frameworks)
|
|
||||||
else()
|
|
||||||
set(RUNTIME_DEPS_DIR ${CMAKE_INSTALL_BINDIR})
|
|
||||||
endif()
|
|
||||||
|
|
||||||
install(RUNTIME_DEPENDENCY_SET client_deps
|
|
||||||
PRE_EXCLUDE_REGEXES
|
|
||||||
[[api-ms-win-.*]]
|
|
||||||
[[ext-ms-.*]]
|
|
||||||
[[kernel32\.dll]]
|
|
||||||
[[hvsifiletrust\.dll]]
|
|
||||||
[[libc\.so\..*]] [[libgcc_s\.so\..*]] [[libm\.so\..*]] [[libstdc\+\+\.so\..*]]
|
|
||||||
[[.*\.framework]]
|
|
||||||
[[^[Qq]t.*]]
|
|
||||||
POST_EXCLUDE_REGEXES
|
|
||||||
[[^.*[\\/]system32[\\/].*\.dll$]]
|
|
||||||
[[^/lib.*]]
|
|
||||||
[[^/usr/lib.*]]
|
|
||||||
DIRECTORIES ${CONAN_RUNTIME_LIB_DIRS}
|
|
||||||
COMPONENT AmneziaVPN
|
COMPONENT AmneziaVPN
|
||||||
DESTINATION "${RUNTIME_DEPS_DIR}"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
set(deploy_tool_options "")
|
set(deploy_tool_options "")
|
||||||
|
|||||||
@@ -23,6 +23,7 @@
|
|||||||
#include "ui/controllers/qml/pageController.h"
|
#include "ui/controllers/qml/pageController.h"
|
||||||
#include "ui/models/installedAppsModel.h"
|
#include "ui/models/installedAppsModel.h"
|
||||||
#include "version.h"
|
#include "version.h"
|
||||||
|
#include "core/utils/appUiConfig.h"
|
||||||
|
|
||||||
#include "platforms/ios/QRCodeReaderBase.h"
|
#include "platforms/ios/QRCodeReaderBase.h"
|
||||||
|
|
||||||
@@ -98,7 +99,7 @@ void AmneziaApplication::init()
|
|||||||
{
|
{
|
||||||
m_engine = new QQmlApplicationEngine;
|
m_engine = new QQmlApplicationEngine;
|
||||||
|
|
||||||
const QUrl url(QStringLiteral("qrc:/ui/qml/main2.qml"));
|
const QUrl url(QStringLiteral(APP_QML_ENTRYPOINT));
|
||||||
QObject::connect(
|
QObject::connect(
|
||||||
m_engine, &QQmlApplicationEngine::objectCreated, this,
|
m_engine, &QQmlApplicationEngine::objectCreated, this,
|
||||||
[this, url](QObject *obj, const QUrl &objUrl) {
|
[this, url](QObject *obj, const QUrl &objUrl) {
|
||||||
@@ -138,7 +139,7 @@ void AmneziaApplication::init()
|
|||||||
|
|
||||||
m_coreController.reset(new CoreController(m_vpnConnection, m_settings, m_engine));
|
m_coreController.reset(new CoreController(m_vpnConnection, m_settings, m_engine));
|
||||||
|
|
||||||
m_engine->addImportPath("qrc:/ui/qml/Modules/");
|
m_engine->addImportPath(QStringLiteral(APP_QML_IMPORT_PATH));
|
||||||
|
|
||||||
if (m_parser.isSet(m_optImport)) {
|
if (m_parser.isSet(m_optImport)) {
|
||||||
const QString data = m_parser.value(m_optImport);
|
const QString data = m_parser.value(m_optImport);
|
||||||
@@ -224,7 +225,7 @@ void AmneziaApplication::loadFonts()
|
|||||||
{
|
{
|
||||||
QQuickStyle::setStyle("Basic");
|
QQuickStyle::setStyle("Basic");
|
||||||
|
|
||||||
QFontDatabase::addApplicationFont(":/fonts/pt-root-ui_vf.ttf");
|
QFontDatabase::addApplicationFont(QStringLiteral(APP_UI_FONT_RESOURCE));
|
||||||
}
|
}
|
||||||
|
|
||||||
bool AmneziaApplication::parseCommands()
|
bool AmneziaApplication::parseCommands()
|
||||||
@@ -251,7 +252,7 @@ bool AmneziaApplication::parseCommands()
|
|||||||
|
|
||||||
#if !defined(Q_OS_ANDROID) && !defined(Q_OS_IOS) && !defined(MACOS_NE)
|
#if !defined(Q_OS_ANDROID) && !defined(Q_OS_IOS) && !defined(MACOS_NE)
|
||||||
void AmneziaApplication::startLocalServer() {
|
void AmneziaApplication::startLocalServer() {
|
||||||
const QString serverName("AmneziaVPNInstance");
|
const QString serverName(APP_INSTANCE_NAME);
|
||||||
QLocalServer::removeServer(serverName);
|
QLocalServer::removeServer(serverName);
|
||||||
|
|
||||||
QLocalServer *server = new QLocalServer(this);
|
QLocalServer *server = new QLocalServer(this);
|
||||||
|
|||||||
@@ -0,0 +1,96 @@
|
|||||||
|
if(NOT CLIENT_TARGET_NAME)
|
||||||
|
set(CLIENT_TARGET_NAME "AmneziaVPN" CACHE STRING "Client executable target name")
|
||||||
|
endif()
|
||||||
|
if(NOT CLIENT_APPLICATION_NAME)
|
||||||
|
set(CLIENT_APPLICATION_NAME "AmneziaVPN" CACHE STRING "Application display and executable name")
|
||||||
|
endif()
|
||||||
|
if(NOT CLIENT_SERVICE_NAME)
|
||||||
|
set(CLIENT_SERVICE_NAME "AmneziaVPN-service" CACHE STRING "Service executable name")
|
||||||
|
endif()
|
||||||
|
if(NOT CLIENT_ORGANIZATION_NAME)
|
||||||
|
set(CLIENT_ORGANIZATION_NAME "AmneziaVPN.ORG" CACHE STRING "QSettings organization name")
|
||||||
|
endif()
|
||||||
|
if(NOT CLIENT_APP_INSTANCE_NAME)
|
||||||
|
set(CLIENT_APP_INSTANCE_NAME "AmneziaVPNInstance" CACHE STRING "Single-instance local server name")
|
||||||
|
endif()
|
||||||
|
if(NOT CLIENT_KEYCHAIN_NAME)
|
||||||
|
set(CLIENT_KEYCHAIN_NAME "${CLIENT_APPLICATION_NAME}-Keychain" CACHE STRING "QtKeychain service name used for encrypted settings keys")
|
||||||
|
endif()
|
||||||
|
if(NOT CLIENT_QML_ENTRYPOINT)
|
||||||
|
set(CLIENT_QML_ENTRYPOINT "qrc:/ui/qml/main2.qml" CACHE STRING "Main QML entrypoint URL")
|
||||||
|
endif()
|
||||||
|
if(NOT CLIENT_QML_IMPORT_PATH)
|
||||||
|
set(CLIENT_QML_IMPORT_PATH "qrc:/ui/qml/Modules/" CACHE STRING "Additional QQmlEngine import path")
|
||||||
|
endif()
|
||||||
|
if(NOT CLIENT_QML_PAGES_PREFIX)
|
||||||
|
set(CLIENT_QML_PAGES_PREFIX "qrc:/ui/qml/Pages2/" CACHE STRING "PageController QML pages prefix")
|
||||||
|
endif()
|
||||||
|
if(NOT CLIENT_UI_FONT_RESOURCE)
|
||||||
|
set(CLIENT_UI_FONT_RESOURCE ":/fonts/pt-root-ui_vf.ttf" CACHE STRING "UI font resource path")
|
||||||
|
endif()
|
||||||
|
if(NOT CLIENT_SWIFT_MODULE_NAME)
|
||||||
|
set(CLIENT_SWIFT_MODULE_NAME "${CLIENT_APPLICATION_NAME}" CACHE STRING "Swift module name for Objective-C interop header")
|
||||||
|
endif()
|
||||||
|
if(NOT CLIENT_SWIFT_OBJC_HEADER_NAME)
|
||||||
|
set(CLIENT_SWIFT_OBJC_HEADER_NAME "${CLIENT_SWIFT_MODULE_NAME}-Swift.h" CACHE STRING "Generated Swift Objective-C header name")
|
||||||
|
endif()
|
||||||
|
if(NOT CLIENT_NETWORK_EXTENSION_NAME)
|
||||||
|
set(CLIENT_NETWORK_EXTENSION_NAME "${CLIENT_APPLICATION_NAME}NetworkExtension" CACHE STRING "Display name for Apple network extension targets")
|
||||||
|
endif()
|
||||||
|
if(NOT CLIENT_IOS_NE_TARGET_NAME)
|
||||||
|
set(CLIENT_IOS_NE_TARGET_NAME "networkextension" CACHE STRING "iOS network extension build target name")
|
||||||
|
endif()
|
||||||
|
if(NOT CLIENT_MACOS_NE_TARGET_NAME)
|
||||||
|
set(CLIENT_MACOS_NE_TARGET_NAME "${CLIENT_NETWORK_EXTENSION_NAME}" CACHE STRING "macOS network extension build target name")
|
||||||
|
endif()
|
||||||
|
if(NOT CLIENT_IOS_NE_ENTITLEMENTS_FILE)
|
||||||
|
set(CLIENT_IOS_NE_ENTITLEMENTS_FILE "AmneziaVPNNetworkExtension.entitlements" CACHE STRING "iOS network extension entitlements filename")
|
||||||
|
endif()
|
||||||
|
if(NOT CLIENT_MACOS_NE_ENTITLEMENTS_FILE)
|
||||||
|
set(CLIENT_MACOS_NE_ENTITLEMENTS_FILE "AmneziaVPNNetworkExtension.entitlements" CACHE STRING "macOS network extension entitlements filename")
|
||||||
|
endif()
|
||||||
|
if(NOT CLIENT_IOS_LAUNCHSCREEN_FILE)
|
||||||
|
set(CLIENT_IOS_LAUNCHSCREEN_FILE "AmneziaVPNLaunchScreen.storyboard" CACHE STRING "iOS launch screen storyboard filename")
|
||||||
|
endif()
|
||||||
|
if(NOT CLIENT_IOS_APP_ENTITLEMENTS_PATH)
|
||||||
|
set(CLIENT_IOS_APP_ENTITLEMENTS_PATH "${CMAKE_CURRENT_LIST_DIR}/../ios/app/main.entitlements" CACHE FILEPATH "iOS app entitlements file path")
|
||||||
|
endif()
|
||||||
|
if(NOT CLIENT_MACOS_APP_ENTITLEMENTS_PATH)
|
||||||
|
set(CLIENT_MACOS_APP_ENTITLEMENTS_PATH "${CMAKE_CURRENT_LIST_DIR}/../macos/app/app.entitlements" CACHE FILEPATH "macOS app entitlements file path")
|
||||||
|
endif()
|
||||||
|
if(NOT CLIENT_IOS_LAUNCHSCREEN_PATH)
|
||||||
|
set(CLIENT_IOS_LAUNCHSCREEN_PATH "${CMAKE_CURRENT_LIST_DIR}/../ios/app/${CLIENT_IOS_LAUNCHSCREEN_FILE}" CACHE FILEPATH "iOS launch screen storyboard path")
|
||||||
|
endif()
|
||||||
|
if(NOT CLIENT_IOS_MEDIA_ASSETS_PATH)
|
||||||
|
set(CLIENT_IOS_MEDIA_ASSETS_PATH "${CMAKE_CURRENT_LIST_DIR}/../ios/app/Media.xcassets" CACHE FILEPATH "iOS app Media.xcassets path")
|
||||||
|
endif()
|
||||||
|
if(NOT CLIENT_IOS_NE_ENTITLEMENTS_PATH)
|
||||||
|
set(CLIENT_IOS_NE_ENTITLEMENTS_PATH "${CMAKE_CURRENT_LIST_DIR}/../ios/networkextension/${CLIENT_IOS_NE_ENTITLEMENTS_FILE}" CACHE FILEPATH "iOS network extension entitlements file path")
|
||||||
|
endif()
|
||||||
|
if(NOT CLIENT_MACOS_NE_ENTITLEMENTS_PATH)
|
||||||
|
set(CLIENT_MACOS_NE_ENTITLEMENTS_PATH "${CMAKE_CURRENT_LIST_DIR}/../macos/networkextension/${CLIENT_MACOS_NE_ENTITLEMENTS_FILE}" CACHE FILEPATH "macOS network extension entitlements file path")
|
||||||
|
endif()
|
||||||
|
if(NOT CLIENT_QML_QRC_FILE)
|
||||||
|
set(CLIENT_QML_QRC_FILE "${CMAKE_CURRENT_LIST_DIR}/../ui/qml/qml.qrc" CACHE FILEPATH "QML resources manifest")
|
||||||
|
endif()
|
||||||
|
if(NOT CLIENT_EXTRA_QRC)
|
||||||
|
set(CLIENT_EXTRA_QRC "" CACHE STRING "Optional semicolon-separated extra QRC files")
|
||||||
|
endif()
|
||||||
|
if(NOT CLIENT_TS_PREFIX)
|
||||||
|
set(CLIENT_TS_PREFIX "amneziavpn" CACHE STRING "Translation filename prefix")
|
||||||
|
endif()
|
||||||
|
if(NOT CLIENT_TS_FILES)
|
||||||
|
set(CLIENT_TS_FILES "" CACHE STRING "Optional semicolon-separated absolute TS file paths")
|
||||||
|
endif()
|
||||||
|
if(NOT CLIENT_IOS_PROVISIONING_PROFILE_SPECIFIER)
|
||||||
|
set(CLIENT_IOS_PROVISIONING_PROFILE_SPECIFIER "distr ios.org.amnezia.AmneziaVPN" CACHE STRING "iOS app provisioning profile specifier for release")
|
||||||
|
endif()
|
||||||
|
if(NOT CLIENT_IOS_PROVISIONING_PROFILE_SPECIFIER_DEBUG)
|
||||||
|
set(CLIENT_IOS_PROVISIONING_PROFILE_SPECIFIER_DEBUG "dev ios.org.amnezia.AmneziaVPN" CACHE STRING "iOS app provisioning profile specifier for debug")
|
||||||
|
endif()
|
||||||
|
if(NOT CLIENT_IOS_NE_PROVISIONING_PROFILE_SPECIFIER)
|
||||||
|
set(CLIENT_IOS_NE_PROVISIONING_PROFILE_SPECIFIER "distr ios.org.amnezia.AmneziaVPN" CACHE STRING "iOS network extension provisioning profile specifier for release")
|
||||||
|
endif()
|
||||||
|
if(NOT CLIENT_IOS_NE_PROVISIONING_PROFILE_SPECIFIER_DEBUG)
|
||||||
|
set(CLIENT_IOS_NE_PROVISIONING_PROFILE_SPECIFIER_DEBUG "dev ios.org.amnezia.AmneziaVPN" CACHE STRING "iOS network extension provisioning profile specifier for debug")
|
||||||
|
endif()
|
||||||
+15
-14
@@ -54,20 +54,21 @@ target_include_directories(${PROJECT} PRIVATE ${Qt6Gui_PRIVATE_INCLUDE_DIRS})
|
|||||||
|
|
||||||
|
|
||||||
set_target_properties(${PROJECT} PROPERTIES
|
set_target_properties(${PROJECT} PROPERTIES
|
||||||
|
XCODE_LINK_BUILD_PHASE_MODE KNOWN_LOCATION
|
||||||
MACOSX_BUNDLE_INFO_PLIST ${CMAKE_CURRENT_SOURCE_DIR}/ios/app/Info.plist.in
|
MACOSX_BUNDLE_INFO_PLIST ${CMAKE_CURRENT_SOURCE_DIR}/ios/app/Info.plist.in
|
||||||
MACOSX_BUNDLE_ICON_FILE "AppIcon"
|
MACOSX_BUNDLE_ICON_FILE "AppIcon"
|
||||||
MACOSX_BUNDLE_INFO_STRING "AmneziaVPN"
|
MACOSX_BUNDLE_INFO_STRING "${CLIENT_APPLICATION_NAME}"
|
||||||
MACOSX_BUNDLE_BUNDLE_NAME "AmneziaVPN"
|
MACOSX_BUNDLE_BUNDLE_NAME "${CLIENT_APPLICATION_NAME}"
|
||||||
MACOSX_BUNDLE_GUI_IDENTIFIER "${BUILD_IOS_APP_IDENTIFIER}"
|
MACOSX_BUNDLE_GUI_IDENTIFIER "${BUILD_IOS_APP_IDENTIFIER}"
|
||||||
MACOSX_BUNDLE_BUNDLE_VERSION "${CMAKE_PROJECT_VERSION_TWEAK}"
|
MACOSX_BUNDLE_BUNDLE_VERSION "${CMAKE_PROJECT_VERSION_TWEAK}"
|
||||||
MACOSX_BUNDLE_LONG_VERSION_STRING "${APPLE_PROJECT_VERSION}-${CMAKE_PROJECT_VERSION_TWEAK}"
|
MACOSX_BUNDLE_LONG_VERSION_STRING "${APPLE_PROJECT_VERSION}-${CMAKE_PROJECT_VERSION_TWEAK}"
|
||||||
MACOSX_BUNDLE_SHORT_VERSION_STRING "${APPLE_PROJECT_VERSION}"
|
MACOSX_BUNDLE_SHORT_VERSION_STRING "${APPLE_PROJECT_VERSION}"
|
||||||
XCODE_ATTRIBUTE_PRODUCT_BUNDLE_IDENTIFIER "${BUILD_IOS_APP_IDENTIFIER}"
|
XCODE_ATTRIBUTE_PRODUCT_BUNDLE_IDENTIFIER "${BUILD_IOS_APP_IDENTIFIER}"
|
||||||
XCODE_ATTRIBUTE_CODE_SIGN_ENTITLEMENTS "${CMAKE_CURRENT_SOURCE_DIR}/ios/app/main.entitlements"
|
XCODE_ATTRIBUTE_CODE_SIGN_ENTITLEMENTS "${CLIENT_IOS_APP_ENTITLEMENTS_PATH}"
|
||||||
XCODE_ATTRIBUTE_MARKETING_VERSION "${APPLE_PROJECT_VERSION}"
|
XCODE_ATTRIBUTE_MARKETING_VERSION "${APPLE_PROJECT_VERSION}"
|
||||||
XCODE_ATTRIBUTE_CURRENT_PROJECT_VERSION "${CMAKE_PROJECT_VERSION_TWEAK}"
|
XCODE_ATTRIBUTE_CURRENT_PROJECT_VERSION "${CMAKE_PROJECT_VERSION_TWEAK}"
|
||||||
XCODE_ATTRIBUTE_PRODUCT_NAME "AmneziaVPN"
|
XCODE_ATTRIBUTE_PRODUCT_NAME "${CLIENT_APPLICATION_NAME}"
|
||||||
XCODE_ATTRIBUTE_BUNDLE_INFO_STRING "AmneziaVPN"
|
XCODE_ATTRIBUTE_BUNDLE_INFO_STRING "${CLIENT_APPLICATION_NAME}"
|
||||||
XCODE_GENERATE_SCHEME TRUE
|
XCODE_GENERATE_SCHEME TRUE
|
||||||
XCODE_ATTRIBUTE_ENABLE_BITCODE "NO"
|
XCODE_ATTRIBUTE_ENABLE_BITCODE "NO"
|
||||||
XCODE_ATTRIBUTE_ASSETCATALOG_COMPILER_APPICON_NAME "AppIcon"
|
XCODE_ATTRIBUTE_ASSETCATALOG_COMPILER_APPICON_NAME "AppIcon"
|
||||||
@@ -75,7 +76,7 @@ set_target_properties(${PROJECT} PROPERTIES
|
|||||||
XCODE_EMBED_FRAMEWORKS_CODE_SIGN_ON_COPY ON
|
XCODE_EMBED_FRAMEWORKS_CODE_SIGN_ON_COPY ON
|
||||||
XCODE_LINK_BUILD_PHASE_MODE KNOWN_LOCATION
|
XCODE_LINK_BUILD_PHASE_MODE KNOWN_LOCATION
|
||||||
XCODE_ATTRIBUTE_LD_RUNPATH_SEARCH_PATHS "@executable_path/Frameworks"
|
XCODE_ATTRIBUTE_LD_RUNPATH_SEARCH_PATHS "@executable_path/Frameworks"
|
||||||
XCODE_EMBED_APP_EXTENSIONS networkextension
|
XCODE_EMBED_APP_EXTENSIONS ${CLIENT_IOS_NE_TARGET_NAME}
|
||||||
)
|
)
|
||||||
|
|
||||||
if(DEFINED DEPLOY)
|
if(DEFINED DEPLOY)
|
||||||
@@ -83,8 +84,8 @@ if(DEFINED DEPLOY)
|
|||||||
XCODE_ATTRIBUTE_CODE_SIGN_IDENTITY "Apple Distribution"
|
XCODE_ATTRIBUTE_CODE_SIGN_IDENTITY "Apple Distribution"
|
||||||
XCODE_ATTRIBUTE_CODE_SIGN_IDENTITY[variant=Debug] "Apple Development"
|
XCODE_ATTRIBUTE_CODE_SIGN_IDENTITY[variant=Debug] "Apple Development"
|
||||||
XCODE_ATTRIBUTE_CODE_SIGN_STYLE Manual
|
XCODE_ATTRIBUTE_CODE_SIGN_STYLE Manual
|
||||||
XCODE_ATTRIBUTE_PROVISIONING_PROFILE_SPECIFIER "distr ios.org.amnezia.AmneziaVPN"
|
XCODE_ATTRIBUTE_PROVISIONING_PROFILE_SPECIFIER "${CLIENT_IOS_PROVISIONING_PROFILE_SPECIFIER}"
|
||||||
XCODE_ATTRIBUTE_PROVISIONING_PROFILE_SPECIFIER[variant=Debug] "dev ios.org.amnezia.AmneziaVPN"
|
XCODE_ATTRIBUTE_PROVISIONING_PROFILE_SPECIFIER[variant=Debug] "${CLIENT_IOS_PROVISIONING_PROFILE_SPECIFIER_DEBUG}"
|
||||||
)
|
)
|
||||||
else()
|
else()
|
||||||
set_target_properties(${PROJECT} PROPERTIES
|
set_target_properties(${PROJECT} PROPERTIES
|
||||||
@@ -96,11 +97,11 @@ set_target_properties(${PROJECT} PROPERTIES
|
|||||||
XCODE_ATTRIBUTE_SWIFT_VERSION "5.0"
|
XCODE_ATTRIBUTE_SWIFT_VERSION "5.0"
|
||||||
XCODE_ATTRIBUTE_CLANG_ENABLE_MODULES "YES"
|
XCODE_ATTRIBUTE_CLANG_ENABLE_MODULES "YES"
|
||||||
XCODE_ATTRIBUTE_SWIFT_PRECOMPILE_BRIDGING_HEADER "NO"
|
XCODE_ATTRIBUTE_SWIFT_PRECOMPILE_BRIDGING_HEADER "NO"
|
||||||
XCODE_ATTRIBUTE_SWIFT_OBJC_INTERFACE_HEADER_NAME "AmneziaVPN-Swift.h"
|
XCODE_ATTRIBUTE_SWIFT_OBJC_INTERFACE_HEADER_NAME "${CLIENT_SWIFT_OBJC_HEADER_NAME}"
|
||||||
XCODE_ATTRIBUTE_SWIFT_OBJC_INTEROP_MODE "objcxx"
|
XCODE_ATTRIBUTE_SWIFT_OBJC_INTEROP_MODE "objcxx"
|
||||||
)
|
)
|
||||||
set_target_properties(${PROJECT} PROPERTIES
|
set_target_properties(${PROJECT} PROPERTIES
|
||||||
XCODE_ATTRIBUTE_DEVELOPMENT_TEAM "X7UJ388FXK"
|
XCODE_ATTRIBUTE_DEVELOPMENT_TEAM "${BUILD_VPN_DEVELOPMENT_TEAM}"
|
||||||
)
|
)
|
||||||
target_include_directories(${PROJECT} PRIVATE ${CMAKE_CURRENT_LIST_DIR})
|
target_include_directories(${PROJECT} PRIVATE ${CMAKE_CURRENT_LIST_DIR})
|
||||||
target_compile_options(${PROJECT} PRIVATE
|
target_compile_options(${PROJECT} PRIVATE
|
||||||
@@ -122,15 +123,15 @@ target_sources(${PROJECT} PRIVATE
|
|||||||
)
|
)
|
||||||
|
|
||||||
target_sources(${PROJECT} PRIVATE
|
target_sources(${PROJECT} PRIVATE
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/ios/app/AmneziaVPNLaunchScreen.storyboard
|
${CLIENT_IOS_LAUNCHSCREEN_PATH}
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/ios/app/Media.xcassets
|
${CLIENT_IOS_MEDIA_ASSETS_PATH}
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/ios/app/PrivacyInfo.xcprivacy
|
${CMAKE_CURRENT_SOURCE_DIR}/ios/app/PrivacyInfo.xcprivacy
|
||||||
)
|
)
|
||||||
|
|
||||||
set_property(TARGET ${PROJECT} APPEND PROPERTY RESOURCE
|
set_property(TARGET ${PROJECT} APPEND PROPERTY RESOURCE
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/ios/app/AmneziaVPNLaunchScreen.storyboard
|
${CLIENT_IOS_LAUNCHSCREEN_PATH}
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/ios/app/PrivacyInfo.xcprivacy
|
${CMAKE_CURRENT_SOURCE_DIR}/ios/app/PrivacyInfo.xcprivacy
|
||||||
)
|
)
|
||||||
|
|
||||||
add_subdirectory(ios/networkextension)
|
add_subdirectory(ios/networkextension)
|
||||||
add_dependencies(${PROJECT} networkextension)
|
add_dependencies(${PROJECT} ${CLIENT_IOS_NE_TARGET_NAME})
|
||||||
|
|||||||
+10
-10
@@ -67,17 +67,17 @@ set_target_properties(${PROJECT} PROPERTIES
|
|||||||
XCODE_LINK_BUILD_PHASE_MODE KNOWN_LOCATION
|
XCODE_LINK_BUILD_PHASE_MODE KNOWN_LOCATION
|
||||||
MACOSX_BUNDLE_INFO_PLIST ${CMAKE_CURRENT_SOURCE_DIR}/macos/app/Info.plist.in
|
MACOSX_BUNDLE_INFO_PLIST ${CMAKE_CURRENT_SOURCE_DIR}/macos/app/Info.plist.in
|
||||||
MACOSX_BUNDLE_ICON_FILE "AppIcon"
|
MACOSX_BUNDLE_ICON_FILE "AppIcon"
|
||||||
MACOSX_BUNDLE_INFO_STRING "AmneziaVPN"
|
MACOSX_BUNDLE_INFO_STRING "${CLIENT_APPLICATION_NAME}"
|
||||||
MACOSX_BUNDLE_BUNDLE_NAME "AmneziaVPN"
|
MACOSX_BUNDLE_BUNDLE_NAME "${CLIENT_APPLICATION_NAME}"
|
||||||
MACOSX_BUNDLE_BUNDLE_VERSION "${CMAKE_PROJECT_VERSION_TWEAK}"
|
MACOSX_BUNDLE_BUNDLE_VERSION "${CMAKE_PROJECT_VERSION_TWEAK}"
|
||||||
MACOSX_BUNDLE_LONG_VERSION_STRING "${APPLE_PROJECT_VERSION}-${CMAKE_PROJECT_VERSION_TWEAK}"
|
MACOSX_BUNDLE_LONG_VERSION_STRING "${APPLE_PROJECT_VERSION}-${CMAKE_PROJECT_VERSION_TWEAK}"
|
||||||
MACOSX_BUNDLE_SHORT_VERSION_STRING "${APPLE_PROJECT_VERSION}"
|
MACOSX_BUNDLE_SHORT_VERSION_STRING "${APPLE_PROJECT_VERSION}"
|
||||||
XCODE_ATTRIBUTE_PRODUCT_BUNDLE_IDENTIFIER "${BUILD_IOS_APP_IDENTIFIER}"
|
XCODE_ATTRIBUTE_PRODUCT_BUNDLE_IDENTIFIER "${BUILD_IOS_APP_IDENTIFIER}"
|
||||||
XCODE_ATTRIBUTE_CODE_SIGN_ENTITLEMENTS "${CMAKE_CURRENT_SOURCE_DIR}/macos/app/app.entitlements"
|
XCODE_ATTRIBUTE_CODE_SIGN_ENTITLEMENTS "${CLIENT_MACOS_APP_ENTITLEMENTS_PATH}"
|
||||||
XCODE_ATTRIBUTE_MARKETING_VERSION "${APPLE_PROJECT_VERSION}"
|
XCODE_ATTRIBUTE_MARKETING_VERSION "${APPLE_PROJECT_VERSION}"
|
||||||
XCODE_ATTRIBUTE_CURRENT_PROJECT_VERSION "${CMAKE_PROJECT_VERSION_TWEAK}"
|
XCODE_ATTRIBUTE_CURRENT_PROJECT_VERSION "${CMAKE_PROJECT_VERSION_TWEAK}"
|
||||||
XCODE_ATTRIBUTE_PRODUCT_NAME "AmneziaVPN"
|
XCODE_ATTRIBUTE_PRODUCT_NAME "${CLIENT_APPLICATION_NAME}"
|
||||||
XCODE_ATTRIBUTE_BUNDLE_INFO_STRING "AmneziaVPN"
|
XCODE_ATTRIBUTE_BUNDLE_INFO_STRING "${CLIENT_APPLICATION_NAME}"
|
||||||
XCODE_GENERATE_SCHEME TRUE
|
XCODE_GENERATE_SCHEME TRUE
|
||||||
XCODE_ATTRIBUTE_ENABLE_BITCODE "NO"
|
XCODE_ATTRIBUTE_ENABLE_BITCODE "NO"
|
||||||
XCODE_ATTRIBUTE_ASSETCATALOG_COMPILER_APPICON_NAME "AppIcon"
|
XCODE_ATTRIBUTE_ASSETCATALOG_COMPILER_APPICON_NAME "AppIcon"
|
||||||
@@ -88,7 +88,7 @@ set_target_properties(${PROJECT} PROPERTIES
|
|||||||
|
|
||||||
XCODE_LINK_BUILD_PHASE_MODE KNOWN_LOCATION
|
XCODE_LINK_BUILD_PHASE_MODE KNOWN_LOCATION
|
||||||
XCODE_ATTRIBUTE_LD_RUNPATH_SEARCH_PATHS "@executable_path/../Frameworks"
|
XCODE_ATTRIBUTE_LD_RUNPATH_SEARCH_PATHS "@executable_path/../Frameworks"
|
||||||
XCODE_EMBED_APP_EXTENSIONS AmneziaVPNNetworkExtension
|
XCODE_EMBED_APP_EXTENSIONS ${CLIENT_MACOS_NE_TARGET_NAME}
|
||||||
)
|
)
|
||||||
|
|
||||||
if(DEPLOY)
|
if(DEPLOY)
|
||||||
@@ -109,11 +109,11 @@ set_target_properties(${PROJECT} PROPERTIES
|
|||||||
XCODE_ATTRIBUTE_SWIFT_VERSION "5.0"
|
XCODE_ATTRIBUTE_SWIFT_VERSION "5.0"
|
||||||
XCODE_ATTRIBUTE_CLANG_ENABLE_MODULES "YES"
|
XCODE_ATTRIBUTE_CLANG_ENABLE_MODULES "YES"
|
||||||
XCODE_ATTRIBUTE_SWIFT_PRECOMPILE_BRIDGING_HEADER "NO"
|
XCODE_ATTRIBUTE_SWIFT_PRECOMPILE_BRIDGING_HEADER "NO"
|
||||||
XCODE_ATTRIBUTE_SWIFT_OBJC_INTERFACE_HEADER_NAME "AmneziaVPN-Swift.h"
|
XCODE_ATTRIBUTE_SWIFT_OBJC_INTERFACE_HEADER_NAME "${CLIENT_SWIFT_OBJC_HEADER_NAME}"
|
||||||
XCODE_ATTRIBUTE_SWIFT_OBJC_INTEROP_MODE "objcxx"
|
XCODE_ATTRIBUTE_SWIFT_OBJC_INTEROP_MODE "objcxx"
|
||||||
)
|
)
|
||||||
set_target_properties(${PROJECT} PROPERTIES
|
set_target_properties(${PROJECT} PROPERTIES
|
||||||
XCODE_ATTRIBUTE_DEVELOPMENT_TEAM "X7UJ388FXK"
|
XCODE_ATTRIBUTE_DEVELOPMENT_TEAM "${BUILD_VPN_DEVELOPMENT_TEAM}"
|
||||||
)
|
)
|
||||||
target_include_directories(${PROJECT} PRIVATE ${CMAKE_CURRENT_LIST_DIR})
|
target_include_directories(${PROJECT} PRIVATE ${CMAKE_CURRENT_LIST_DIR})
|
||||||
target_compile_options(${PROJECT} PRIVATE
|
target_compile_options(${PROJECT} PRIVATE
|
||||||
@@ -143,7 +143,7 @@ set_property(TARGET ${PROJECT} APPEND PROPERTY RESOURCE
|
|||||||
)
|
)
|
||||||
|
|
||||||
add_subdirectory(macos/networkextension)
|
add_subdirectory(macos/networkextension)
|
||||||
add_dependencies(${PROJECT} AmneziaVPNNetworkExtension)
|
add_dependencies(${PROJECT} ${CLIENT_MACOS_NE_TARGET_NAME})
|
||||||
|
|
||||||
get_target_property(QtCore_location Qt6::Core LOCATION)
|
get_target_property(QtCore_location Qt6::Core LOCATION)
|
||||||
message("QtCore_location")
|
message("QtCore_location")
|
||||||
@@ -152,5 +152,5 @@ message(${QtCore_location})
|
|||||||
get_filename_component(QT_BIN_DIR_DETECTED "${QtCore_location}/../../../../../bin" ABSOLUTE)
|
get_filename_component(QT_BIN_DIR_DETECTED "${QtCore_location}/../../../../../bin" ABSOLUTE)
|
||||||
|
|
||||||
add_custom_command(TARGET ${PROJECT} POST_BUILD
|
add_custom_command(TARGET ${PROJECT} POST_BUILD
|
||||||
COMMAND ${QT_BIN_DIR_DETECTED}/macdeployqt $<TARGET_BUNDLE_DIR:AmneziaVPN> -appstore-compliant -qmldir=${CMAKE_CURRENT_SOURCE_DIR}
|
COMMAND ${QT_BIN_DIR_DETECTED}/macdeployqt $<TARGET_BUNDLE_DIR:${PROJECT}> -appstore-compliant -qmldir=${CMAKE_CURRENT_SOURCE_DIR}
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -62,6 +62,7 @@ set(HEADERS ${HEADERS}
|
|||||||
${CLIENT_ROOT_DIR}/ui/utils/qmlUtils.h
|
${CLIENT_ROOT_DIR}/ui/utils/qmlUtils.h
|
||||||
${CLIENT_ROOT_DIR}/core/utils/api/apiUtils.h
|
${CLIENT_ROOT_DIR}/core/utils/api/apiUtils.h
|
||||||
${CLIENT_ROOT_DIR}/core/utils/osSignalHandler.h
|
${CLIENT_ROOT_DIR}/core/utils/osSignalHandler.h
|
||||||
|
${CLIENT_ROOT_DIR}/core/utils/swiftInterop.h
|
||||||
${CLIENT_ROOT_DIR}/core/utils/utilities.h
|
${CLIENT_ROOT_DIR}/core/utils/utilities.h
|
||||||
${CLIENT_ROOT_DIR}/core/utils/managementServer.h
|
${CLIENT_ROOT_DIR}/core/utils/managementServer.h
|
||||||
${CLIENT_ROOT_DIR}/core/utils/constants.h
|
${CLIENT_ROOT_DIR}/core/utils/constants.h
|
||||||
|
|||||||
@@ -32,7 +32,7 @@
|
|||||||
|
|
||||||
#if defined(Q_OS_IOS) || defined(MACOS_NE)
|
#if defined(Q_OS_IOS) || defined(MACOS_NE)
|
||||||
#include "platforms/ios/ios_controller.h"
|
#include "platforms/ios/ios_controller.h"
|
||||||
#include <AmneziaVPN-Swift.h>
|
#include "core/utils/swiftInterop.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
using namespace amnezia;
|
using namespace amnezia;
|
||||||
@@ -681,7 +681,7 @@ void SubscriptionController::removeApiConfig(const QString &serverId)
|
|||||||
.arg(hostName)
|
.arg(hostName)
|
||||||
.arg("");
|
.arg("");
|
||||||
|
|
||||||
AmneziaVPN::removeVPNC(vpncName.toStdString());
|
SWIFT_INTEROP_NAMESPACE::removeVPNC(vpncName.toStdString());
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
apiV2->dns1.clear();
|
apiV2->dns1.clear();
|
||||||
|
|||||||
@@ -49,92 +49,14 @@ void ConnectionController::setConnectionState(Vpn::ConnectionState state)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
ErrorCode ConnectionController::defaultContainerForServer(const QString &serverId, DockerContainer &container) const
|
|
||||||
{
|
|
||||||
const auto kind = m_serversRepository->serverKind(serverId);
|
|
||||||
switch (kind) {
|
|
||||||
case serverConfigUtils::ConfigType::SelfHostedAdmin: {
|
|
||||||
const auto cfg = m_serversRepository->selfHostedAdminConfig(serverId);
|
|
||||||
if (!cfg.has_value()) {
|
|
||||||
return ErrorCode::InternalError;
|
|
||||||
}
|
|
||||||
container = cfg->defaultContainer;
|
|
||||||
return ErrorCode::NoError;
|
|
||||||
}
|
|
||||||
case serverConfigUtils::ConfigType::SelfHostedUser: {
|
|
||||||
const auto cfg = m_serversRepository->selfHostedUserConfig(serverId);
|
|
||||||
if (!cfg.has_value()) {
|
|
||||||
return ErrorCode::InternalError;
|
|
||||||
}
|
|
||||||
container = cfg->defaultContainer;
|
|
||||||
return ErrorCode::NoError;
|
|
||||||
}
|
|
||||||
case serverConfigUtils::ConfigType::Native: {
|
|
||||||
const auto cfg = m_serversRepository->nativeConfig(serverId);
|
|
||||||
if (!cfg.has_value()) {
|
|
||||||
return ErrorCode::InternalError;
|
|
||||||
}
|
|
||||||
container = cfg->defaultContainer;
|
|
||||||
return ErrorCode::NoError;
|
|
||||||
}
|
|
||||||
case serverConfigUtils::ConfigType::AmneziaPremiumV2:
|
|
||||||
case serverConfigUtils::ConfigType::AmneziaFreeV3:
|
|
||||||
case serverConfigUtils::ConfigType::ExternalPremium: {
|
|
||||||
const auto cfg = m_serversRepository->apiV2Config(serverId);
|
|
||||||
if (!cfg.has_value()) {
|
|
||||||
return ErrorCode::InternalError;
|
|
||||||
}
|
|
||||||
container = cfg->defaultContainer;
|
|
||||||
return ErrorCode::NoError;
|
|
||||||
}
|
|
||||||
case serverConfigUtils::ConfigType::AmneziaPremiumV1:
|
|
||||||
case serverConfigUtils::ConfigType::AmneziaFreeV2:
|
|
||||||
return ErrorCode::LegacyApiV1NotSupportedError;
|
|
||||||
case serverConfigUtils::ConfigType::Invalid:
|
|
||||||
default:
|
|
||||||
return ErrorCode::InternalError;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
ErrorCode ConnectionController::isConnectionSupported(const QString &serverId) const
|
|
||||||
{
|
|
||||||
if (serverId.isEmpty()) {
|
|
||||||
return ErrorCode::InternalError;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!isServiceReady()) {
|
|
||||||
return ErrorCode::AmneziaServiceNotRunning;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (serverConfigUtils::isLegacyApiSubscription(m_serversRepository->serverKind(serverId))) {
|
|
||||||
return ErrorCode::LegacyApiV1NotSupportedError;
|
|
||||||
}
|
|
||||||
|
|
||||||
DockerContainer container = DockerContainer::None;
|
|
||||||
const ErrorCode errorCode = defaultContainerForServer(serverId, container);
|
|
||||||
if (errorCode != ErrorCode::NoError) {
|
|
||||||
return errorCode;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (container == DockerContainer::None) {
|
|
||||||
return ErrorCode::NoInstalledContainersError;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (ContainerUtils::isUnsupportedContainer(container)) {
|
|
||||||
return ErrorCode::LegacyContainerNotSupportedError;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!isContainerSupported(container)) {
|
|
||||||
return ErrorCode::NotSupportedOnThisPlatform;
|
|
||||||
}
|
|
||||||
|
|
||||||
return ErrorCode::NoError;
|
|
||||||
}
|
|
||||||
|
|
||||||
ErrorCode ConnectionController::prepareConnection(const QString &serverId,
|
ErrorCode ConnectionController::prepareConnection(const QString &serverId,
|
||||||
QJsonObject& vpnConfiguration,
|
QJsonObject& vpnConfiguration,
|
||||||
DockerContainer& container)
|
DockerContainer& container)
|
||||||
{
|
{
|
||||||
|
if (!isServiceReady()) {
|
||||||
|
return ErrorCode::AmneziaServiceNotRunning;
|
||||||
|
}
|
||||||
|
|
||||||
ContainerConfig containerConfigModel;
|
ContainerConfig containerConfigModel;
|
||||||
QPair<QString, QString> dns;
|
QPair<QString, QString> dns;
|
||||||
QString hostName;
|
QString hostName;
|
||||||
@@ -198,6 +120,10 @@ ErrorCode ConnectionController::prepareConnection(const QString &serverId,
|
|||||||
return ErrorCode::InternalError;
|
return ErrorCode::InternalError;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!isContainerSupported(container)) {
|
||||||
|
return ErrorCode::NotSupportedOnThisPlatform;
|
||||||
|
}
|
||||||
|
|
||||||
vpnConfiguration = createConnectionConfiguration(dns, isApiConfig, hostName, description, configVersion,
|
vpnConfiguration = createConnectionConfiguration(dns, isApiConfig, hostName, description, configVersion,
|
||||||
containerConfigModel, container);
|
containerConfigModel, container);
|
||||||
|
|
||||||
|
|||||||
@@ -34,8 +34,6 @@ public:
|
|||||||
QJsonObject& vpnConfiguration,
|
QJsonObject& vpnConfiguration,
|
||||||
DockerContainer& container);
|
DockerContainer& container);
|
||||||
|
|
||||||
ErrorCode isConnectionSupported(const QString &serverId) const;
|
|
||||||
|
|
||||||
ErrorCode openConnection(const QString &serverId);
|
ErrorCode openConnection(const QString &serverId);
|
||||||
|
|
||||||
void closeConnection();
|
void closeConnection();
|
||||||
@@ -75,8 +73,6 @@ signals:
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
private:
|
private:
|
||||||
ErrorCode defaultContainerForServer(const QString &serverId, DockerContainer &container) const;
|
|
||||||
|
|
||||||
SecureServersRepository* m_serversRepository;
|
SecureServersRepository* m_serversRepository;
|
||||||
SecureAppSettingsRepository* m_appSettingsRepository;
|
SecureAppSettingsRepository* m_appSettingsRepository;
|
||||||
VpnConnection* m_vpnConnection;
|
VpnConnection* m_vpnConnection;
|
||||||
|
|||||||
@@ -18,7 +18,7 @@
|
|||||||
|
|
||||||
#if defined(Q_OS_IOS)
|
#if defined(Q_OS_IOS)
|
||||||
#include "platforms/ios/ios_controller.h"
|
#include "platforms/ios/ios_controller.h"
|
||||||
#include <AmneziaVPN-Swift.h>
|
#include "core/utils/swiftInterop.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
CoreController::CoreController(const QSharedPointer<VpnConnection> &vpnConnection, SecureQSettings* settings,
|
CoreController::CoreController(const QSharedPointer<VpnConnection> &vpnConnection, SecureQSettings* settings,
|
||||||
@@ -191,7 +191,7 @@ void CoreController::initControllers()
|
|||||||
m_languageUiController = new LanguageUiController(m_settingsController, m_languageModel, this);
|
m_languageUiController = new LanguageUiController(m_settingsController, m_languageModel, this);
|
||||||
setQmlContextProperty("LanguageUiController", m_languageUiController);
|
setQmlContextProperty("LanguageUiController", m_languageUiController);
|
||||||
|
|
||||||
m_settingsUiController = new SettingsUiController(m_settingsController, m_serversController, this);
|
m_settingsUiController = new SettingsUiController(m_settingsController, m_serversController, m_languageUiController, this);
|
||||||
setQmlContextProperty("SettingsController", m_settingsUiController);
|
setQmlContextProperty("SettingsController", m_settingsUiController);
|
||||||
|
|
||||||
m_pageController = new PageController(m_serversController, m_settingsController, this);
|
m_pageController = new PageController(m_serversController, m_settingsController, this);
|
||||||
@@ -255,7 +255,7 @@ void CoreController::initAppleController()
|
|||||||
{
|
{
|
||||||
#ifdef Q_OS_IOS
|
#ifdef Q_OS_IOS
|
||||||
IosController::Instance()->initialize();
|
IosController::Instance()->initialize();
|
||||||
QTimer::singleShot(0, this, [this]() { AmneziaVPN::toggleScreenshots(m_appSettingsRepository->isScreenshotsEnabled()); });
|
QTimer::singleShot(0, this, [this]() { SWIFT_INTEROP_NAMESPACE::toggleScreenshots(m_appSettingsRepository->isScreenshotsEnabled()); });
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -33,6 +33,7 @@
|
|||||||
#include "core/controllers/connectionController.h"
|
#include "core/controllers/connectionController.h"
|
||||||
#include "ui/models/clientManagementModel.h"
|
#include "ui/models/clientManagementModel.h"
|
||||||
#include "ui/controllers/api/apiNewsUiController.h"
|
#include "ui/controllers/api/apiNewsUiController.h"
|
||||||
|
#include "ui/models/api/apiCountryModel.h"
|
||||||
#include "ui/models/containersModel.h"
|
#include "ui/models/containersModel.h"
|
||||||
#include "core/utils/containerEnum.h"
|
#include "core/utils/containerEnum.h"
|
||||||
|
|
||||||
@@ -47,7 +48,7 @@
|
|||||||
|
|
||||||
#ifdef Q_OS_IOS
|
#ifdef Q_OS_IOS
|
||||||
#include "platforms/ios/ios_controller.h"
|
#include "platforms/ios/ios_controller.h"
|
||||||
#include <AmneziaVPN-Swift.h>
|
#include "core/utils/swiftInterop.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
CoreSignalHandlers::CoreSignalHandlers(CoreController* coreController, QObject* parent)
|
CoreSignalHandlers::CoreSignalHandlers(CoreController* coreController, QObject* parent)
|
||||||
@@ -155,17 +156,15 @@ void CoreSignalHandlers::initExportControllerHandler()
|
|||||||
void CoreSignalHandlers::initImportControllerHandler()
|
void CoreSignalHandlers::initImportControllerHandler()
|
||||||
{
|
{
|
||||||
connect(m_coreController->m_importCoreController, &ImportController::importFinished, this, [this]() {
|
connect(m_coreController->m_importCoreController, &ImportController::importFinished, this, [this]() {
|
||||||
if (m_coreController->m_connectionUiController->isConnected()) {
|
if (!m_coreController->m_connectionController->isConnected()) {
|
||||||
return;
|
int newServerIndex = m_coreController->m_serversController->getServersCount() - 1;
|
||||||
}
|
const QString serverId = m_coreController->m_serversController->getServerId(newServerIndex);
|
||||||
|
if (!serverId.isEmpty()) {
|
||||||
const int newServerIndex = m_coreController->m_serversController->getServersCount() - 1;
|
m_coreController->m_serversController->setDefaultServer(serverId);
|
||||||
const QString serverId = m_coreController->m_serversController->getServerId(newServerIndex);
|
}
|
||||||
if (!serverId.isEmpty()) {
|
if (m_coreController->m_serversUiController) {
|
||||||
m_coreController->m_serversController->setDefaultServer(serverId);
|
m_coreController->m_serversUiController->setProcessedServerId(serverId);
|
||||||
}
|
}
|
||||||
if (m_coreController->m_serversUiController) {
|
|
||||||
m_coreController->m_serversUiController->setProcessedServerId(serverId);
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@@ -178,13 +177,16 @@ void CoreSignalHandlers::initApiCountryModelUpdateHandler()
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
QJsonArray availableCountries;
|
||||||
|
QString serverCountryCode;
|
||||||
|
|
||||||
const auto apiV2 = m_coreController->m_serversRepository->apiV2Config(processedServerId);
|
const auto apiV2 = m_coreController->m_serversRepository->apiV2Config(processedServerId);
|
||||||
if (!apiV2.has_value()) {
|
if (apiV2.has_value()) {
|
||||||
return;
|
availableCountries = apiV2->apiConfig.availableCountries;
|
||||||
|
serverCountryCode = apiV2->apiConfig.serverCountryCode;
|
||||||
}
|
}
|
||||||
|
|
||||||
m_coreController->m_apiCountryModel->updateModel(apiV2->apiConfig.availableCountries,
|
m_coreController->m_apiCountryModel->updateModel(availableCountries, serverCountryCode);
|
||||||
apiV2->apiConfig.serverCountryCode);
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -235,16 +237,13 @@ void CoreSignalHandlers::initLanguageHandler()
|
|||||||
connect(m_coreController->m_settingsUiController, &SettingsUiController::resetLanguageToSystem, m_coreController->m_languageUiController, [this]() {
|
connect(m_coreController->m_settingsUiController, &SettingsUiController::resetLanguageToSystem, m_coreController->m_languageUiController, [this]() {
|
||||||
m_coreController->m_languageUiController->changeLanguage(m_coreController->m_languageUiController->getSystemLanguageEnum());
|
m_coreController->m_languageUiController->changeLanguage(m_coreController->m_languageUiController->getSystemLanguageEnum());
|
||||||
});
|
});
|
||||||
connect(m_coreController->m_settingsUiController, &SettingsUiController::appLanguageChanged, m_coreController->m_languageUiController, [this]() {
|
|
||||||
m_coreController->m_languageUiController->onAppLanguageChanged(m_coreController->m_settingsController->getAppLanguage());
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void CoreSignalHandlers::initAutoConnectHandler()
|
void CoreSignalHandlers::initAutoConnectHandler()
|
||||||
{
|
{
|
||||||
if (m_coreController->m_settingsUiController->isAutoConnectEnabled()
|
if (m_coreController->m_settingsUiController->isAutoConnectEnabled()
|
||||||
&& !m_coreController->m_serversController->getDefaultServerId().isEmpty()) {
|
&& !m_coreController->m_serversController->getDefaultServerId().isEmpty()) {
|
||||||
QTimer::singleShot(1000, this, [this]() { m_coreController->m_connectionUiController->toggleConnection(); });
|
QTimer::singleShot(1000, this, [this]() { m_coreController->m_connectionUiController->openConnection(); });
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -349,9 +348,6 @@ void CoreSignalHandlers::initUnsupportedConnectDrawerHandler()
|
|||||||
{
|
{
|
||||||
connect(m_coreController->m_subscriptionUiController, &SubscriptionUiController::unsupportedConnectDrawerRequested,
|
connect(m_coreController->m_subscriptionUiController, &SubscriptionUiController::unsupportedConnectDrawerRequested,
|
||||||
m_coreController->m_pageController, &PageController::unsupportedConnectDrawerRequested);
|
m_coreController->m_pageController, &PageController::unsupportedConnectDrawerRequested);
|
||||||
|
|
||||||
connect(m_coreController->m_connectionUiController, &ConnectionUiController::unsupportedConnectDrawerRequested,
|
|
||||||
m_coreController->m_pageController, &PageController::unsupportedConnectDrawerRequested);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void CoreSignalHandlers::initStrictKillSwitchHandler()
|
void CoreSignalHandlers::initStrictKillSwitchHandler()
|
||||||
@@ -408,7 +404,7 @@ void CoreSignalHandlers::initIosImportHandler()
|
|||||||
void CoreSignalHandlers::initIosSettingsHandler()
|
void CoreSignalHandlers::initIosSettingsHandler()
|
||||||
{
|
{
|
||||||
#ifdef Q_OS_IOS
|
#ifdef Q_OS_IOS
|
||||||
connect(m_coreController->m_appSettingsRepository, &SecureAppSettingsRepository::screenshotsEnabledChanged, [](bool enabled) { AmneziaVPN::toggleScreenshots(enabled); });
|
connect(m_coreController->m_appSettingsRepository, &SecureAppSettingsRepository::screenshotsEnabledChanged, [](bool enabled) { SWIFT_INTEROP_NAMESPACE::toggleScreenshots(enabled); });
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -72,16 +72,6 @@ namespace
|
|||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
QString buildRemoveContainerScript(const amnezia::ScriptVars &vars, bool removeDataVolume)
|
|
||||||
{
|
|
||||||
QString script = SshSession::replaceVars(amnezia::scriptData(SharedScriptType::remove_container), vars);
|
|
||||||
if (removeDataVolume) {
|
|
||||||
script += QLatin1String("\nsudo docker volume rm -f $CONTAINER_NAME-data 2>/dev/null || true");
|
|
||||||
script = SshSession::replaceVars(script, vars);
|
|
||||||
}
|
|
||||||
return script;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
InstallController::InstallController(SecureServersRepository *serversRepository,
|
InstallController::InstallController(SecureServersRepository *serversRepository,
|
||||||
@@ -130,10 +120,14 @@ ErrorCode InstallController::setupContainer(const ServerCredentials &credentials
|
|||||||
return e;
|
return e;
|
||||||
qDebug().noquote() << "InstallController::setupContainer prepareHostWorker finished";
|
qDebug().noquote() << "InstallController::setupContainer prepareHostWorker finished";
|
||||||
|
|
||||||
const amnezia::ScriptVars removeContainerVars =
|
amnezia::ScriptVars removeContainerVars =
|
||||||
amnezia::genBaseVars(credentials, container, QString(), QString());
|
amnezia::genBaseVars(credentials, container, QString(), QString());
|
||||||
const bool removeDataVolume = !isUpdate && (container == DockerContainer::MtProxy || container == DockerContainer::Telemt);
|
if (!isUpdate) {
|
||||||
sshSession.runScript(credentials, buildRemoveContainerScript(removeContainerVars, removeDataVolume));
|
removeContainerVars.append({ { "$REMOVE_CONTAINER_DATA", QStringLiteral("1") } });
|
||||||
|
}
|
||||||
|
sshSession.runScript(credentials,
|
||||||
|
sshSession.replaceVars(amnezia::scriptData(SharedScriptType::remove_container),
|
||||||
|
removeContainerVars));
|
||||||
qDebug().noquote() << "InstallController::setupContainer removeContainer finished";
|
qDebug().noquote() << "InstallController::setupContainer removeContainer finished";
|
||||||
|
|
||||||
qDebug().noquote() << "buildContainerWorker start";
|
qDebug().noquote() << "buildContainerWorker start";
|
||||||
@@ -158,8 +152,8 @@ ErrorCode InstallController::setupContainer(const ServerCredentials &credentials
|
|||||||
return startupContainerWorker(credentials, container, config, sshSession);
|
return startupContainerWorker(credentials, container, config, sshSession);
|
||||||
}
|
}
|
||||||
|
|
||||||
ErrorCode InstallController::updateServerConfig(const QString &serverId, DockerContainer container, const ContainerConfig &oldConfig,
|
ErrorCode InstallController::updateContainer(const QString &serverId, DockerContainer container, const ContainerConfig &oldConfig,
|
||||||
ContainerConfig &newConfig)
|
ContainerConfig &newConfig)
|
||||||
{
|
{
|
||||||
if (!isUpdateDockerContainerRequired(container, oldConfig, newConfig)) {
|
if (!isUpdateDockerContainerRequired(container, oldConfig, newConfig)) {
|
||||||
auto adminConfig = m_serversRepository->selfHostedAdminConfig(serverId);
|
auto adminConfig = m_serversRepository->selfHostedAdminConfig(serverId);
|
||||||
@@ -191,7 +185,7 @@ ErrorCode InstallController::updateServerConfig(const QString &serverId, DockerC
|
|||||||
SshSession sshSession(this);
|
SshSession sshSession(this);
|
||||||
|
|
||||||
bool reinstallRequired = isReinstallContainerRequired(container, oldConfig, newConfig);
|
bool reinstallRequired = isReinstallContainerRequired(container, oldConfig, newConfig);
|
||||||
qDebug() << "InstallController::updateServerConfig for container" << container << "reinstall required is" << reinstallRequired;
|
qDebug() << "InstallController::updateContainer for container" << container << "reinstall required is" << reinstallRequired;
|
||||||
|
|
||||||
bool xrayServerSettingsChanged = false;
|
bool xrayServerSettingsChanged = false;
|
||||||
if (container == DockerContainer::Xray || container == DockerContainer::SSXray) {
|
if (container == DockerContainer::Xray || container == DockerContainer::SSXray) {
|
||||||
@@ -219,11 +213,11 @@ ErrorCode InstallController::updateServerConfig(const QString &serverId, DockerC
|
|||||||
if (errorCode == ErrorCode::NoError && xrayServerSettingsChanged && !skipXrayInboundSync) {
|
if (errorCode == ErrorCode::NoError && xrayServerSettingsChanged && !skipXrayInboundSync) {
|
||||||
DnsSettings dnsSettings = { m_appSettingsRepository->primaryDns(), m_appSettingsRepository->secondaryDns() };
|
DnsSettings dnsSettings = { m_appSettingsRepository->primaryDns(), m_appSettingsRepository->secondaryDns() };
|
||||||
XrayConfigurator xrayConfigurator(&sshSession);
|
XrayConfigurator xrayConfigurator(&sshSession);
|
||||||
qDebug() << "InstallController::updateServerConfig applying Xray server inbound sync, reinstall="
|
qDebug() << "InstallController::updateContainer applying Xray server inbound sync, reinstall="
|
||||||
<< reinstallRequired;
|
<< reinstallRequired;
|
||||||
errorCode = xrayConfigurator.applyServerSettingsToRemote(credentials, container, newConfig, dnsSettings, false);
|
errorCode = xrayConfigurator.applyServerSettingsToRemote(credentials, container, newConfig, dnsSettings, false);
|
||||||
if (errorCode != ErrorCode::NoError) {
|
if (errorCode != ErrorCode::NoError) {
|
||||||
qDebug() << "InstallController::updateServerConfig Xray inbound sync failed, error="
|
qDebug() << "InstallController::updateContainer Xray inbound sync failed, error="
|
||||||
<< static_cast<int>(errorCode);
|
<< static_cast<int>(errorCode);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -242,41 +236,6 @@ ErrorCode InstallController::updateServerConfig(const QString &serverId, DockerC
|
|||||||
return errorCode;
|
return errorCode;
|
||||||
}
|
}
|
||||||
|
|
||||||
ErrorCode InstallController::updateClientConfig(const QString &serverId, DockerContainer container, ContainerConfig &newConfig)
|
|
||||||
{
|
|
||||||
switch (m_serversRepository->serverKind(serverId)) {
|
|
||||||
case serverConfigUtils::ConfigType::SelfHostedAdmin: {
|
|
||||||
auto config = m_serversRepository->selfHostedAdminConfig(serverId);
|
|
||||||
if (!config.has_value()) {
|
|
||||||
return ErrorCode::InternalError;
|
|
||||||
}
|
|
||||||
config->updateContainerConfig(container, newConfig);
|
|
||||||
m_serversRepository->editServer(serverId, config->toJson(), serverConfigUtils::ConfigType::SelfHostedAdmin);
|
|
||||||
return ErrorCode::NoError;
|
|
||||||
}
|
|
||||||
case serverConfigUtils::ConfigType::SelfHostedUser: {
|
|
||||||
auto config = m_serversRepository->selfHostedUserConfig(serverId);
|
|
||||||
if (!config.has_value()) {
|
|
||||||
return ErrorCode::InternalError;
|
|
||||||
}
|
|
||||||
config->updateContainerConfig(container, newConfig);
|
|
||||||
m_serversRepository->editServer(serverId, config->toJson(), serverConfigUtils::ConfigType::SelfHostedUser);
|
|
||||||
return ErrorCode::NoError;
|
|
||||||
}
|
|
||||||
case serverConfigUtils::ConfigType::Native: {
|
|
||||||
auto config = m_serversRepository->nativeConfig(serverId);
|
|
||||||
if (!config.has_value()) {
|
|
||||||
return ErrorCode::InternalError;
|
|
||||||
}
|
|
||||||
config->updateContainerConfig(container, newConfig);
|
|
||||||
m_serversRepository->editServer(serverId, config->toJson(), serverConfigUtils::ConfigType::Native);
|
|
||||||
return ErrorCode::NoError;
|
|
||||||
}
|
|
||||||
default:
|
|
||||||
return ErrorCode::InternalError;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void InstallController::clearCachedProfile(const QString &serverId, DockerContainer container)
|
void InstallController::clearCachedProfile(const QString &serverId, DockerContainer container)
|
||||||
{
|
{
|
||||||
if (ContainerUtils::containerService(container) == ServiceType::Other) {
|
if (ContainerUtils::containerService(container) == ServiceType::Other) {
|
||||||
@@ -1021,11 +980,12 @@ ErrorCode InstallController::removeContainer(const QString &serverId, DockerCont
|
|||||||
return ErrorCode::InternalError;
|
return ErrorCode::InternalError;
|
||||||
}
|
}
|
||||||
SshSession sshSession(this);
|
SshSession sshSession(this);
|
||||||
const amnezia::ScriptVars removeContainerVars =
|
amnezia::ScriptVars removeContainerVars =
|
||||||
amnezia::genBaseVars(credentials, container, QString(), QString());
|
amnezia::genBaseVars(credentials, container, QString(), QString());
|
||||||
const bool removeDataVolume = (container == DockerContainer::MtProxy || container == DockerContainer::Telemt);
|
removeContainerVars.append({ { "$REMOVE_CONTAINER_DATA", QStringLiteral("1") } });
|
||||||
ErrorCode errorCode =
|
ErrorCode errorCode = sshSession.runScript(
|
||||||
sshSession.runScript(credentials, buildRemoveContainerScript(removeContainerVars, removeDataVolume));
|
credentials,
|
||||||
|
sshSession.replaceVars(amnezia::scriptData(SharedScriptType::remove_container), removeContainerVars));
|
||||||
|
|
||||||
if (errorCode == ErrorCode::NoError) {
|
if (errorCode == ErrorCode::NoError) {
|
||||||
QMap<DockerContainer, ContainerConfig> containers = adminConfig->containers;
|
QMap<DockerContainer, ContainerConfig> containers = adminConfig->containers;
|
||||||
@@ -1503,7 +1463,7 @@ ErrorCode InstallController::getAlreadyInstalledContainers(const ServerCredentia
|
|||||||
QString transportProtoStr = containerAndPortMatch.captured(3);
|
QString transportProtoStr = containerAndPortMatch.captured(3);
|
||||||
DockerContainer container = ContainerUtils::containerFromString(name);
|
DockerContainer container = ContainerUtils::containerFromString(name);
|
||||||
|
|
||||||
if (container == DockerContainer::None || ContainerUtils::isUnsupportedContainer(container)) {
|
if (container == DockerContainer::None) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1528,7 +1488,7 @@ ErrorCode InstallController::getAlreadyInstalledContainers(const ServerCredentia
|
|||||||
QString transportProtoStr = torOrDnsRegMatch.captured(3);
|
QString transportProtoStr = torOrDnsRegMatch.captured(3);
|
||||||
DockerContainer container = ContainerUtils::containerFromString(name);
|
DockerContainer container = ContainerUtils::containerFromString(name);
|
||||||
|
|
||||||
if (container == DockerContainer::None || ContainerUtils::isUnsupportedContainer(container)) {
|
if (container == DockerContainer::None) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -34,12 +34,7 @@ public:
|
|||||||
~InstallController();
|
~InstallController();
|
||||||
|
|
||||||
ErrorCode setupContainer(const ServerCredentials &credentials, DockerContainer container, ContainerConfig &config, bool isUpdate = false);
|
ErrorCode setupContainer(const ServerCredentials &credentials, DockerContainer container, ContainerConfig &config, bool isUpdate = false);
|
||||||
|
ErrorCode updateContainer(const QString &serverId, DockerContainer container, const ContainerConfig &oldConfig, ContainerConfig &newConfig);
|
||||||
// Updates server-side container settings (admin self-hosted only): reconfigures the container over SSH.
|
|
||||||
ErrorCode updateServerConfig(const QString &serverId, DockerContainer container, const ContainerConfig &oldConfig, ContainerConfig &newConfig);
|
|
||||||
|
|
||||||
// Updates client-local settings only: rewrites the stored container config for any self-hosted/native server. No SSH.
|
|
||||||
ErrorCode updateClientConfig(const QString &serverId, DockerContainer container, ContainerConfig &newConfig);
|
|
||||||
|
|
||||||
ErrorCode rebootServer(const QString &serverId);
|
ErrorCode rebootServer(const QString &serverId);
|
||||||
ErrorCode removeAllContainers(const QString &serverId);
|
ErrorCode removeAllContainers(const QString &serverId);
|
||||||
|
|||||||
@@ -8,7 +8,7 @@
|
|||||||
#include "core/models/serverDescription.h"
|
#include "core/models/serverDescription.h"
|
||||||
|
|
||||||
#if defined(Q_OS_IOS) || defined(MACOS_NE)
|
#if defined(Q_OS_IOS) || defined(MACOS_NE)
|
||||||
#include <AmneziaVPN-Swift.h>
|
#include "core/utils/swiftInterop.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -29,11 +29,6 @@ ContainerConfig NativeServerConfig::containerConfig(DockerContainer container) c
|
|||||||
return containers.value(container);
|
return containers.value(container);
|
||||||
}
|
}
|
||||||
|
|
||||||
void NativeServerConfig::updateContainerConfig(DockerContainer container, const ContainerConfig &config)
|
|
||||||
{
|
|
||||||
containers[container] = config;
|
|
||||||
}
|
|
||||||
|
|
||||||
QPair<QString, QString> NativeServerConfig::getDnsPair(const QString &primaryDns, const QString &secondaryDns) const
|
QPair<QString, QString> NativeServerConfig::getDnsPair(const QString &primaryDns, const QString &secondaryDns) const
|
||||||
{
|
{
|
||||||
QString d1 = dns1;
|
QString d1 = dns1;
|
||||||
|
|||||||
@@ -27,8 +27,6 @@ struct NativeServerConfig {
|
|||||||
bool hasContainers() const;
|
bool hasContainers() const;
|
||||||
ContainerConfig containerConfig(DockerContainer container) const;
|
ContainerConfig containerConfig(DockerContainer container) const;
|
||||||
|
|
||||||
void updateContainerConfig(DockerContainer container, const ContainerConfig &config);
|
|
||||||
|
|
||||||
QPair<QString, QString> getDnsPair(const QString &primaryDns, const QString &secondaryDns) const;
|
QPair<QString, QString> getDnsPair(const QString &primaryDns, const QString &secondaryDns) const;
|
||||||
|
|
||||||
QJsonObject toJson() const;
|
QJsonObject toJson() const;
|
||||||
|
|||||||
@@ -43,11 +43,6 @@ ContainerConfig SelfHostedUserServerConfig::containerConfig(DockerContainer cont
|
|||||||
return containers.value(container);
|
return containers.value(container);
|
||||||
}
|
}
|
||||||
|
|
||||||
void SelfHostedUserServerConfig::updateContainerConfig(DockerContainer container, const ContainerConfig &config)
|
|
||||||
{
|
|
||||||
containers[container] = config;
|
|
||||||
}
|
|
||||||
|
|
||||||
QPair<QString, QString> SelfHostedUserServerConfig::getDnsPair(const QString &primaryDns,
|
QPair<QString, QString> SelfHostedUserServerConfig::getDnsPair(const QString &primaryDns,
|
||||||
const QString &secondaryDns) const
|
const QString &secondaryDns) const
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -32,8 +32,6 @@ struct SelfHostedUserServerConfig {
|
|||||||
bool hasContainers() const;
|
bool hasContainers() const;
|
||||||
ContainerConfig containerConfig(DockerContainer container) const;
|
ContainerConfig containerConfig(DockerContainer container) const;
|
||||||
|
|
||||||
void updateContainerConfig(DockerContainer container, const ContainerConfig &config);
|
|
||||||
|
|
||||||
QPair<QString, QString> getDnsPair(const QString &primaryDns, const QString &secondaryDns) const;
|
QPair<QString, QString> getDnsPair(const QString &primaryDns, const QString &secondaryDns) const;
|
||||||
|
|
||||||
QJsonObject toJson() const;
|
QJsonObject toJson() const;
|
||||||
|
|||||||
@@ -39,44 +39,33 @@ QString OpenVpnProtocol::defaultConfigPath()
|
|||||||
return p;
|
return p;
|
||||||
}
|
}
|
||||||
|
|
||||||
void OpenVpnProtocol::cleanupResources()
|
void OpenVpnProtocol::stop()
|
||||||
{
|
{
|
||||||
if (m_openVpnProcess || openVpnProcessIsRunning()) {
|
qDebug() << "OpenVpnProtocol::stop()";
|
||||||
|
setConnectionState(Vpn::ConnectionState::Disconnecting);
|
||||||
|
|
||||||
|
// TODO: need refactoring
|
||||||
|
// sendTermSignal() will even return true while server connected ???
|
||||||
|
if ((m_connectionState == Vpn::ConnectionState::Preparing) || (m_connectionState == Vpn::ConnectionState::Connecting)
|
||||||
|
|| (m_connectionState == Vpn::ConnectionState::Connected)
|
||||||
|
|| (m_connectionState == Vpn::ConnectionState::Reconnecting)) {
|
||||||
if (!sendTermSignal()) {
|
if (!sendTermSignal()) {
|
||||||
killOpenVpnProcess();
|
killOpenVpnProcess();
|
||||||
}
|
}
|
||||||
QThread::msleep(10);
|
QThread::msleep(10);
|
||||||
|
m_managementServer.stop();
|
||||||
}
|
}
|
||||||
m_managementServer.stop();
|
|
||||||
|
|
||||||
#if defined(Q_OS_WIN) || defined(Q_OS_LINUX) || defined(Q_OS_MACOS)
|
#if defined(Q_OS_WIN) || defined(Q_OS_LINUX) || defined(Q_OS_MACOS)
|
||||||
IpcClient::withInterface([](QSharedPointer<IpcInterfaceReplica> iface) {
|
IpcClient::withInterface([](QSharedPointer<IpcInterfaceReplica> iface) {
|
||||||
QRemoteObjectPendingReply<bool> reply = iface->disableKillSwitch();
|
QRemoteObjectPendingReply<bool> reply = iface->disableKillSwitch();
|
||||||
if (!reply.waitForFinished(1000) && !reply.returnValue()) {
|
if (!reply.waitForFinished(1000) && !reply.returnValue()) {
|
||||||
qWarning() << "OpenVpnProtocol::cleanupResources(): Failed to disable killswitch";
|
qWarning() << "OpenVpnProtocol::stop(): Failed to disable killswitch";
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
#endif
|
#endif
|
||||||
}
|
|
||||||
|
|
||||||
void OpenVpnProtocol::stop()
|
setConnectionState(Vpn::ConnectionState::Disconnected);
|
||||||
{
|
|
||||||
qDebug() << "OpenVpnProtocol::stop()";
|
|
||||||
|
|
||||||
const bool wasActive = m_connectionState == Vpn::ConnectionState::Preparing
|
|
||||||
|| m_connectionState == Vpn::ConnectionState::Connecting
|
|
||||||
|| m_connectionState == Vpn::ConnectionState::Connected
|
|
||||||
|| m_connectionState == Vpn::ConnectionState::Reconnecting;
|
|
||||||
|
|
||||||
if (wasActive) {
|
|
||||||
setConnectionState(Vpn::ConnectionState::Disconnecting);
|
|
||||||
}
|
|
||||||
|
|
||||||
cleanupResources();
|
|
||||||
|
|
||||||
if (wasActive || m_connectionState == Vpn::ConnectionState::Disconnecting) {
|
|
||||||
setConnectionState(Vpn::ConnectionState::Disconnected);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
ErrorCode OpenVpnProtocol::prepare()
|
ErrorCode OpenVpnProtocol::prepare()
|
||||||
@@ -179,7 +168,7 @@ void OpenVpnProtocol::updateRouteGateway(QString line)
|
|||||||
|
|
||||||
ErrorCode OpenVpnProtocol::start()
|
ErrorCode OpenVpnProtocol::start()
|
||||||
{
|
{
|
||||||
cleanupResources();
|
OpenVpnProtocol::stop();
|
||||||
|
|
||||||
if (!QFileInfo::exists(configPath())) {
|
if (!QFileInfo::exists(configPath())) {
|
||||||
setLastError(ErrorCode::OpenVpnConfigMissing);
|
setLastError(ErrorCode::OpenVpnConfigMissing);
|
||||||
|
|||||||
@@ -29,7 +29,6 @@ protected slots:
|
|||||||
void onReadyReadDataFromManagementServer();
|
void onReadyReadDataFromManagementServer();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void cleanupResources();
|
|
||||||
QString configPath() const;
|
QString configPath() const;
|
||||||
bool openVpnProcessIsRunning() const;
|
bool openVpnProcessIsRunning() const;
|
||||||
bool sendTermSignal();
|
bool sendTermSignal();
|
||||||
|
|||||||
@@ -9,13 +9,10 @@
|
|||||||
#include "ipc.h"
|
#include "ipc.h"
|
||||||
|
|
||||||
#include <QCryptographicHash>
|
#include <QCryptographicHash>
|
||||||
#include <QJsonArray>
|
|
||||||
#include <QJsonDocument>
|
#include <QJsonDocument>
|
||||||
#include <QTimer>
|
#include <QTimer>
|
||||||
#include <QJsonObject>
|
#include <QJsonObject>
|
||||||
#include <QNetworkInterface>
|
#include <QNetworkInterface>
|
||||||
#include <QNetworkProxy>
|
|
||||||
#include <QTcpSocket>
|
|
||||||
#include <QtCore/qlogging.h>
|
#include <QtCore/qlogging.h>
|
||||||
#include <QtCore/qobjectdefs.h>
|
#include <QtCore/qobjectdefs.h>
|
||||||
#include <QtCore/qprocess.h>
|
#include <QtCore/qprocess.h>
|
||||||
@@ -59,28 +56,6 @@ XrayProtocol::XrayProtocol(const QJsonObject &configuration, QObject *parent) :
|
|||||||
qWarning() << "Xray config string is not a valid JSON object";
|
qWarning() << "Xray config string is not a valid JSON object";
|
||||||
m_xrayConfig = {};
|
m_xrayConfig = {};
|
||||||
}
|
}
|
||||||
|
|
||||||
m_serverPort = extractServerPort();
|
|
||||||
}
|
|
||||||
|
|
||||||
int XrayProtocol::extractServerPort() const
|
|
||||||
{
|
|
||||||
const QJsonArray outbounds = m_xrayConfig.value(amnezia::protocols::xray::outbounds).toArray();
|
|
||||||
if (outbounds.isEmpty())
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
const QJsonObject settings = outbounds.first().toObject().value(amnezia::protocols::xray::settings).toObject();
|
|
||||||
|
|
||||||
QJsonArray servers;
|
|
||||||
if (settings.contains(amnezia::protocols::xray::vnext))
|
|
||||||
servers = settings.value(amnezia::protocols::xray::vnext).toArray();
|
|
||||||
else if (settings.contains(amnezia::protocols::xray::servers))
|
|
||||||
servers = settings.value(amnezia::protocols::xray::servers).toArray();
|
|
||||||
|
|
||||||
if (servers.isEmpty())
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
return servers.first().toObject().value(amnezia::protocols::xray::port).toInt();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
XrayProtocol::~XrayProtocol()
|
XrayProtocol::~XrayProtocol()
|
||||||
@@ -93,13 +68,6 @@ ErrorCode XrayProtocol::start()
|
|||||||
{
|
{
|
||||||
qDebug() << "XrayProtocol::start()";
|
qDebug() << "XrayProtocol::start()";
|
||||||
|
|
||||||
m_connectivityProbeStarted = false;
|
|
||||||
|
|
||||||
if (!probeServerReachable()) {
|
|
||||||
qCritical() << "XrayProtocol: VPN server" << m_remoteAddress << "is unreachable";
|
|
||||||
return ErrorCode::XrayServerUnreachable;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Inject SOCKS5 auth into the inbound before starting xray.
|
// Inject SOCKS5 auth into the inbound before starting xray.
|
||||||
// Re-uses existing credentials if the config already has them (e.g. imported config).
|
// Re-uses existing credentials if the config already has them (e.g. imported config).
|
||||||
amnezia::serialization::inbounds::InboundCredentials creds;
|
amnezia::serialization::inbounds::InboundCredentials creds;
|
||||||
@@ -136,50 +104,22 @@ ErrorCode XrayProtocol::start()
|
|||||||
qDebug() << "XrayProtocol: patched legacy inbound listen address to 127.0.0.1";
|
qDebug() << "XrayProtocol: patched legacy inbound listen address to 127.0.0.1";
|
||||||
}
|
}
|
||||||
|
|
||||||
startTimeoutTimer();
|
|
||||||
|
|
||||||
return IpcClient::withInterface(
|
return IpcClient::withInterface(
|
||||||
[&](QSharedPointer<IpcInterfaceReplica> iface) {
|
[&](QSharedPointer<IpcInterfaceReplica> iface) {
|
||||||
auto xrayStart = iface->xrayStart(xrayConfigStr);
|
auto xrayStart = iface->xrayStart(xrayConfigStr);
|
||||||
if (!xrayStart.waitForFinished() || !xrayStart.returnValue()) {
|
if (!xrayStart.waitForFinished() || !xrayStart.returnValue()) {
|
||||||
qCritical() << "Failed to start xray";
|
qCritical() << "Failed to start xray";
|
||||||
stopTimeoutTimer();
|
|
||||||
return ErrorCode::XrayExecutableCrashed;
|
return ErrorCode::XrayExecutableCrashed;
|
||||||
}
|
}
|
||||||
return startTun2Socks();
|
return startTun2Socks();
|
||||||
},
|
},
|
||||||
[this]() {
|
[]() { return ErrorCode::AmneziaServiceConnectionFailed; });
|
||||||
stopTimeoutTimer();
|
|
||||||
return ErrorCode::AmneziaServiceConnectionFailed;
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void XrayProtocol::stop()
|
void XrayProtocol::stop()
|
||||||
{
|
{
|
||||||
qDebug() << "XrayProtocol::stop()";
|
qDebug() << "XrayProtocol::stop()";
|
||||||
|
|
||||||
stopTimeoutTimer();
|
|
||||||
stopLivenessMonitor();
|
|
||||||
|
|
||||||
if (m_tun2socksProcess) {
|
|
||||||
m_tun2socksProcess->blockSignals(true);
|
|
||||||
|
|
||||||
#ifndef Q_OS_WIN
|
|
||||||
m_tun2socksProcess->terminate();
|
|
||||||
auto waitForFinished = m_tun2socksProcess->waitForFinished(1000);
|
|
||||||
if (!waitForFinished.waitForFinished() || !waitForFinished.returnValue()) {
|
|
||||||
qWarning() << "Failed to terminate tun2socks. Killing the process...";
|
|
||||||
m_tun2socksProcess->kill();
|
|
||||||
m_tun2socksProcess->waitForFinished(1000);
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
m_tun2socksProcess->kill();
|
|
||||||
#endif
|
|
||||||
|
|
||||||
m_tun2socksProcess->close();
|
|
||||||
m_tun2socksProcess.reset();
|
|
||||||
}
|
|
||||||
|
|
||||||
IpcClient::withInterface([](QSharedPointer<IpcInterfaceReplica> iface) {
|
IpcClient::withInterface([](QSharedPointer<IpcInterfaceReplica> iface) {
|
||||||
auto disableKillSwitch = iface->disableKillSwitch();
|
auto disableKillSwitch = iface->disableKillSwitch();
|
||||||
if (!disableKillSwitch.waitForFinished() || !disableKillSwitch.returnValue())
|
if (!disableKillSwitch.waitForFinished() || !disableKillSwitch.returnValue())
|
||||||
@@ -202,13 +142,31 @@ void XrayProtocol::stop()
|
|||||||
qWarning() << "Failed to stop xray";
|
qWarning() << "Failed to stop xray";
|
||||||
});
|
});
|
||||||
|
|
||||||
|
if (m_tun2socksProcess) {
|
||||||
|
m_tun2socksProcess->blockSignals(true);
|
||||||
|
|
||||||
|
#ifndef Q_OS_WIN
|
||||||
|
m_tun2socksProcess->terminate();
|
||||||
|
auto waitForFinished = m_tun2socksProcess->waitForFinished(1000);
|
||||||
|
if (!waitForFinished.waitForFinished() || !waitForFinished.returnValue()) {
|
||||||
|
qWarning() << "Failed to terminate tun2socks. Killing the process...";
|
||||||
|
m_tun2socksProcess->kill();
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
// terminate does not do anything useful on Windows
|
||||||
|
// so just kill the process
|
||||||
|
m_tun2socksProcess->kill();
|
||||||
|
#endif
|
||||||
|
|
||||||
|
m_tun2socksProcess->close();
|
||||||
|
m_tun2socksProcess.reset();
|
||||||
|
}
|
||||||
|
|
||||||
setConnectionState(Vpn::ConnectionState::Disconnected);
|
setConnectionState(Vpn::ConnectionState::Disconnected);
|
||||||
}
|
}
|
||||||
|
|
||||||
ErrorCode XrayProtocol::startTun2Socks()
|
ErrorCode XrayProtocol::startTun2Socks()
|
||||||
{
|
{
|
||||||
m_tunResourceBusy = false;
|
|
||||||
|
|
||||||
m_tun2socksProcess = IpcClient::CreatePrivilegedProcess();
|
m_tun2socksProcess = IpcClient::CreatePrivilegedProcess();
|
||||||
if (!m_tun2socksProcess->waitForSource()) {
|
if (!m_tun2socksProcess->waitForSource()) {
|
||||||
return ErrorCode::AmneziaServiceConnectionFailed;
|
return ErrorCode::AmneziaServiceConnectionFailed;
|
||||||
@@ -233,31 +191,15 @@ ErrorCode XrayProtocol::startTun2Socks()
|
|||||||
if (!line.contains("[TCP]") && !line.contains("[UDP]"))
|
if (!line.contains("[TCP]") && !line.contains("[UDP]"))
|
||||||
qDebug() << "[tun2socks]:" << line;
|
qDebug() << "[tun2socks]:" << line;
|
||||||
|
|
||||||
if (line.contains("resource busy"))
|
if (line.contains("[STACK] tun://") && line.contains("<-> socks5://")) {
|
||||||
m_tunResourceBusy = true;
|
|
||||||
|
|
||||||
if (line.contains("[STACK] tun://") && line.contains("<-> socks5://") && !m_connectivityProbeStarted) {
|
|
||||||
m_connectivityProbeStarted = true;
|
|
||||||
disconnect(m_tun2socksProcess.data(), &IpcProcessInterfaceReplica::readyReadStandardOutput, this, nullptr);
|
disconnect(m_tun2socksProcess.data(), &IpcProcessInterfaceReplica::readyReadStandardOutput, this, nullptr);
|
||||||
disconnect(m_tun2socksProcess.data(), &IpcProcessInterfaceReplica::readyReadStandardError, this, nullptr);
|
|
||||||
|
|
||||||
runConnectivityProbe([this](bool ok) {
|
if (ErrorCode res = setupRouting(); res != ErrorCode::NoError) {
|
||||||
if (!ok) {
|
stop();
|
||||||
qCritical() << "Xray connectivity probe failed: no traffic flows through the tunnel";
|
setLastError(res);
|
||||||
stop();
|
} else {
|
||||||
setLastError(ErrorCode::XrayConnectivityCheckFailed);
|
setConnectionState(Vpn::ConnectionState::Connected);
|
||||||
return;
|
}
|
||||||
}
|
|
||||||
|
|
||||||
if (ErrorCode res = setupRouting(); res != ErrorCode::NoError) {
|
|
||||||
stop();
|
|
||||||
setLastError(res);
|
|
||||||
} else {
|
|
||||||
stopTimeoutTimer();
|
|
||||||
setConnectionState(Vpn::ConnectionState::Connected);
|
|
||||||
startLivenessMonitor();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
Qt::QueuedConnection);
|
Qt::QueuedConnection);
|
||||||
@@ -265,7 +207,15 @@ ErrorCode XrayProtocol::startTun2Socks()
|
|||||||
connect(
|
connect(
|
||||||
m_tun2socksProcess.data(), &IpcProcessInterfaceReplica::finished, this,
|
m_tun2socksProcess.data(), &IpcProcessInterfaceReplica::finished, this,
|
||||||
[this](int exitCode, QProcess::ExitStatus exitStatus) {
|
[this](int exitCode, QProcess::ExitStatus exitStatus) {
|
||||||
const bool resourceBusy = m_tunResourceBusy;
|
// Check stdout for "resource busy" — the TUN device was not yet released
|
||||||
|
// by the previous tun2socks instance. Retry after a short delay.
|
||||||
|
bool resourceBusy = false;
|
||||||
|
if (m_tun2socksProcess) {
|
||||||
|
auto readOut = m_tun2socksProcess->readAllStandardOutput();
|
||||||
|
if (readOut.waitForFinished()) {
|
||||||
|
resourceBusy = readOut.returnValue().contains("resource busy");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (resourceBusy && m_tun2socksRetryCount < maxTun2SocksRetries) {
|
if (resourceBusy && m_tun2socksRetryCount < maxTun2SocksRetries) {
|
||||||
m_tun2socksRetryCount++;
|
m_tun2socksRetryCount++;
|
||||||
@@ -381,98 +331,3 @@ ErrorCode XrayProtocol::setupRouting()
|
|||||||
},
|
},
|
||||||
[]() { return ErrorCode::AmneziaServiceConnectionFailed; });
|
[]() { return ErrorCode::AmneziaServiceConnectionFailed; });
|
||||||
}
|
}
|
||||||
|
|
||||||
bool XrayProtocol::probeServerReachable()
|
|
||||||
{
|
|
||||||
if (m_remoteAddress.isEmpty() || m_serverPort <= 0) {
|
|
||||||
qWarning() << "XrayProtocol: skipping server reachability probe (address/port unknown)";
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
QTcpSocket sock;
|
|
||||||
sock.connectToHost(m_remoteAddress, static_cast<quint16>(m_serverPort));
|
|
||||||
const bool ok = sock.waitForConnected(m_serverProbeTimeoutMs);
|
|
||||||
if (!ok) {
|
|
||||||
qWarning() << "XrayProtocol: server" << m_remoteAddress << ":" << m_serverPort
|
|
||||||
<< "unreachable:" << sock.errorString();
|
|
||||||
}
|
|
||||||
sock.abort();
|
|
||||||
return ok;
|
|
||||||
}
|
|
||||||
|
|
||||||
void XrayProtocol::runConnectivityProbe(std::function<void(bool)> onResult)
|
|
||||||
{
|
|
||||||
if (m_remoteAddress.isEmpty() || m_serverPort <= 0) {
|
|
||||||
qWarning() << "XrayProtocol: connectivity probe skipped (server address/port unknown)";
|
|
||||||
onResult(true);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
auto *sock = new QTcpSocket(this);
|
|
||||||
|
|
||||||
QNetworkProxy proxy(QNetworkProxy::Socks5Proxy, QStringLiteral("127.0.0.1"),
|
|
||||||
static_cast<quint16>(m_socksPort), m_socksUser, m_socksPassword);
|
|
||||||
proxy.setCapabilities(QNetworkProxy::TunnelingCapability | QNetworkProxy::HostNameLookupCapability);
|
|
||||||
sock->setProxy(proxy);
|
|
||||||
|
|
||||||
auto *timeout = new QTimer(this);
|
|
||||||
timeout->setSingleShot(true);
|
|
||||||
|
|
||||||
auto done = QSharedPointer<bool>::create(false);
|
|
||||||
|
|
||||||
auto finish = [=](bool ok) {
|
|
||||||
if (*done)
|
|
||||||
return;
|
|
||||||
*done = true;
|
|
||||||
timeout->stop();
|
|
||||||
timeout->deleteLater();
|
|
||||||
sock->abort();
|
|
||||||
sock->deleteLater();
|
|
||||||
onResult(ok);
|
|
||||||
};
|
|
||||||
|
|
||||||
connect(sock, &QTcpSocket::connected, this, [=]() { finish(true); });
|
|
||||||
connect(sock, &QAbstractSocket::errorOccurred, this, [=](QAbstractSocket::SocketError) { finish(false); });
|
|
||||||
connect(timeout, &QTimer::timeout, this, [=]() { finish(false); });
|
|
||||||
|
|
||||||
timeout->start(m_connectivityProbeTimeoutMs);
|
|
||||||
sock->connectToHost(m_remoteAddress, static_cast<quint16>(m_serverPort));
|
|
||||||
}
|
|
||||||
|
|
||||||
void XrayProtocol::startLivenessMonitor()
|
|
||||||
{
|
|
||||||
if (!m_livenessTimer) {
|
|
||||||
m_livenessTimer = new QTimer(this);
|
|
||||||
connect(m_livenessTimer, &QTimer::timeout, this, [this]() {
|
|
||||||
if (connectionState() != Vpn::ConnectionState::Connected)
|
|
||||||
return;
|
|
||||||
|
|
||||||
runConnectivityProbe([this](bool ok) {
|
|
||||||
if (connectionState() != Vpn::ConnectionState::Connected)
|
|
||||||
return;
|
|
||||||
|
|
||||||
if (ok) {
|
|
||||||
m_livenessFailures = 0;
|
|
||||||
} else if (++m_livenessFailures >= m_maxLivenessFailures) {
|
|
||||||
qCritical() << "XrayProtocol: liveness check failed" << m_livenessFailures
|
|
||||||
<< "times in a row, the tunnel is dead";
|
|
||||||
stop();
|
|
||||||
setLastError(ErrorCode::XrayConnectionLost);
|
|
||||||
} else {
|
|
||||||
qWarning() << "XrayProtocol: liveness check failed (" << m_livenessFailures << "/"
|
|
||||||
<< m_maxLivenessFailures << ")";
|
|
||||||
}
|
|
||||||
});
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
m_livenessFailures = 0;
|
|
||||||
m_livenessTimer->start(m_livenessIntervalMs);
|
|
||||||
}
|
|
||||||
|
|
||||||
void XrayProtocol::stopLivenessMonitor()
|
|
||||||
{
|
|
||||||
if (m_livenessTimer)
|
|
||||||
m_livenessTimer->stop();
|
|
||||||
m_livenessFailures = 0;
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -6,16 +6,12 @@
|
|||||||
#include <QHostAddress>
|
#include <QHostAddress>
|
||||||
#include <QList>
|
#include <QList>
|
||||||
|
|
||||||
#include <functional>
|
|
||||||
|
|
||||||
#include "core/utils/errorCodes.h"
|
#include "core/utils/errorCodes.h"
|
||||||
#include "core/utils/routeModes.h"
|
#include "core/utils/routeModes.h"
|
||||||
#include "core/utils/commonStructs.h"
|
#include "core/utils/commonStructs.h"
|
||||||
#include "core/utils/ipcClient.h"
|
#include "core/utils/ipcClient.h"
|
||||||
#include "vpnProtocol.h"
|
#include "vpnProtocol.h"
|
||||||
|
|
||||||
class QTimer;
|
|
||||||
|
|
||||||
class XrayProtocol : public VpnProtocol
|
class XrayProtocol : public VpnProtocol
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
@@ -29,17 +25,10 @@ private:
|
|||||||
ErrorCode setupRouting();
|
ErrorCode setupRouting();
|
||||||
ErrorCode startTun2Socks();
|
ErrorCode startTun2Socks();
|
||||||
|
|
||||||
bool probeServerReachable();
|
|
||||||
void runConnectivityProbe(std::function<void(bool)> onResult);
|
|
||||||
void startLivenessMonitor();
|
|
||||||
void stopLivenessMonitor();
|
|
||||||
int extractServerPort() const;
|
|
||||||
|
|
||||||
QJsonObject m_xrayConfig;
|
QJsonObject m_xrayConfig;
|
||||||
amnezia::RouteMode m_routeMode;
|
amnezia::RouteMode m_routeMode;
|
||||||
QList<QHostAddress> m_dnsServers;
|
QList<QHostAddress> m_dnsServers;
|
||||||
QString m_remoteAddress;
|
QString m_remoteAddress;
|
||||||
int m_serverPort = 0;
|
|
||||||
|
|
||||||
QString m_socksUser;
|
QString m_socksUser;
|
||||||
QString m_socksPassword;
|
QString m_socksPassword;
|
||||||
@@ -49,22 +38,6 @@ private:
|
|||||||
int m_tun2socksRetryCount = 0;
|
int m_tun2socksRetryCount = 0;
|
||||||
static constexpr int maxTun2SocksRetries = 5;
|
static constexpr int maxTun2SocksRetries = 5;
|
||||||
static constexpr int tun2socksRetryDelayMs = 400;
|
static constexpr int tun2socksRetryDelayMs = 400;
|
||||||
|
|
||||||
bool m_connectivityProbeStarted = false;
|
|
||||||
bool m_tunResourceBusy = false;
|
|
||||||
|
|
||||||
QTimer *m_livenessTimer = nullptr;
|
|
||||||
int m_livenessFailures = 0;
|
|
||||||
|
|
||||||
static constexpr int defaultServerProbeTimeoutMs = 5000;
|
|
||||||
static constexpr int defaultConnectivityProbeTimeoutMs = 7000;
|
|
||||||
static constexpr int defaultLivenessIntervalMs = 15000;
|
|
||||||
static constexpr int defaultMaxLivenessFailures = 3;
|
|
||||||
|
|
||||||
int m_serverProbeTimeoutMs = defaultServerProbeTimeoutMs;
|
|
||||||
int m_connectivityProbeTimeoutMs = defaultConnectivityProbeTimeoutMs;
|
|
||||||
int m_livenessIntervalMs = defaultLivenessIntervalMs;
|
|
||||||
int m_maxLivenessFailures = defaultMaxLivenessFailures;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // XRAYPROTOCOL_H
|
#endif // XRAYPROTOCOL_H
|
||||||
|
|||||||
@@ -0,0 +1,10 @@
|
|||||||
|
#ifndef APP_UI_CONFIG_H
|
||||||
|
#define APP_UI_CONFIG_H
|
||||||
|
|
||||||
|
#define APP_INSTANCE_NAME "@CLIENT_APP_INSTANCE_NAME@"
|
||||||
|
#define APP_QML_ENTRYPOINT "@CLIENT_QML_ENTRYPOINT@"
|
||||||
|
#define APP_QML_IMPORT_PATH "@CLIENT_QML_IMPORT_PATH@"
|
||||||
|
#define APP_QML_PAGES_PREFIX "@CLIENT_QML_PAGES_PREFIX@"
|
||||||
|
#define APP_UI_FONT_RESOURCE "@CLIENT_UI_FONT_RESOURCE@"
|
||||||
|
|
||||||
|
#endif
|
||||||
@@ -15,8 +15,6 @@ namespace amnezia
|
|||||||
Awg2,
|
Awg2,
|
||||||
WireGuard,
|
WireGuard,
|
||||||
OpenVpn,
|
OpenVpn,
|
||||||
Cloak,
|
|
||||||
ShadowSocks,
|
|
||||||
Ipsec,
|
Ipsec,
|
||||||
Xray,
|
Xray,
|
||||||
SSXray,
|
SSXray,
|
||||||
|
|||||||
@@ -21,8 +21,6 @@ QString ContainerUtils::containerToString(DockerContainer c)
|
|||||||
{
|
{
|
||||||
if (c == DockerContainer::None)
|
if (c == DockerContainer::None)
|
||||||
return "none";
|
return "none";
|
||||||
if (c == DockerContainer::Cloak)
|
|
||||||
return "amnezia-openvpn-cloak";
|
|
||||||
if (c == DockerContainer::Awg)
|
if (c == DockerContainer::Awg)
|
||||||
return "amnezia-awg";
|
return "amnezia-awg";
|
||||||
if (c == DockerContainer::Awg2)
|
if (c == DockerContainer::Awg2)
|
||||||
@@ -64,8 +62,6 @@ QMap<DockerContainer, QString> ContainerUtils::containerHumanNames()
|
|||||||
{
|
{
|
||||||
return { { DockerContainer::None, "Not installed" },
|
return { { DockerContainer::None, "Not installed" },
|
||||||
{ DockerContainer::OpenVpn, "OpenVPN" },
|
{ DockerContainer::OpenVpn, "OpenVPN" },
|
||||||
{ DockerContainer::ShadowSocks, "OpenVPN over SS" },
|
|
||||||
{ DockerContainer::Cloak, "OpenVPN over Cloak" },
|
|
||||||
{ DockerContainer::WireGuard, "WireGuard" },
|
{ DockerContainer::WireGuard, "WireGuard" },
|
||||||
{ DockerContainer::Awg, "AmneziaWG" },
|
{ DockerContainer::Awg, "AmneziaWG" },
|
||||||
{ DockerContainer::Awg2, "AmneziaWG" },
|
{ DockerContainer::Awg2, "AmneziaWG" },
|
||||||
@@ -87,10 +83,6 @@ QMap<DockerContainer, QString> ContainerUtils::containerDescriptions()
|
|||||||
return { { DockerContainer::OpenVpn,
|
return { { DockerContainer::OpenVpn,
|
||||||
QObject::tr("OpenVPN is the most popular VPN protocol, with flexible configuration options. It uses its "
|
QObject::tr("OpenVPN is the most popular VPN protocol, with flexible configuration options. It uses its "
|
||||||
"own security protocol with SSL/TLS for key exchange.") },
|
"own security protocol with SSL/TLS for key exchange.") },
|
||||||
{ DockerContainer::ShadowSocks,
|
|
||||||
QObject::tr("This protocol is no longer supported.") },
|
|
||||||
{ DockerContainer::Cloak,
|
|
||||||
QObject::tr("This protocol is no longer supported.") },
|
|
||||||
{ DockerContainer::WireGuard,
|
{ DockerContainer::WireGuard,
|
||||||
QObject::tr("WireGuard - popular VPN protocol with high performance, high speed and low power "
|
QObject::tr("WireGuard - popular VPN protocol with high performance, high speed and low power "
|
||||||
"consumption.") },
|
"consumption.") },
|
||||||
@@ -202,9 +194,6 @@ QMap<DockerContainer, QString> ContainerUtils::containerDetailedDescriptions()
|
|||||||
|
|
||||||
ServiceType ContainerUtils::containerService(DockerContainer c)
|
ServiceType ContainerUtils::containerService(DockerContainer c)
|
||||||
{
|
{
|
||||||
if (isUnsupportedContainer(c)) {
|
|
||||||
return ServiceType::Vpn;
|
|
||||||
}
|
|
||||||
return ProtocolUtils::protocolService(defaultProtocol(c));
|
return ProtocolUtils::protocolService(defaultProtocol(c));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -213,8 +202,6 @@ Proto ContainerUtils::defaultProtocol(DockerContainer c)
|
|||||||
switch (c) {
|
switch (c) {
|
||||||
case DockerContainer::None: return Proto::Unknown;
|
case DockerContainer::None: return Proto::Unknown;
|
||||||
case DockerContainer::OpenVpn: return Proto::OpenVpn;
|
case DockerContainer::OpenVpn: return Proto::OpenVpn;
|
||||||
case DockerContainer::Cloak:
|
|
||||||
case DockerContainer::ShadowSocks: return Proto::Unknown;
|
|
||||||
case DockerContainer::WireGuard: return Proto::WireGuard;
|
case DockerContainer::WireGuard: return Proto::WireGuard;
|
||||||
case DockerContainer::Awg2: return Proto::Awg;
|
case DockerContainer::Awg2: return Proto::Awg;
|
||||||
case DockerContainer::Awg: return Proto::Awg;
|
case DockerContainer::Awg: return Proto::Awg;
|
||||||
@@ -265,8 +252,6 @@ bool ContainerUtils::isSupportedByCurrentPlatform(DockerContainer c)
|
|||||||
// macOS build using Network Extension – allow OpenVPN for parity with iOS.
|
// macOS build using Network Extension – allow OpenVPN for parity with iOS.
|
||||||
switch (c) {
|
switch (c) {
|
||||||
case DockerContainer::OpenVpn: return true;
|
case DockerContainer::OpenVpn: return true;
|
||||||
case DockerContainer::Cloak: return false;
|
|
||||||
case DockerContainer::ShadowSocks: return false;
|
|
||||||
case DockerContainer::WireGuard: return true;
|
case DockerContainer::WireGuard: return true;
|
||||||
case DockerContainer::Awg2: return true;
|
case DockerContainer::Awg2: return true;
|
||||||
case DockerContainer::Awg: return true;
|
case DockerContainer::Awg: return true;
|
||||||
@@ -351,10 +336,6 @@ int ContainerUtils::easySetupOrder(DockerContainer container)
|
|||||||
|
|
||||||
bool ContainerUtils::isShareable(DockerContainer container)
|
bool ContainerUtils::isShareable(DockerContainer container)
|
||||||
{
|
{
|
||||||
if (isUnsupportedContainer(container)) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
switch (container) {
|
switch (container) {
|
||||||
case DockerContainer::TorWebSite: return false;
|
case DockerContainer::TorWebSite: return false;
|
||||||
case DockerContainer::Dns: return false;
|
case DockerContainer::Dns: return false;
|
||||||
@@ -371,11 +352,6 @@ bool ContainerUtils::isAwgContainer(DockerContainer container)
|
|||||||
return container == DockerContainer::Awg || container == DockerContainer::Awg2;
|
return container == DockerContainer::Awg || container == DockerContainer::Awg2;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool ContainerUtils::isUnsupportedContainer(DockerContainer container)
|
|
||||||
{
|
|
||||||
return container == DockerContainer::Cloak || container == DockerContainer::ShadowSocks;
|
|
||||||
}
|
|
||||||
|
|
||||||
QJsonObject ContainerUtils::getProtocolConfigFromContainer(const Proto protocol, const QJsonObject &containerConfig)
|
QJsonObject ContainerUtils::getProtocolConfigFromContainer(const Proto protocol, const QJsonObject &containerConfig)
|
||||||
{
|
{
|
||||||
QString protocolConfigString = containerConfig.value(ProtocolUtils::protoToString(protocol))
|
QString protocolConfigString = containerConfig.value(ProtocolUtils::protoToString(protocol))
|
||||||
|
|||||||
@@ -45,8 +45,6 @@ namespace amnezia
|
|||||||
|
|
||||||
bool isAwgContainer(DockerContainer container);
|
bool isAwgContainer(DockerContainer container);
|
||||||
|
|
||||||
bool isUnsupportedContainer(DockerContainer container);
|
|
||||||
|
|
||||||
QJsonObject getProtocolConfigFromContainer(const Proto protocol, const QJsonObject &containerConfig);
|
QJsonObject getProtocolConfigFromContainer(const Proto protocol, const QJsonObject &containerConfig);
|
||||||
|
|
||||||
int installPageOrder(DockerContainer container);
|
int installPageOrder(DockerContainer container);
|
||||||
|
|||||||
@@ -71,9 +71,6 @@ namespace amnezia
|
|||||||
OpenSslFailed = 800,
|
OpenSslFailed = 800,
|
||||||
XrayExecutableCrashed = 803,
|
XrayExecutableCrashed = 803,
|
||||||
Tun2SockExecutableCrashed = 804,
|
Tun2SockExecutableCrashed = 804,
|
||||||
XrayServerUnreachable = 805,
|
|
||||||
XrayConnectivityCheckFailed = 806,
|
|
||||||
XrayConnectionLost = 807,
|
|
||||||
|
|
||||||
// import and install errors
|
// import and install errors
|
||||||
ImportInvalidConfigError = 900,
|
ImportInvalidConfigError = 900,
|
||||||
@@ -82,7 +79,6 @@ namespace amnezia
|
|||||||
ImportBackupFileUseRestoreInstead = 903,
|
ImportBackupFileUseRestoreInstead = 903,
|
||||||
RestoreBackupInvalidError = 904,
|
RestoreBackupInvalidError = 904,
|
||||||
LegacyApiV1NotSupportedError = 905,
|
LegacyApiV1NotSupportedError = 905,
|
||||||
LegacyContainerNotSupportedError = 906,
|
|
||||||
|
|
||||||
// Android errors
|
// Android errors
|
||||||
AndroidError = 1000,
|
AndroidError = 1000,
|
||||||
|
|||||||
@@ -59,9 +59,6 @@ QString errorString(ErrorCode code) {
|
|||||||
case (ErrorCode::OpenVpnExecutableMissing): errorMessage = QObject::tr("OpenVPN executable missing"); break;
|
case (ErrorCode::OpenVpnExecutableMissing): errorMessage = QObject::tr("OpenVPN executable missing"); break;
|
||||||
case (ErrorCode::AmneziaServiceConnectionFailed): errorMessage = QObject::tr("Amnezia helper service error"); break;
|
case (ErrorCode::AmneziaServiceConnectionFailed): errorMessage = QObject::tr("Amnezia helper service error"); break;
|
||||||
case (ErrorCode::OpenSslFailed): errorMessage = QObject::tr("OpenSSL failed"); break;
|
case (ErrorCode::OpenSslFailed): errorMessage = QObject::tr("OpenSSL failed"); break;
|
||||||
case (ErrorCode::XrayServerUnreachable): errorMessage = QObject::tr("Can't connect: the VPN server is unreachable"); break;
|
|
||||||
case (ErrorCode::XrayConnectivityCheckFailed): errorMessage = QObject::tr("Can't connect: no internet traffic flows through the tunnel"); break;
|
|
||||||
case (ErrorCode::XrayConnectionLost): errorMessage = QObject::tr("Connection lost: traffic stopped flowing through the tunnel"); break;
|
|
||||||
|
|
||||||
// VPN errors
|
// VPN errors
|
||||||
case (ErrorCode::OpenVpnAdaptersInUseError): errorMessage = QObject::tr("Can't connect: another VPN connection is active"); break;
|
case (ErrorCode::OpenVpnAdaptersInUseError): errorMessage = QObject::tr("Can't connect: another VPN connection is active"); break;
|
||||||
@@ -72,7 +69,6 @@ QString errorString(ErrorCode code) {
|
|||||||
case (ErrorCode::ImportBackupFileUseRestoreInstead): errorMessage = QObject::tr("Backup files cannot be imported here. Use 'Restore from backup' instead."); break;
|
case (ErrorCode::ImportBackupFileUseRestoreInstead): errorMessage = QObject::tr("Backup files cannot be imported here. Use 'Restore from backup' instead."); break;
|
||||||
case (ErrorCode::RestoreBackupInvalidError): errorMessage = QObject::tr("Backup file is corrupted or has invalid format"); break;
|
case (ErrorCode::RestoreBackupInvalidError): errorMessage = QObject::tr("Backup file is corrupted or has invalid format"); break;
|
||||||
case (ErrorCode::LegacyApiV1NotSupportedError): errorMessage = QObject::tr("This legacy Amnezia subscription format is no longer supported"); break;
|
case (ErrorCode::LegacyApiV1NotSupportedError): errorMessage = QObject::tr("This legacy Amnezia subscription format is no longer supported"); break;
|
||||||
case (ErrorCode::LegacyContainerNotSupportedError): errorMessage = QObject::tr("This protocol is no longer supported. Please select another protocol or remove this container from the server settings."); break;
|
|
||||||
case (ErrorCode::ImportOpenConfigError): errorMessage = QObject::tr("Unable to open config file"); break;
|
case (ErrorCode::ImportOpenConfigError): errorMessage = QObject::tr("Unable to open config file"); break;
|
||||||
case (ErrorCode::NoInstalledContainersError): errorMessage = QObject::tr("VPN Protocols is not installed.\n Please install VPN container at first"); break;
|
case (ErrorCode::NoInstalledContainersError): errorMessage = QObject::tr("VPN Protocols is not installed.\n Please install VPN container at first"); break;
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,25 @@
|
|||||||
|
#ifndef SWIFTINTEROP_H
|
||||||
|
#define SWIFTINTEROP_H
|
||||||
|
|
||||||
|
#if defined(Q_OS_IOS) || defined(MACOS_NE)
|
||||||
|
#include "core/utils/swiftInteropConfig.h"
|
||||||
|
|
||||||
|
#ifndef SWIFT_INTEROP_OBJC_HEADER
|
||||||
|
#ifdef AMNEZIA_SWIFT_OBJC_HEADER
|
||||||
|
#define SWIFT_INTEROP_OBJC_HEADER AMNEZIA_SWIFT_OBJC_HEADER
|
||||||
|
#else
|
||||||
|
#define SWIFT_INTEROP_OBJC_HEADER "AmneziaVPN-Swift.h"
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
#ifndef SWIFT_INTEROP_NAMESPACE
|
||||||
|
#ifdef AMNEZIA_SWIFT_NAMESPACE
|
||||||
|
#define SWIFT_INTEROP_NAMESPACE AMNEZIA_SWIFT_NAMESPACE
|
||||||
|
#else
|
||||||
|
#define SWIFT_INTEROP_NAMESPACE AmneziaVPN
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include SWIFT_INTEROP_OBJC_HEADER
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
#ifndef SWIFT_INTEROP_CONFIG_H
|
||||||
|
#define SWIFT_INTEROP_CONFIG_H
|
||||||
|
|
||||||
|
#define SWIFT_INTEROP_OBJC_HEADER "@CLIENT_SWIFT_OBJC_HEADER_NAME@"
|
||||||
|
#define SWIFT_INTEROP_NAMESPACE @CLIENT_SWIFT_MODULE_NAME@
|
||||||
|
|
||||||
|
#endif
|
||||||
@@ -8,7 +8,6 @@
|
|||||||
#include <QFileInfo>
|
#include <QFileInfo>
|
||||||
#include <QLocalSocket>
|
#include <QLocalSocket>
|
||||||
|
|
||||||
#include "daemon.h"
|
|
||||||
#include "daemonlocalserverconnection.h"
|
#include "daemonlocalserverconnection.h"
|
||||||
#include "leakdetector.h"
|
#include "leakdetector.h"
|
||||||
#include "logger.h"
|
#include "logger.h"
|
||||||
@@ -59,11 +58,8 @@ bool DaemonLocalServer::initialize() {
|
|||||||
|
|
||||||
DaemonLocalServerConnection* connection =
|
DaemonLocalServerConnection* connection =
|
||||||
new DaemonLocalServerConnection(&m_server, socket);
|
new DaemonLocalServerConnection(&m_server, socket);
|
||||||
connect(socket, &QLocalSocket::disconnected, connection, [connection]() {
|
connect(socket, &QLocalSocket::disconnected, connection,
|
||||||
logger.debug() << "Client connection dropped, deactivating daemon";
|
&DaemonLocalServerConnection::deleteLater);
|
||||||
Daemon::instance()->deactivate(true);
|
|
||||||
connection->deleteLater();
|
|
||||||
});
|
|
||||||
});
|
});
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
|
|||||||
@@ -2,49 +2,47 @@ enable_language(Swift)
|
|||||||
|
|
||||||
set(CLIENT_ROOT_DIR ${CMAKE_CURRENT_LIST_DIR}/../..)
|
set(CLIENT_ROOT_DIR ${CMAKE_CURRENT_LIST_DIR}/../..)
|
||||||
|
|
||||||
add_executable(networkextension)
|
add_executable(${CLIENT_IOS_NE_TARGET_NAME})
|
||||||
set_target_properties(networkextension PROPERTIES
|
set_target_properties(${CLIENT_IOS_NE_TARGET_NAME} PROPERTIES
|
||||||
XCODE_PRODUCT_TYPE com.apple.product-type.app-extension
|
XCODE_PRODUCT_TYPE com.apple.product-type.app-extension
|
||||||
BUNDLE_EXTENSION appex
|
BUNDLE_EXTENSION appex
|
||||||
|
|
||||||
MACOSX_BUNDLE_INFO_PLIST ${CMAKE_CURRENT_SOURCE_DIR}/Info.plist.in
|
MACOSX_BUNDLE_INFO_PLIST ${CMAKE_CURRENT_SOURCE_DIR}/Info.plist.in
|
||||||
MACOSX_BUNDLE_INFO_STRING "AmneziaVPNNetworkExtension"
|
MACOSX_BUNDLE_INFO_STRING "${CLIENT_NETWORK_EXTENSION_NAME}"
|
||||||
MACOSX_BUNDLE_BUNDLE_NAME "AmneziaVPNNetworkExtension"
|
MACOSX_BUNDLE_BUNDLE_NAME "${CLIENT_NETWORK_EXTENSION_NAME}"
|
||||||
MACOSX_BUNDLE_GUI_IDENTIFIER "${BUILD_IOS_APP_IDENTIFIER}.network-extension"
|
MACOSX_BUNDLE_GUI_IDENTIFIER "${BUILD_IOS_APP_IDENTIFIER}.network-extension"
|
||||||
MACOSX_BUNDLE_BUNDLE_VERSION "${CMAKE_PROJECT_VERSION_TWEAK}"
|
MACOSX_BUNDLE_BUNDLE_VERSION "${CMAKE_PROJECT_VERSION_TWEAK}"
|
||||||
MACOSX_BUNDLE_LONG_VERSION_STRING "${APPLE_PROJECT_VERSION}-${CMAKE_PROJECT_VERSION_TWEAK}"
|
MACOSX_BUNDLE_LONG_VERSION_STRING "${APPLE_PROJECT_VERSION}-${CMAKE_PROJECT_VERSION_TWEAK}"
|
||||||
MACOSX_BUNDLE_SHORT_VERSION_STRING "${APPLE_PROJECT_VERSION}"
|
MACOSX_BUNDLE_SHORT_VERSION_STRING "${APPLE_PROJECT_VERSION}"
|
||||||
|
|
||||||
XCODE_ATTRIBUTE_PRODUCT_BUNDLE_IDENTIFIER "${BUILD_IOS_APP_IDENTIFIER}.network-extension"
|
XCODE_ATTRIBUTE_PRODUCT_BUNDLE_IDENTIFIER "${BUILD_IOS_APP_IDENTIFIER}.network-extension"
|
||||||
XCODE_ATTRIBUTE_CODE_SIGN_ENTITLEMENTS ${CMAKE_CURRENT_SOURCE_DIR}/AmneziaVPNNetworkExtension.entitlements
|
XCODE_ATTRIBUTE_CODE_SIGN_ENTITLEMENTS ${CLIENT_IOS_NE_ENTITLEMENTS_PATH}
|
||||||
XCODE_ATTRIBUTE_MARKETING_VERSION "${APP_MAJOR_VERSION}"
|
XCODE_ATTRIBUTE_MARKETING_VERSION "${APP_MAJOR_VERSION}"
|
||||||
XCODE_ATTRIBUTE_CURRENT_PROJECT_VERSION "${BUILD_ID}"
|
XCODE_ATTRIBUTE_CURRENT_PROJECT_VERSION "${BUILD_ID}"
|
||||||
XCODE_ATTRIBUTE_PRODUCT_NAME "AmneziaVPNNetworkExtension"
|
XCODE_ATTRIBUTE_PRODUCT_NAME "${CLIENT_NETWORK_EXTENSION_NAME}"
|
||||||
|
|
||||||
XCODE_ATTRIBUTE_APPLICATION_EXTENSION_API_ONLY "YES"
|
XCODE_ATTRIBUTE_APPLICATION_EXTENSION_API_ONLY "YES"
|
||||||
XCODE_ATTRIBUTE_ENABLE_BITCODE "NO"
|
XCODE_ATTRIBUTE_ENABLE_BITCODE "NO"
|
||||||
XCODE_ATTRIBUTE_TARGETED_DEVICE_FAMILY "1,2"
|
XCODE_ATTRIBUTE_TARGETED_DEVICE_FAMILY "1,2"
|
||||||
|
|
||||||
XCODE_ATTRIBUTE_LD_RUNPATH_SEARCH_PATHS "@executable_path/../../Frameworks"
|
XCODE_ATTRIBUTE_LD_RUNPATH_SEARCH_PATHS "@executable_path/../../Frameworks"
|
||||||
|
|
||||||
XCODE_LINK_BUILD_PHASE_MODE KNOWN_LOCATION
|
|
||||||
)
|
)
|
||||||
|
|
||||||
if(DEPLOY)
|
if(DEPLOY)
|
||||||
set_target_properties(networkextension PROPERTIES
|
set_target_properties(${CLIENT_IOS_NE_TARGET_NAME} PROPERTIES
|
||||||
XCODE_ATTRIBUTE_CODE_SIGN_IDENTITY "Apple Distribution"
|
XCODE_ATTRIBUTE_CODE_SIGN_IDENTITY "Apple Distribution"
|
||||||
XCODE_ATTRIBUTE_CODE_SIGN_IDENTITY[variant=Debug] "Apple Development"
|
XCODE_ATTRIBUTE_CODE_SIGN_IDENTITY[variant=Debug] "Apple Development"
|
||||||
XCODE_ATTRIBUTE_CODE_SIGN_STYLE Manual
|
XCODE_ATTRIBUTE_CODE_SIGN_STYLE Manual
|
||||||
XCODE_ATTRIBUTE_PROVISIONING_PROFILE_SPECIFIER "distr ios.org.amnezia.AmneziaVPN"
|
XCODE_ATTRIBUTE_PROVISIONING_PROFILE_SPECIFIER "${CLIENT_IOS_NE_PROVISIONING_PROFILE_SPECIFIER}"
|
||||||
XCODE_ATTRIBUTE_PROVISIONING_PROFILE_SPECIFIER[variant=Debug] "dev ios.org.amnezia.AmneziaVPN"
|
XCODE_ATTRIBUTE_PROVISIONING_PROFILE_SPECIFIER[variant=Debug] "${CLIENT_IOS_NE_PROVISIONING_PROFILE_SPECIFIER_DEBUG}"
|
||||||
)
|
)
|
||||||
else()
|
else()
|
||||||
set_target_properties(networkextension PROPERTIES
|
set_target_properties(${CLIENT_IOS_NE_TARGET_NAME} PROPERTIES
|
||||||
XCODE_ATTRIBUTE_CODE_SIGN_STYLE Automatic
|
XCODE_ATTRIBUTE_CODE_SIGN_STYLE Automatic
|
||||||
)
|
)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
set_target_properties(networkextension PROPERTIES
|
set_target_properties(${CLIENT_IOS_NE_TARGET_NAME} PROPERTIES
|
||||||
XCODE_ATTRIBUTE_SWIFT_VERSION "5.0"
|
XCODE_ATTRIBUTE_SWIFT_VERSION "5.0"
|
||||||
XCODE_ATTRIBUTE_CLANG_ENABLE_MODULES "YES"
|
XCODE_ATTRIBUTE_CLANG_ENABLE_MODULES "YES"
|
||||||
XCODE_ATTRIBUTE_SWIFT_OBJC_BRIDGING_HEADER "${CMAKE_CURRENT_SOURCE_DIR}/WireGuardNetworkExtension-Bridging-Header.h"
|
XCODE_ATTRIBUTE_SWIFT_OBJC_BRIDGING_HEADER "${CMAKE_CURRENT_SOURCE_DIR}/WireGuardNetworkExtension-Bridging-Header.h"
|
||||||
@@ -52,8 +50,8 @@ set_target_properties(networkextension PROPERTIES
|
|||||||
XCODE_ATTRIBUTE_SWIFT_PRECOMPILE_BRIDGING_HEADER "NO"
|
XCODE_ATTRIBUTE_SWIFT_PRECOMPILE_BRIDGING_HEADER "NO"
|
||||||
)
|
)
|
||||||
|
|
||||||
set_target_properties("networkextension" PROPERTIES
|
set_target_properties("${CLIENT_IOS_NE_TARGET_NAME}" PROPERTIES
|
||||||
XCODE_ATTRIBUTE_DEVELOPMENT_TEAM "X7UJ388FXK"
|
XCODE_ATTRIBUTE_DEVELOPMENT_TEAM "${BUILD_VPN_DEVELOPMENT_TEAM}"
|
||||||
)
|
)
|
||||||
|
|
||||||
find_library(FW_ASSETS_LIBRARY AssetsLibrary)
|
find_library(FW_ASSETS_LIBRARY AssetsLibrary)
|
||||||
@@ -61,17 +59,17 @@ find_library(FW_MOBILE_CORE MobileCoreServices)
|
|||||||
find_library(FW_UI_KIT UIKit)
|
find_library(FW_UI_KIT UIKit)
|
||||||
find_library(FW_LIBRESOLV libresolv.9.tbd)
|
find_library(FW_LIBRESOLV libresolv.9.tbd)
|
||||||
|
|
||||||
target_link_libraries(networkextension PRIVATE ${FW_ASSETS_LIBRARY})
|
target_link_libraries(${CLIENT_IOS_NE_TARGET_NAME} PRIVATE ${FW_ASSETS_LIBRARY})
|
||||||
target_link_libraries(networkextension PRIVATE ${FW_MOBILE_CORE})
|
target_link_libraries(${CLIENT_IOS_NE_TARGET_NAME} PRIVATE ${FW_MOBILE_CORE})
|
||||||
target_link_libraries(networkextension PRIVATE ${FW_UI_KIT})
|
target_link_libraries(${CLIENT_IOS_NE_TARGET_NAME} PRIVATE ${FW_UI_KIT})
|
||||||
target_link_libraries(networkextension PRIVATE ${FW_LIBRESOLV})
|
target_link_libraries(${CLIENT_IOS_NE_TARGET_NAME} PRIVATE ${FW_LIBRESOLV})
|
||||||
|
|
||||||
target_compile_options(networkextension PRIVATE -DGROUP_ID=\"${BUILD_IOS_GROUP_IDENTIFIER}\")
|
target_compile_options(${CLIENT_IOS_NE_TARGET_NAME} PRIVATE -DGROUP_ID=\"${BUILD_IOS_GROUP_IDENTIFIER}\")
|
||||||
target_compile_options(networkextension PRIVATE -DNETWORK_EXTENSION=1)
|
target_compile_options(${CLIENT_IOS_NE_TARGET_NAME} PRIVATE -DNETWORK_EXTENSION=1)
|
||||||
|
|
||||||
set(WG_APPLE_SOURCE_DIR ${CLIENT_ROOT_DIR}/3rd/amneziawg-apple/Sources)
|
set(WG_APPLE_SOURCE_DIR ${CLIENT_ROOT_DIR}/3rd/amneziawg-apple/Sources)
|
||||||
|
|
||||||
target_sources(networkextension PRIVATE
|
target_sources(${CLIENT_IOS_NE_TARGET_NAME} PRIVATE
|
||||||
${WG_APPLE_SOURCE_DIR}/WireGuardKit/WireGuardAdapter.swift
|
${WG_APPLE_SOURCE_DIR}/WireGuardKit/WireGuardAdapter.swift
|
||||||
${WG_APPLE_SOURCE_DIR}/WireGuardKit/PacketTunnelSettingsGenerator.swift
|
${WG_APPLE_SOURCE_DIR}/WireGuardKit/PacketTunnelSettingsGenerator.swift
|
||||||
${WG_APPLE_SOURCE_DIR}/WireGuardKit/DNSResolver.swift
|
${WG_APPLE_SOURCE_DIR}/WireGuardKit/DNSResolver.swift
|
||||||
@@ -104,32 +102,22 @@ target_sources(networkextension PRIVATE
|
|||||||
${CLIENT_ROOT_DIR}/platforms/ios/iosglue.mm
|
${CLIENT_ROOT_DIR}/platforms/ios/iosglue.mm
|
||||||
)
|
)
|
||||||
|
|
||||||
target_sources(networkextension PRIVATE
|
target_sources(${CLIENT_IOS_NE_TARGET_NAME} PRIVATE
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/PrivacyInfo.xcprivacy
|
${CMAKE_CURRENT_SOURCE_DIR}/PrivacyInfo.xcprivacy
|
||||||
)
|
)
|
||||||
|
|
||||||
set_property(TARGET networkextension APPEND PROPERTY RESOURCE
|
set_property(TARGET ${CLIENT_IOS_NE_TARGET_NAME} APPEND PROPERTY RESOURCE
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/PrivacyInfo.xcprivacy
|
${CMAKE_CURRENT_SOURCE_DIR}/PrivacyInfo.xcprivacy
|
||||||
)
|
)
|
||||||
|
|
||||||
target_include_directories(networkextension PRIVATE ${CLIENT_ROOT_DIR})
|
target_include_directories(${CLIENT_IOS_NE_TARGET_NAME} PRIVATE ${CLIENT_ROOT_DIR})
|
||||||
target_include_directories(networkextension PRIVATE ${CMAKE_CURRENT_BINARY_DIR})
|
target_include_directories(${CLIENT_IOS_NE_TARGET_NAME} PRIVATE ${CMAKE_CURRENT_BINARY_DIR})
|
||||||
|
|
||||||
find_package(openvpnadapter REQUIRED)
|
find_package(openvpnadapter REQUIRED)
|
||||||
# FIXME(ygurov): https://github.com/conan-io/conan/issues/20034
|
target_link_libraries(${CLIENT_IOS_NE_TARGET_NAME} PRIVATE amnezia::openvpnadapter)
|
||||||
set_property(TARGET amnezia::openvpnadapter APPEND PROPERTY IMPORTED_CONFIGURATIONS DEBUG)
|
|
||||||
set_property(TARGET amnezia::openvpnadapter APPEND PROPERTY IMPORTED_CONFIGURATIONS MINSIZEREL)
|
|
||||||
set_property(TARGET amnezia::openvpnadapter APPEND PROPERTY IMPORTED_CONFIGURATIONS RELEASE)
|
|
||||||
set_property(TARGET amnezia::openvpnadapter APPEND PROPERTY IMPORTED_CONFIGURATIONS RELWITHDEBINFO)
|
|
||||||
target_link_libraries(networkextension PRIVATE amnezia::openvpnadapter)
|
|
||||||
|
|
||||||
find_package(awg-apple REQUIRED)
|
find_package(awg-apple REQUIRED)
|
||||||
target_link_libraries(networkextension PRIVATE amnezia::awg-apple)
|
target_link_libraries(${CLIENT_IOS_NE_TARGET_NAME} PRIVATE amnezia::awg-apple)
|
||||||
|
|
||||||
find_package(hev-socks5-tunnel REQUIRED)
|
find_package(hev-socks5-tunnel REQUIRED)
|
||||||
# FIXME(ygurov): https://github.com/conan-io/conan/issues/20034
|
target_link_libraries(${CLIENT_IOS_NE_TARGET_NAME} PRIVATE heiher::hev-socks5-tunnel)
|
||||||
set_property(TARGET heiher::hev-socks5-tunnel APPEND PROPERTY IMPORTED_CONFIGURATIONS DEBUG)
|
|
||||||
set_property(TARGET heiher::hev-socks5-tunnel APPEND PROPERTY IMPORTED_CONFIGURATIONS MINSIZEREL)
|
|
||||||
set_property(TARGET heiher::hev-socks5-tunnel APPEND PROPERTY IMPORTED_CONFIGURATIONS RELEASE)
|
|
||||||
set_property(TARGET heiher::hev-socks5-tunnel APPEND PROPERTY IMPORTED_CONFIGURATIONS RELWITHDEBINFO)
|
|
||||||
target_link_libraries(networkextension PRIVATE heiher::hev-socks5-tunnel)
|
|
||||||
|
|||||||
@@ -1,23 +1,23 @@
|
|||||||
enable_language(Swift)
|
enable_language(Swift)
|
||||||
message("Client message >> macos build >> AmneziaVPNNetworkExtension")
|
message("Client message >> macos build >> ${CLIENT_MACOS_NE_TARGET_NAME}")
|
||||||
set(CLIENT_ROOT_DIR ${CMAKE_CURRENT_LIST_DIR}/../..)
|
set(CLIENT_ROOT_DIR ${CMAKE_CURRENT_LIST_DIR}/../..)
|
||||||
|
|
||||||
add_executable(AmneziaVPNNetworkExtension)
|
add_executable(${CLIENT_MACOS_NE_TARGET_NAME})
|
||||||
|
|
||||||
message("executable_path is: @executable_path/../../Frameworks")
|
message("executable_path is: @executable_path/../../Frameworks")
|
||||||
set_target_properties(AmneziaVPNNetworkExtension PROPERTIES
|
set_target_properties(${CLIENT_MACOS_NE_TARGET_NAME} PROPERTIES
|
||||||
XCODE_PRODUCT_TYPE com.apple.product-type.app-extension
|
XCODE_PRODUCT_TYPE com.apple.product-type.app-extension
|
||||||
# MACOSX_BUNDLE YES
|
# MACOSX_BUNDLE YES
|
||||||
BUNDLE_EXTENSION appex
|
BUNDLE_EXTENSION appex
|
||||||
MACOSX_BUNDLE_SHORT_VERSION_STRING "${APPLE_PROJECT_VERSION}"
|
MACOSX_BUNDLE_SHORT_VERSION_STRING "${APPLE_PROJECT_VERSION}"
|
||||||
MACOSX_BUNDLE_INFO_STRING "AmneziaVPNNetworkExtension"
|
MACOSX_BUNDLE_INFO_STRING "${CLIENT_NETWORK_EXTENSION_NAME}"
|
||||||
MACOSX_BUNDLE_BUNDLE_NAME "AmneziaVPNNetworkExtension"
|
MACOSX_BUNDLE_BUNDLE_NAME "${CLIENT_NETWORK_EXTENSION_NAME}"
|
||||||
XCODE_ATTRIBUTE_PRODUCT_BUNDLE_IDENTIFIER "${BUILD_IOS_APP_IDENTIFIER}.network-extension"
|
XCODE_ATTRIBUTE_PRODUCT_BUNDLE_IDENTIFIER "${BUILD_IOS_APP_IDENTIFIER}.network-extension"
|
||||||
XCODE_ATTRIBUTE_PRODUCT_BUNDLE_NAME "${BUILD_IOS_APP_IDENTIFIER}.network-extension"
|
XCODE_ATTRIBUTE_PRODUCT_BUNDLE_NAME "${BUILD_IOS_APP_IDENTIFIER}.network-extension"
|
||||||
XCODE_ATTRIBUTE_CODE_SIGN_ENTITLEMENTS ${CMAKE_CURRENT_SOURCE_DIR}/AmneziaVPNNetworkExtension.entitlements
|
XCODE_ATTRIBUTE_CODE_SIGN_ENTITLEMENTS ${CLIENT_MACOS_NE_ENTITLEMENTS_PATH}
|
||||||
XCODE_ATTRIBUTE_MARKETING_VERSION "${APP_MAJOR_VERSION}"
|
XCODE_ATTRIBUTE_MARKETING_VERSION "${APP_MAJOR_VERSION}"
|
||||||
XCODE_ATTRIBUTE_CURRENT_PROJECT_VERSION "${CMAKE_PROJECT_VERSION_TWEAK}"
|
XCODE_ATTRIBUTE_CURRENT_PROJECT_VERSION "${CMAKE_PROJECT_VERSION_TWEAK}"
|
||||||
XCODE_ATTRIBUTE_PRODUCT_NAME "AmneziaVPNNetworkExtension"
|
XCODE_ATTRIBUTE_PRODUCT_NAME "${CLIENT_NETWORK_EXTENSION_NAME}"
|
||||||
|
|
||||||
XCODE_ATTRIBUTE_APPLICATION_EXTENSION_API_ONLY "YES"
|
XCODE_ATTRIBUTE_APPLICATION_EXTENSION_API_ONLY "YES"
|
||||||
XCODE_ATTRIBUTE_ENABLE_BITCODE "NO"
|
XCODE_ATTRIBUTE_ENABLE_BITCODE "NO"
|
||||||
@@ -29,7 +29,7 @@ set_target_properties(AmneziaVPNNetworkExtension PROPERTIES
|
|||||||
|
|
||||||
if(DEPLOY)
|
if(DEPLOY)
|
||||||
message("DEPLOY is ON")
|
message("DEPLOY is ON")
|
||||||
set_target_properties(AmneziaVPNNetworkExtension PROPERTIES
|
set_target_properties(${CLIENT_MACOS_NE_TARGET_NAME} PROPERTIES
|
||||||
XCODE_ATTRIBUTE_CODE_SIGN_IDENTITY "Apple Distribution"
|
XCODE_ATTRIBUTE_CODE_SIGN_IDENTITY "Apple Distribution"
|
||||||
XCODE_ATTRIBUTE_CODE_SIGN_IDENTITY[variant=Debug] "Apple Development"
|
XCODE_ATTRIBUTE_CODE_SIGN_IDENTITY[variant=Debug] "Apple Development"
|
||||||
XCODE_ATTRIBUTE_CODE_SIGN_STYLE Manual
|
XCODE_ATTRIBUTE_CODE_SIGN_STYLE Manual
|
||||||
@@ -37,12 +37,12 @@ if(DEPLOY)
|
|||||||
XCODE_ATTRIBUTE_PROVISIONING_PROFILE_SPECIFIER[variant=Debug] "dev macos.org.amnezia.amneziaVPN.NE"
|
XCODE_ATTRIBUTE_PROVISIONING_PROFILE_SPECIFIER[variant=Debug] "dev macos.org.amnezia.amneziaVPN.NE"
|
||||||
)
|
)
|
||||||
else()
|
else()
|
||||||
set_target_properties(AmneziaVPNNetworkExtension PROPERTIES
|
set_target_properties(${CLIENT_MACOS_NE_TARGET_NAME} PROPERTIES
|
||||||
XCODE_ATTRIBUTE_CODE_SIGN_STYLE Automatic
|
XCODE_ATTRIBUTE_CODE_SIGN_STYLE Automatic
|
||||||
)
|
)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
set_target_properties(AmneziaVPNNetworkExtension PROPERTIES
|
set_target_properties(${CLIENT_MACOS_NE_TARGET_NAME} PROPERTIES
|
||||||
XCODE_ATTRIBUTE_SWIFT_VERSION "5.0"
|
XCODE_ATTRIBUTE_SWIFT_VERSION "5.0"
|
||||||
XCODE_ATTRIBUTE_CLANG_ENABLE_MODULES "YES"
|
XCODE_ATTRIBUTE_CLANG_ENABLE_MODULES "YES"
|
||||||
XCODE_ATTRIBUTE_SWIFT_OBJC_BRIDGING_HEADER "${CMAKE_CURRENT_SOURCE_DIR}/WireGuardNetworkExtension-Bridging-Header.h"
|
XCODE_ATTRIBUTE_SWIFT_OBJC_BRIDGING_HEADER "${CMAKE_CURRENT_SOURCE_DIR}/WireGuardNetworkExtension-Bridging-Header.h"
|
||||||
@@ -50,8 +50,8 @@ set_target_properties(AmneziaVPNNetworkExtension PROPERTIES
|
|||||||
XCODE_ATTRIBUTE_SWIFT_PRECOMPILE_BRIDGING_HEADER "NO"
|
XCODE_ATTRIBUTE_SWIFT_PRECOMPILE_BRIDGING_HEADER "NO"
|
||||||
)
|
)
|
||||||
|
|
||||||
set_target_properties("AmneziaVPNNetworkExtension" PROPERTIES
|
set_target_properties("${CLIENT_MACOS_NE_TARGET_NAME}" PROPERTIES
|
||||||
XCODE_ATTRIBUTE_DEVELOPMENT_TEAM "X7UJ388FXK"
|
XCODE_ATTRIBUTE_DEVELOPMENT_TEAM "${BUILD_VPN_DEVELOPMENT_TEAM}"
|
||||||
)
|
)
|
||||||
|
|
||||||
find_library(FW_ASSETS_LIBRARY AssetsLibrary)
|
find_library(FW_ASSETS_LIBRARY AssetsLibrary)
|
||||||
@@ -63,17 +63,17 @@ find_library(FW_LIBRESOLV libresolv.9.tbd)
|
|||||||
# Set the root directory
|
# Set the root directory
|
||||||
set(CLIENT_ROOT_DIR ${CMAKE_CURRENT_LIST_DIR}/../..)
|
set(CLIENT_ROOT_DIR ${CMAKE_CURRENT_LIST_DIR}/../..)
|
||||||
|
|
||||||
target_link_libraries(AmneziaVPNNetworkExtension PRIVATE ${FW_LIBRESOLV})
|
target_link_libraries(${CLIENT_MACOS_NE_TARGET_NAME} PRIVATE ${FW_LIBRESOLV})
|
||||||
|
|
||||||
target_compile_options(AmneziaVPNNetworkExtension PRIVATE -DGROUP_ID=\"${BUILD_IOS_GROUP_IDENTIFIER}\")
|
target_compile_options(${CLIENT_MACOS_NE_TARGET_NAME} PRIVATE -DGROUP_ID=\"${BUILD_IOS_GROUP_IDENTIFIER}\")
|
||||||
target_compile_options(AmneziaVPNNetworkExtension PRIVATE -DNETWORK_EXTENSION=1)
|
target_compile_options(${CLIENT_MACOS_NE_TARGET_NAME} PRIVATE -DNETWORK_EXTENSION=1)
|
||||||
|
|
||||||
set(WG_APPLE_SOURCE_DIR ${CLIENT_ROOT_DIR}/3rd/amneziawg-apple/Sources)
|
set(WG_APPLE_SOURCE_DIR ${CLIENT_ROOT_DIR}/3rd/amneziawg-apple/Sources)
|
||||||
|
|
||||||
message("WG_APPLE_SOURCE_DIR is: ${WG_APPLE_SOURCE_DIR}")
|
message("WG_APPLE_SOURCE_DIR is: ${WG_APPLE_SOURCE_DIR}")
|
||||||
message("CLIENT_ROOT_DIR is: ${CLIENT_ROOT_DIR}")
|
message("CLIENT_ROOT_DIR is: ${CLIENT_ROOT_DIR}")
|
||||||
|
|
||||||
target_sources(AmneziaVPNNetworkExtension PRIVATE
|
target_sources(${CLIENT_MACOS_NE_TARGET_NAME} PRIVATE
|
||||||
${WG_APPLE_SOURCE_DIR}/WireGuardKit/WireGuardAdapter.swift
|
${WG_APPLE_SOURCE_DIR}/WireGuardKit/WireGuardAdapter.swift
|
||||||
${WG_APPLE_SOURCE_DIR}/WireGuardKit/PacketTunnelSettingsGenerator.swift
|
${WG_APPLE_SOURCE_DIR}/WireGuardKit/PacketTunnelSettingsGenerator.swift
|
||||||
${WG_APPLE_SOURCE_DIR}/WireGuardKit/DNSResolver.swift
|
${WG_APPLE_SOURCE_DIR}/WireGuardKit/DNSResolver.swift
|
||||||
@@ -106,22 +106,22 @@ target_sources(AmneziaVPNNetworkExtension PRIVATE
|
|||||||
${CLIENT_ROOT_DIR}/platforms/ios/XrayConfig.swift
|
${CLIENT_ROOT_DIR}/platforms/ios/XrayConfig.swift
|
||||||
)
|
)
|
||||||
|
|
||||||
target_sources(AmneziaVPNNetworkExtension PRIVATE
|
target_sources(${CLIENT_MACOS_NE_TARGET_NAME} PRIVATE
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/PrivacyInfo.xcprivacy
|
${CMAKE_CURRENT_SOURCE_DIR}/PrivacyInfo.xcprivacy
|
||||||
)
|
)
|
||||||
|
|
||||||
set_property(TARGET AmneziaVPNNetworkExtension APPEND PROPERTY RESOURCE
|
set_property(TARGET ${CLIENT_MACOS_NE_TARGET_NAME} APPEND PROPERTY RESOURCE
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/PrivacyInfo.xcprivacy
|
${CMAKE_CURRENT_SOURCE_DIR}/PrivacyInfo.xcprivacy
|
||||||
)
|
)
|
||||||
|
|
||||||
target_include_directories(AmneziaVPNNetworkExtension PRIVATE ${CLIENT_ROOT_DIR})
|
target_include_directories(${CLIENT_MACOS_NE_TARGET_NAME} PRIVATE ${CLIENT_ROOT_DIR})
|
||||||
target_include_directories(AmneziaVPNNetworkExtension PRIVATE ${CMAKE_CURRENT_BINARY_DIR})
|
target_include_directories(${CLIENT_MACOS_NE_TARGET_NAME} PRIVATE ${CMAKE_CURRENT_BINARY_DIR})
|
||||||
|
|
||||||
find_package(openvpnadapter REQUIRED)
|
find_package(openvpnadapter REQUIRED)
|
||||||
target_link_libraries(AmneziaVPNNetworkExtension PRIVATE amnezia::openvpnadapter)
|
target_link_libraries(${CLIENT_MACOS_NE_TARGET_NAME} PRIVATE amnezia::openvpnadapter)
|
||||||
|
|
||||||
find_package(awg-apple REQUIRED)
|
find_package(awg-apple REQUIRED)
|
||||||
target_link_libraries(AmneziaVPNNetworkExtension PRIVATE amnezia::awg-apple)
|
target_link_libraries(${CLIENT_MACOS_NE_TARGET_NAME} PRIVATE amnezia::awg-apple)
|
||||||
|
|
||||||
find_package(hev-socks5-tunnel REQUIRED)
|
find_package(hev-socks5-tunnel REQUIRED)
|
||||||
target_link_libraries(AmneziaVPNNetworkExtension PRIVATE heiher::hev-socks5-tunnel)
|
target_link_libraries(${CLIENT_MACOS_NE_TARGET_NAME} PRIVATE heiher::hev-socks5-tunnel)
|
||||||
|
|||||||
+3
-2
@@ -5,6 +5,7 @@
|
|||||||
#include "amneziaApplication.h"
|
#include "amneziaApplication.h"
|
||||||
#include "core/utils/osSignalHandler.h"
|
#include "core/utils/osSignalHandler.h"
|
||||||
#include "core/utils/migrations.h"
|
#include "core/utils/migrations.h"
|
||||||
|
#include "core/utils/appUiConfig.h"
|
||||||
#include "version.h"
|
#include "version.h"
|
||||||
|
|
||||||
#ifdef Q_OS_WIN
|
#ifdef Q_OS_WIN
|
||||||
@@ -19,9 +20,9 @@
|
|||||||
bool isAnotherInstanceRunning()
|
bool isAnotherInstanceRunning()
|
||||||
{
|
{
|
||||||
QLocalSocket socket;
|
QLocalSocket socket;
|
||||||
socket.connectToServer("AmneziaVPNInstance");
|
socket.connectToServer(APP_INSTANCE_NAME);
|
||||||
if (socket.waitForConnected(500)) {
|
if (socket.waitForConnected(500)) {
|
||||||
qWarning() << "AmneziaVPN is already running";
|
qWarning() << APPLICATION_NAME << "is already running";
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
|
|||||||
@@ -4,7 +4,8 @@
|
|||||||
|
|
||||||
#import "StoreKitController.h"
|
#import "StoreKitController.h"
|
||||||
#import <StoreKit/StoreKit.h>
|
#import <StoreKit/StoreKit.h>
|
||||||
#import <AmneziaVPN-Swift.h>
|
#include <QtCore/qglobal.h>
|
||||||
|
#import "core/utils/swiftInterop.h"
|
||||||
|
|
||||||
#include <QtCore/QDebug>
|
#include <QtCore/QDebug>
|
||||||
#include <QtCore/QString>
|
#include <QtCore/QString>
|
||||||
|
|||||||
@@ -18,7 +18,10 @@ using namespace QKeychain;
|
|||||||
namespace {
|
namespace {
|
||||||
constexpr const char *settingsKeyTag = "settingsKeyTag";
|
constexpr const char *settingsKeyTag = "settingsKeyTag";
|
||||||
constexpr const char *settingsIvTag = "settingsIvTag";
|
constexpr const char *settingsIvTag = "settingsIvTag";
|
||||||
constexpr const char *keyChainName = "AmneziaVPN-Keychain";
|
#ifndef CLIENT_KEYCHAIN_NAME_STR
|
||||||
|
#define CLIENT_KEYCHAIN_NAME_STR "AmneziaVPN-Keychain"
|
||||||
|
#endif
|
||||||
|
constexpr const char *keyChainName = CLIENT_KEYCHAIN_NAME_STR;
|
||||||
}
|
}
|
||||||
|
|
||||||
SecureQSettings::SecureQSettings(const QString &organization, const QString &application, QObject *parent, bool enableEncryption)
|
SecureQSettings::SecureQSettings(const QString &organization, const QString &application, QObject *parent, bool enableEncryption)
|
||||||
|
|||||||
@@ -1,6 +1,5 @@
|
|||||||
sudo docker ps -a | grep amnezia | awk '{print $1}' | xargs sudo docker stop;\
|
sudo docker ps -a | grep amnezia | awk '{print $1}' | xargs sudo docker stop;\
|
||||||
sudo docker ps -a | grep amnezia | awk '{print $1}' | xargs sudo docker rm -fv;\
|
sudo docker ps -a | grep amnezia | awk '{print $1}' | xargs sudo docker rm -fv;\
|
||||||
sudo docker images -a --format table | grep amnezia | awk '{print $3, $1 ":" $2}' | xargs sudo docker rmi;\
|
sudo docker images -a --format table | grep amnezia | awk '{print $3, $1 ":" $2}' | xargs sudo docker rmi;\
|
||||||
sudo docker volume ls | grep amnezia | awk '{print $2}' | xargs sudo docker volume rm -f;\
|
|
||||||
sudo docker network ls | grep amnezia-dns-net | awk '{print $1}' | xargs sudo docker network rm;\
|
sudo docker network ls | grep amnezia-dns-net | awk '{print $1}' | xargs sudo docker network rm;\
|
||||||
sudo rm -frd /opt/amnezia
|
sudo rm -frd /opt/amnezia
|
||||||
|
|||||||
@@ -1,3 +1,4 @@
|
|||||||
sudo docker stop $CONTAINER_NAME;\
|
sudo docker stop $CONTAINER_NAME;\
|
||||||
sudo docker rm -fv $CONTAINER_NAME;\
|
sudo docker rm -fv $CONTAINER_NAME;\
|
||||||
sudo docker rmi $CONTAINER_NAME;
|
sudo docker rmi $CONTAINER_NAME;\
|
||||||
|
test "$REMOVE_CONTAINER_DATA" = "1" && sudo docker volume rm -f ${CONTAINER_NAME}-data 2>/dev/null || true
|
||||||
|
|||||||
@@ -475,7 +475,8 @@ bool SubscriptionUiController::deactivateExternalDevice(const QString &serverId,
|
|||||||
void SubscriptionUiController::validateConfig()
|
void SubscriptionUiController::validateConfig()
|
||||||
{
|
{
|
||||||
const QString serverId = m_serversController->getDefaultServerId();
|
const QString serverId = m_serversController->getDefaultServerId();
|
||||||
if (serverId.isEmpty()) {
|
if (!serverId.isEmpty() && m_serversController->isLegacyApiV1Server(serverId)) {
|
||||||
|
emit unsupportedConnectDrawerRequested();
|
||||||
emit configValidated(false);
|
emit configValidated(false);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -8,8 +8,6 @@
|
|||||||
|
|
||||||
#include "amneziaApplication.h"
|
#include "amneziaApplication.h"
|
||||||
#include "core/controllers/serversController.h"
|
#include "core/controllers/serversController.h"
|
||||||
#include "core/models/containerConfig.h"
|
|
||||||
#include "core/utils/containerEnum.h"
|
|
||||||
|
|
||||||
ConnectionUiController::ConnectionUiController(ConnectionController* connectionController,
|
ConnectionUiController::ConnectionUiController(ConnectionController* connectionController,
|
||||||
ServersController* serversController,
|
ServersController* serversController,
|
||||||
@@ -35,7 +33,7 @@ void ConnectionUiController::openConnection()
|
|||||||
ErrorCode errorCode = m_connectionController->openConnection(serverId);
|
ErrorCode errorCode = m_connectionController->openConnection(serverId);
|
||||||
|
|
||||||
if (errorCode != ErrorCode::NoError) {
|
if (errorCode != ErrorCode::NoError) {
|
||||||
notifyConnectionBlocked(errorCode);
|
emit connectionErrorOccurred(errorCode);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -132,36 +130,10 @@ void ConnectionUiController::toggleConnection()
|
|||||||
} else if (isConnected()) {
|
} else if (isConnected()) {
|
||||||
closeConnection();
|
closeConnection();
|
||||||
} else {
|
} else {
|
||||||
const QString serverId = m_serversController->getDefaultServerId();
|
|
||||||
if (serverId.isEmpty()) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
const ErrorCode errorCode = m_connectionController->isConnectionSupported(serverId);
|
|
||||||
if (errorCode != ErrorCode::NoError) {
|
|
||||||
notifyConnectionBlocked(errorCode);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
emit prepareConfig();
|
emit prepareConfig();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void ConnectionUiController::notifyConnectionBlocked(ErrorCode errorCode)
|
|
||||||
{
|
|
||||||
if (errorCode == ErrorCode::LegacyApiV1NotSupportedError) {
|
|
||||||
emit unsupportedConnectDrawerRequested();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (errorCode == ErrorCode::NoInstalledContainersError) {
|
|
||||||
emit noInstalledContainers();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
emit connectionErrorOccurred(errorCode);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool ConnectionUiController::isConnectionInProgress() const
|
bool ConnectionUiController::isConnectionInProgress() const
|
||||||
{
|
{
|
||||||
return m_isConnectionInProgress;
|
return m_isConnectionInProgress;
|
||||||
@@ -171,32 +143,3 @@ bool ConnectionUiController::isConnected() const
|
|||||||
{
|
{
|
||||||
return m_isConnected;
|
return m_isConnected;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool ConnectionUiController::isRevokeBlockedDuringActiveConnection(const QString &serverId, int containerIndex,
|
|
||||||
const QString &clientId) const
|
|
||||||
{
|
|
||||||
if (clientId.isEmpty() || (!isConnected() && !isConnectionInProgress())) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (m_serversController->getDefaultServerId() != serverId) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (static_cast<int>(m_serversController->getDefaultContainer(serverId)) != containerIndex) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
const auto adminConfig = m_serversController->selfHostedAdminConfig(serverId);
|
|
||||||
if (!adminConfig.has_value()) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
const QString connectionClientId =
|
|
||||||
adminConfig->containerConfig(static_cast<DockerContainer>(containerIndex)).protocolConfig.clientId();
|
|
||||||
if (connectionClientId.isEmpty()) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
return connectionClientId == clientId || connectionClientId.contains(clientId);
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -35,8 +35,6 @@ public slots:
|
|||||||
void openConnection();
|
void openConnection();
|
||||||
void closeConnection();
|
void closeConnection();
|
||||||
|
|
||||||
bool isRevokeBlockedDuringActiveConnection(const QString &serverId, int containerIndex, const QString &clientId) const;
|
|
||||||
|
|
||||||
ErrorCode getLastConnectionError();
|
ErrorCode getLastConnectionError();
|
||||||
void onConnectionStateChanged(Vpn::ConnectionState state);
|
void onConnectionStateChanged(Vpn::ConnectionState state);
|
||||||
|
|
||||||
@@ -50,12 +48,9 @@ signals:
|
|||||||
void connectButtonClicked();
|
void connectButtonClicked();
|
||||||
void preparingConfig();
|
void preparingConfig();
|
||||||
void prepareConfig();
|
void prepareConfig();
|
||||||
void unsupportedConnectDrawerRequested();
|
|
||||||
void noInstalledContainers();
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
Vpn::ConnectionState getCurrentConnectionState();
|
Vpn::ConnectionState getCurrentConnectionState();
|
||||||
void notifyConnectionBlocked(ErrorCode errorCode);
|
|
||||||
|
|
||||||
ConnectionController* m_connectionController;
|
ConnectionController* m_connectionController;
|
||||||
ServersController* m_serversController;
|
ServersController* m_serversController;
|
||||||
|
|||||||
@@ -2,6 +2,7 @@
|
|||||||
|
|
||||||
#include "ui/utils/converter.h"
|
#include "ui/utils/converter.h"
|
||||||
#include "core/utils/errorStrings.h"
|
#include "core/utils/errorStrings.h"
|
||||||
|
#include "core/utils/appUiConfig.h"
|
||||||
#if defined(MACOS_NE)
|
#if defined(MACOS_NE)
|
||||||
#include "platforms/ios/ios_controller.h"
|
#include "platforms/ios/ios_controller.h"
|
||||||
#endif
|
#endif
|
||||||
@@ -63,7 +64,7 @@ QString PageController::getPagePath(PageLoader::PageEnum page)
|
|||||||
{
|
{
|
||||||
QMetaEnum metaEnum = QMetaEnum::fromType<PageLoader::PageEnum>();
|
QMetaEnum metaEnum = QMetaEnum::fromType<PageLoader::PageEnum>();
|
||||||
QString pageName = metaEnum.valueToKey(static_cast<int>(page));
|
QString pageName = metaEnum.valueToKey(static_cast<int>(page));
|
||||||
return "qrc:/ui/qml/Pages2/" + pageName + ".qml";
|
return QStringLiteral(APP_QML_PAGES_PREFIX) + pageName + QStringLiteral(".qml");
|
||||||
}
|
}
|
||||||
|
|
||||||
void PageController::closeWindow()
|
void PageController::closeWindow()
|
||||||
|
|||||||
@@ -75,7 +75,13 @@ InstallUiController::InstallUiController(InstallController *installController,
|
|||||||
m_connectionController(connectionController)
|
m_connectionController(connectionController)
|
||||||
{
|
{
|
||||||
connect(m_installController, &InstallController::configValidated, this, &InstallUiController::configValidated);
|
connect(m_installController, &InstallController::configValidated, this, &InstallUiController::configValidated);
|
||||||
connect(m_installController, &InstallController::validationErrorOccurred, this, &InstallUiController::installationErrorOccurred);
|
connect(m_installController, &InstallController::validationErrorOccurred, this, [this](ErrorCode errorCode) {
|
||||||
|
if (errorCode == ErrorCode::NoInstalledContainersError) {
|
||||||
|
emit noInstalledContainers();
|
||||||
|
} else {
|
||||||
|
emit installationErrorOccurred(errorCode);
|
||||||
|
}
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
InstallUiController::~InstallUiController()
|
InstallUiController::~InstallUiController()
|
||||||
@@ -211,11 +217,13 @@ void InstallUiController::scanServerForInstalledContainers(const QString &server
|
|||||||
emit installationErrorOccurred(errorCode);
|
emit installationErrorOccurred(errorCode);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool InstallUiController::buildContainerConfigFromModel(int containerIndex, int protocolIndex, ContainerConfig &containerConfig)
|
void InstallUiController::updateContainer(const QString &serverId, int containerIndex, int protocolIndex, bool closePage)
|
||||||
{
|
{
|
||||||
DockerContainer container = static_cast<DockerContainer>(containerIndex);
|
DockerContainer container = static_cast<DockerContainer>(containerIndex);
|
||||||
|
|
||||||
Proto protocolType = static_cast<Proto>(protocolIndex);
|
Proto protocolType = static_cast<Proto>(protocolIndex);
|
||||||
|
|
||||||
|
ContainerConfig containerConfig;
|
||||||
containerConfig.container = container;
|
containerConfig.container = container;
|
||||||
|
|
||||||
switch (protocolType) {
|
switch (protocolType) {
|
||||||
@@ -263,41 +271,6 @@ bool InstallUiController::buildContainerConfigFromModel(int containerIndex, int
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
default:
|
default:
|
||||||
return false;
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
void InstallUiController::updateClientConfig(const QString &serverId, int containerIndex, int protocolIndex, bool closePage)
|
|
||||||
{
|
|
||||||
DockerContainer container = static_cast<DockerContainer>(containerIndex);
|
|
||||||
Proto protocolType = static_cast<Proto>(protocolIndex);
|
|
||||||
|
|
||||||
ContainerConfig containerConfig;
|
|
||||||
if (!buildContainerConfigFromModel(containerIndex, protocolIndex, containerConfig)) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
ErrorCode errorCode = m_installController->updateClientConfig(serverId, container, containerConfig);
|
|
||||||
|
|
||||||
if (errorCode == ErrorCode::NoError) {
|
|
||||||
ContainerConfig updatedConfig = m_serversController->getContainerConfig(serverId, container);
|
|
||||||
m_protocolModel->updateModel(updatedConfig);
|
|
||||||
updateProtocolConfigModel(serverId, static_cast<int>(container), static_cast<int>(protocolType));
|
|
||||||
emit updateContainerFinished(tr("Settings updated successfully"), closePage);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
emit installationErrorOccurred(errorCode);
|
|
||||||
}
|
|
||||||
|
|
||||||
void InstallUiController::updateServerConfig(const QString &serverId, int containerIndex, int protocolIndex, bool closePage)
|
|
||||||
{
|
|
||||||
DockerContainer container = static_cast<DockerContainer>(containerIndex);
|
|
||||||
Proto protocolType = static_cast<Proto>(protocolIndex);
|
|
||||||
|
|
||||||
ContainerConfig containerConfig;
|
|
||||||
if (!buildContainerConfigFromModel(containerIndex, protocolIndex, containerConfig)) {
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
ContainerConfig oldContainerConfig = m_serversController->getContainerConfig(serverId, container);
|
ContainerConfig oldContainerConfig = m_serversController->getContainerConfig(serverId, container);
|
||||||
@@ -332,13 +305,13 @@ void InstallUiController::updateServerConfig(const QString &serverId, int contai
|
|||||||
QFuture<ErrorCode> future =
|
QFuture<ErrorCode> future =
|
||||||
QtConcurrent::run([installController, serverId, container, oldConfigCopy,
|
QtConcurrent::run([installController, serverId, container, oldConfigCopy,
|
||||||
newConfigCopy]() mutable -> ErrorCode {
|
newConfigCopy]() mutable -> ErrorCode {
|
||||||
return installController->updateServerConfig(serverId, container, oldConfigCopy, newConfigCopy);
|
return installController->updateContainer(serverId, container, oldConfigCopy, newConfigCopy);
|
||||||
});
|
});
|
||||||
watcher->setFuture(future);
|
watcher->setFuture(future);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
ErrorCode errorCode = m_installController->updateServerConfig(serverId, container, oldContainerConfig, containerConfig);
|
ErrorCode errorCode = m_installController->updateContainer(serverId, container, oldContainerConfig, containerConfig);
|
||||||
|
|
||||||
if (errorCode == ErrorCode::NoError) {
|
if (errorCode == ErrorCode::NoError) {
|
||||||
ContainerConfig updatedConfig = m_serversController->getContainerConfig(serverId, container);
|
ContainerConfig updatedConfig = m_serversController->getContainerConfig(serverId, container);
|
||||||
|
|||||||
@@ -64,8 +64,7 @@ public slots:
|
|||||||
|
|
||||||
void scanServerForInstalledContainers(const QString &serverId);
|
void scanServerForInstalledContainers(const QString &serverId);
|
||||||
|
|
||||||
void updateServerConfig(const QString &serverId, int containerIndex, int protocolIndex, bool closePage = true);
|
void updateContainer(const QString &serverId, int containerIndex, int protocolIndex, bool closePage = true);
|
||||||
void updateClientConfig(const QString &serverId, int containerIndex, int protocolIndex, bool closePage = true);
|
|
||||||
|
|
||||||
void removeServer(const QString &serverId);
|
void removeServer(const QString &serverId);
|
||||||
void rebootServer(const QString &serverId);
|
void rebootServer(const QString &serverId);
|
||||||
@@ -133,6 +132,7 @@ signals:
|
|||||||
void cachedProfileCleared(const QString &message);
|
void cachedProfileCleared(const QString &message);
|
||||||
void apiConfigRemoved(const QString &message);
|
void apiConfigRemoved(const QString &message);
|
||||||
|
|
||||||
|
void noInstalledContainers();
|
||||||
void configValidated(bool isValid);
|
void configValidated(bool isValid);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
@@ -162,8 +162,6 @@ private:
|
|||||||
QString m_privateKeyPassphrase;
|
QString m_privateKeyPassphrase;
|
||||||
|
|
||||||
void updateProtocolConfigModel(const QString &serverId, int containerIndex, int protocolIndex);
|
void updateProtocolConfigModel(const QString &serverId, int containerIndex, int protocolIndex);
|
||||||
|
|
||||||
bool buildContainerConfigFromModel(int containerIndex, int protocolIndex, ContainerConfig &containerConfig);
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // INSTALLUICONTROLLER_H
|
#endif // INSTALLUICONTROLLER_H
|
||||||
|
|||||||
@@ -156,17 +156,7 @@ void ServersUiController::updateModel()
|
|||||||
|
|
||||||
m_serversModel->updateModel(m_orderedServerDescriptions, defaultServerId);
|
m_serversModel->updateModel(m_orderedServerDescriptions, defaultServerId);
|
||||||
|
|
||||||
if (!m_processedServerId.isEmpty()) {
|
updateContainersModel();
|
||||||
if (isServerFromApi(m_processedServerId)) {
|
|
||||||
const auto &description = serverDescriptionById(m_processedServerId);
|
|
||||||
if (description.isApiV2 && description.isCountrySelectionAvailable
|
|
||||||
&& !description.apiAvailableCountries.isEmpty()) {
|
|
||||||
emit updateApiCountryModel();
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
updateContainersModel();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
updateDefaultServerContainersModel();
|
updateDefaultServerContainersModel();
|
||||||
|
|
||||||
if (hadServersFromGatewayBefore != hasServersFromGatewayNow) {
|
if (hadServersFromGatewayBefore != hasServersFromGatewayNow) {
|
||||||
@@ -360,14 +350,19 @@ void ServersUiController::setProcessedServerId(const QString &serverId)
|
|||||||
m_processedServerId = normalizedServerId;
|
m_processedServerId = normalizedServerId;
|
||||||
|
|
||||||
if (newIndex >= 0) {
|
if (newIndex >= 0) {
|
||||||
if (isServerFromApi(m_processedServerId)) {
|
updateContainersModel();
|
||||||
const auto &description = serverDescriptionById(m_processedServerId);
|
|
||||||
if (description.isApiV2 && description.isCountrySelectionAvailable
|
for (const auto &description : m_orderedServerDescriptions) {
|
||||||
&& !description.apiAvailableCountries.isEmpty()) {
|
if (description.serverId != normalizedServerId) {
|
||||||
emit updateApiCountryModel();
|
continue;
|
||||||
}
|
}
|
||||||
} else {
|
if (description.isApiV2) {
|
||||||
updateContainersModel();
|
if (description.isCountrySelectionAvailable && !description.apiAvailableCountries.isEmpty()) {
|
||||||
|
emit updateApiCountryModel();
|
||||||
|
}
|
||||||
|
emit updateApiServicesModel();
|
||||||
|
}
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -113,6 +113,7 @@ signals:
|
|||||||
void processedContainerIndexChanged(int index);
|
void processedContainerIndexChanged(int index);
|
||||||
void hasServersFromGatewayApiChanged();
|
void hasServersFromGatewayApiChanged();
|
||||||
void updateApiCountryModel();
|
void updateApiCountryModel();
|
||||||
|
void updateApiServicesModel();
|
||||||
|
|
||||||
public:
|
public:
|
||||||
void updateModel();
|
void updateModel();
|
||||||
|
|||||||
@@ -17,15 +17,17 @@
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(Q_OS_IOS) || defined(MACOS_NE)
|
#if defined(Q_OS_IOS) || defined(MACOS_NE)
|
||||||
#include <AmneziaVPN-Swift.h>
|
#include "core/utils/swiftInterop.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
SettingsUiController::SettingsUiController(SettingsController* settingsController,
|
SettingsUiController::SettingsUiController(SettingsController* settingsController,
|
||||||
ServersController* serversController,
|
ServersController* serversController,
|
||||||
|
LanguageUiController* languageUiController,
|
||||||
QObject *parent)
|
QObject *parent)
|
||||||
: QObject(parent),
|
: QObject(parent),
|
||||||
m_settingsController(settingsController),
|
m_settingsController(settingsController),
|
||||||
m_serversController(serversController)
|
m_serversController(serversController),
|
||||||
|
m_languageUiController(languageUiController)
|
||||||
{
|
{
|
||||||
#ifdef Q_OS_ANDROID
|
#ifdef Q_OS_ANDROID
|
||||||
connect(AndroidController::instance(), &AndroidController::notificationStateChanged, this, &SettingsUiController::onNotificationStateChanged);
|
connect(AndroidController::instance(), &AndroidController::notificationStateChanged, this, &SettingsUiController::onNotificationStateChanged);
|
||||||
@@ -81,7 +83,7 @@ void SettingsUiController::toggleLogging(bool enable)
|
|||||||
{
|
{
|
||||||
m_settingsController->toggleLogging(enable);
|
m_settingsController->toggleLogging(enable);
|
||||||
#if defined(Q_OS_IOS)
|
#if defined(Q_OS_IOS)
|
||||||
AmneziaVPN::toggleLogging(enable);
|
SWIFT_INTEROP_NAMESPACE::toggleLogging(enable);
|
||||||
#endif
|
#endif
|
||||||
if (enable == true) {
|
if (enable == true) {
|
||||||
qInfo().noquote() << QString("Logging has enabled on %1 version %2 %3").arg(APPLICATION_NAME, APP_VERSION, GIT_COMMIT_HASH);
|
qInfo().noquote() << QString("Logging has enabled on %1 version %2 %3").arg(APPLICATION_NAME, APP_VERSION, GIT_COMMIT_HASH);
|
||||||
@@ -155,13 +157,13 @@ void SettingsUiController::restoreAppConfigFromData(const QByteArray &data)
|
|||||||
{
|
{
|
||||||
ErrorCode errorCode = m_settingsController->restoreAppConfigFromData(data);
|
ErrorCode errorCode = m_settingsController->restoreAppConfigFromData(data);
|
||||||
if (errorCode == ErrorCode::NoError) {
|
if (errorCode == ErrorCode::NoError) {
|
||||||
emit appLanguageChanged();
|
emit appLanguageChanged(
|
||||||
|
static_cast<LanguageSettings::AvailableLanguageEnum>(m_languageUiController->getCurrentLanguageIndex()));
|
||||||
|
|
||||||
bool amneziaDnsEnabled = m_settingsController->isAmneziaDnsEnabled();
|
bool amneziaDnsEnabled = m_settingsController->isAmneziaDnsEnabled();
|
||||||
emit amneziaDnsToggled(amneziaDnsEnabled);
|
emit amneziaDnsToggled(amneziaDnsEnabled);
|
||||||
|
|
||||||
emit restoreBackupFinished();
|
emit restoreBackupFinished();
|
||||||
emit autoStartChanged();
|
|
||||||
emit startMinimizedChanged();
|
emit startMinimizedChanged();
|
||||||
} else {
|
} else {
|
||||||
emit errorOccurred(errorCode);
|
emit errorOccurred(errorCode);
|
||||||
@@ -176,14 +178,13 @@ QString SettingsUiController::getAppVersion()
|
|||||||
void SettingsUiController::clearSettings()
|
void SettingsUiController::clearSettings()
|
||||||
{
|
{
|
||||||
m_settingsController->clearSettings();
|
m_settingsController->clearSettings();
|
||||||
emit autoStartChanged();
|
|
||||||
emit startMinimizedChanged();
|
emit startMinimizedChanged();
|
||||||
emit resetLanguageToSystem();
|
emit resetLanguageToSystem();
|
||||||
|
|
||||||
emit changeSettingsFinished(tr("All settings have been reset to default values"));
|
emit changeSettingsFinished(tr("All settings have been reset to default values"));
|
||||||
|
|
||||||
#if defined(Q_OS_IOS) || defined(MACOS_NE)
|
#if defined(Q_OS_IOS) || defined(MACOS_NE)
|
||||||
AmneziaVPN::clearSettings();
|
SWIFT_INTEROP_NAMESPACE::clearSettings();
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -205,8 +206,9 @@ bool SettingsUiController::isAutoStartEnabled()
|
|||||||
void SettingsUiController::toggleAutoStart(bool enable)
|
void SettingsUiController::toggleAutoStart(bool enable)
|
||||||
{
|
{
|
||||||
m_settingsController->toggleAutoStart(enable);
|
m_settingsController->toggleAutoStart(enable);
|
||||||
emit autoStartChanged();
|
if (!enable) {
|
||||||
emit startMinimizedChanged();
|
emit startMinimizedChanged();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool SettingsUiController::isStartMinimizedEnabled()
|
bool SettingsUiController::isStartMinimizedEnabled()
|
||||||
|
|||||||
@@ -5,6 +5,8 @@
|
|||||||
|
|
||||||
#include "core/controllers/settingsController.h"
|
#include "core/controllers/settingsController.h"
|
||||||
#include "core/controllers/serversController.h"
|
#include "core/controllers/serversController.h"
|
||||||
|
#include "ui/controllers/languageUiController.h"
|
||||||
|
#include "ui/models/languageModel.h"
|
||||||
#include "core/utils/errorCodes.h"
|
#include "core/utils/errorCodes.h"
|
||||||
#include "core/utils/routeModes.h"
|
#include "core/utils/routeModes.h"
|
||||||
#include "core/utils/commonStructs.h"
|
#include "core/utils/commonStructs.h"
|
||||||
@@ -15,6 +17,7 @@ class SettingsUiController : public QObject
|
|||||||
public:
|
public:
|
||||||
explicit SettingsUiController(SettingsController* settingsController,
|
explicit SettingsUiController(SettingsController* settingsController,
|
||||||
ServersController* serversController,
|
ServersController* serversController,
|
||||||
|
LanguageUiController* languageUiController,
|
||||||
QObject *parent = nullptr);
|
QObject *parent = nullptr);
|
||||||
|
|
||||||
Q_PROPERTY(QString primaryDns READ getPrimaryDns WRITE setPrimaryDns NOTIFY primaryDnsChanged)
|
Q_PROPERTY(QString primaryDns READ getPrimaryDns WRITE setPrimaryDns NOTIFY primaryDnsChanged)
|
||||||
@@ -29,7 +32,6 @@ public:
|
|||||||
Q_PROPERTY(bool isDevGatewayEnv READ isDevGatewayEnv WRITE toggleDevGatewayEnv NOTIFY devGatewayEnvChanged)
|
Q_PROPERTY(bool isDevGatewayEnv READ isDevGatewayEnv WRITE toggleDevGatewayEnv NOTIFY devGatewayEnvChanged)
|
||||||
|
|
||||||
Q_PROPERTY(bool isHomeAdLabelVisible READ isHomeAdLabelVisible NOTIFY isHomeAdLabelVisibleChanged)
|
Q_PROPERTY(bool isHomeAdLabelVisible READ isHomeAdLabelVisible NOTIFY isHomeAdLabelVisibleChanged)
|
||||||
Q_PROPERTY(bool autoStartEnabled READ isAutoStartEnabled NOTIFY autoStartChanged)
|
|
||||||
Q_PROPERTY(bool startMinimized READ isStartMinimizedEnabled NOTIFY startMinimizedChanged)
|
Q_PROPERTY(bool startMinimized READ isStartMinimizedEnabled NOTIFY startMinimizedChanged)
|
||||||
|
|
||||||
public slots:
|
public slots:
|
||||||
@@ -120,7 +122,7 @@ signals:
|
|||||||
|
|
||||||
void loggingDisableByWatcher();
|
void loggingDisableByWatcher();
|
||||||
|
|
||||||
void appLanguageChanged();
|
void appLanguageChanged(const LanguageSettings::AvailableLanguageEnum language);
|
||||||
void resetLanguageToSystem();
|
void resetLanguageToSystem();
|
||||||
|
|
||||||
void onNotificationStateChanged();
|
void onNotificationStateChanged();
|
||||||
@@ -133,12 +135,12 @@ signals:
|
|||||||
void activityResumed();
|
void activityResumed();
|
||||||
|
|
||||||
void isHomeAdLabelVisibleChanged(bool visible);
|
void isHomeAdLabelVisibleChanged(bool visible);
|
||||||
void autoStartChanged();
|
|
||||||
void startMinimizedChanged();
|
void startMinimizedChanged();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
SettingsController* m_settingsController;
|
SettingsController* m_settingsController;
|
||||||
ServersController* m_serversController;
|
ServersController* m_serversController;
|
||||||
|
LanguageUiController* m_languageUiController;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -30,7 +30,7 @@ QVariant ApiAccountInfoModel::data(const QModelIndex &index, int role) const
|
|||||||
switch (role) {
|
switch (role) {
|
||||||
case SubscriptionStatusRole: {
|
case SubscriptionStatusRole: {
|
||||||
if (m_accountInfoData.configType == serverConfigUtils::ConfigType::AmneziaFreeV3) {
|
if (m_accountInfoData.configType == serverConfigUtils::ConfigType::AmneziaFreeV3) {
|
||||||
return QStringLiteral("<p><a style=\"color: #28c840;\">%1</a>").arg(tr("Active"));
|
return tr("Active");
|
||||||
}
|
}
|
||||||
|
|
||||||
return apiUtils::isSubscriptionExpired(m_accountInfoData.subscriptionEndDate)
|
return apiUtils::isSubscriptionExpired(m_accountInfoData.subscriptionEndDate)
|
||||||
|
|||||||
@@ -27,7 +27,6 @@ QVariant ClientManagementModel::data(const QModelIndex &index, int role) const
|
|||||||
auto userData = client.value(configKey::userData).toObject();
|
auto userData = client.value(configKey::userData).toObject();
|
||||||
|
|
||||||
switch (role) {
|
switch (role) {
|
||||||
case ClientIdRole: return client.value(configKey::clientId).toString();
|
|
||||||
case ClientNameRole: return userData.value(configKey::clientName).toString();
|
case ClientNameRole: return userData.value(configKey::clientName).toString();
|
||||||
case CreationDateRole: return userData.value(configKey::creationDate).toString();
|
case CreationDateRole: return userData.value(configKey::creationDate).toString();
|
||||||
case LatestHandshakeRole: return userData.value(configKey::latestHandshake).toString();
|
case LatestHandshakeRole: return userData.value(configKey::latestHandshake).toString();
|
||||||
@@ -63,7 +62,6 @@ void ClientManagementModel::updateClientName(int row, const QString &newName)
|
|||||||
QHash<int, QByteArray> ClientManagementModel::roleNames() const
|
QHash<int, QByteArray> ClientManagementModel::roleNames() const
|
||||||
{
|
{
|
||||||
QHash<int, QByteArray> roles;
|
QHash<int, QByteArray> roles;
|
||||||
roles[ClientIdRole] = "clientId";
|
|
||||||
roles[ClientNameRole] = "clientName";
|
roles[ClientNameRole] = "clientName";
|
||||||
roles[CreationDateRole] = "creationDate";
|
roles[CreationDateRole] = "creationDate";
|
||||||
roles[LatestHandshakeRole] = "latestHandshake";
|
roles[LatestHandshakeRole] = "latestHandshake";
|
||||||
|
|||||||
@@ -10,8 +10,7 @@ class ClientManagementModel : public QAbstractListModel
|
|||||||
|
|
||||||
public:
|
public:
|
||||||
enum Roles {
|
enum Roles {
|
||||||
ClientIdRole = Qt::UserRole + 1,
|
ClientNameRole = Qt::UserRole + 1,
|
||||||
ClientNameRole,
|
|
||||||
CreationDateRole,
|
CreationDateRole,
|
||||||
LatestHandshakeRole,
|
LatestHandshakeRole,
|
||||||
DataReceivedRole,
|
DataReceivedRole,
|
||||||
|
|||||||
@@ -23,10 +23,6 @@ public:
|
|||||||
Q_INVOKABLE int containerFromString(const QString &container) const {
|
Q_INVOKABLE int containerFromString(const QString &container) const {
|
||||||
return static_cast<int>(amnezia::ContainerUtils::containerFromString(container));
|
return static_cast<int>(amnezia::ContainerUtils::containerFromString(container));
|
||||||
}
|
}
|
||||||
|
|
||||||
Q_INVOKABLE bool isUnsupportedContainer(int containerIndex) const {
|
|
||||||
return amnezia::ContainerUtils::isUnsupportedContainer(static_cast<amnezia::DockerContainer>(containerIndex));
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // CONTAINERPROPS_H
|
#endif // CONTAINERPROPS_H
|
||||||
|
|||||||
@@ -67,7 +67,6 @@ QVariant ContainersModel::data(const QModelIndex &index, int role) const
|
|||||||
case IsCurrentlyProcessedRole: return container == static_cast<DockerContainer>(m_processedContainerIndex);
|
case IsCurrentlyProcessedRole: return container == static_cast<DockerContainer>(m_processedContainerIndex);
|
||||||
case IsSupportedRole: return ContainerUtils::isSupportedByCurrentPlatform(container);
|
case IsSupportedRole: return ContainerUtils::isSupportedByCurrentPlatform(container);
|
||||||
case IsShareableRole: return ContainerUtils::isShareable(container);
|
case IsShareableRole: return ContainerUtils::isShareable(container);
|
||||||
case IsUnsupportedContainerRole: return ContainerUtils::isUnsupportedContainer(container);
|
|
||||||
case IsVpnContainerRole: return ContainerUtils::containerService(container) == ServiceType::Vpn;
|
case IsVpnContainerRole: return ContainerUtils::containerService(container) == ServiceType::Vpn;
|
||||||
case IsServiceContainerRole: return ContainerUtils::containerService(container) == ServiceType::Other;
|
case IsServiceContainerRole: return ContainerUtils::containerService(container) == ServiceType::Other;
|
||||||
case IsIpsecRole: return container == DockerContainer::Ipsec;
|
case IsIpsecRole: return container == DockerContainer::Ipsec;
|
||||||
@@ -143,8 +142,7 @@ bool ContainersModel::hasInstalledProtocols()
|
|||||||
|
|
||||||
bool ContainersModel::isInstallationAllowed(DockerContainer container)
|
bool ContainersModel::isInstallationAllowed(DockerContainer container)
|
||||||
{
|
{
|
||||||
return container != DockerContainer::Awg
|
return container != DockerContainer::Awg;
|
||||||
&& !ContainerUtils::isUnsupportedContainer(container);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void ContainersModel::openContainerSettings(int containerIndex)
|
void ContainersModel::openContainerSettings(int containerIndex)
|
||||||
@@ -178,7 +176,6 @@ QHash<int, QByteArray> ContainersModel::roleNames() const
|
|||||||
roles[IsCurrentlyProcessedRole] = "isCurrentlyProcessed";
|
roles[IsCurrentlyProcessedRole] = "isCurrentlyProcessed";
|
||||||
roles[IsSupportedRole] = "isSupported";
|
roles[IsSupportedRole] = "isSupported";
|
||||||
roles[IsShareableRole] = "isShareable";
|
roles[IsShareableRole] = "isShareable";
|
||||||
roles[IsUnsupportedContainerRole] = "isUnsupportedContainer";
|
|
||||||
roles[IsInstallationAllowedRole] = "isInstallationAllowed";
|
roles[IsInstallationAllowedRole] = "isInstallationAllowed";
|
||||||
roles[InstallPageOrderRole] = "installPageOrder";
|
roles[InstallPageOrderRole] = "installPageOrder";
|
||||||
|
|
||||||
|
|||||||
@@ -39,8 +39,6 @@ public:
|
|||||||
IsSupportedRole,
|
IsSupportedRole,
|
||||||
IsShareableRole,
|
IsShareableRole,
|
||||||
|
|
||||||
IsUnsupportedContainerRole,
|
|
||||||
|
|
||||||
InstallPageOrderRole,
|
InstallPageOrderRole,
|
||||||
|
|
||||||
// Container type check roles
|
// Container type check roles
|
||||||
|
|||||||
@@ -13,7 +13,7 @@
|
|||||||
#include "core/utils/networkUtilities.h"
|
#include "core/utils/networkUtilities.h"
|
||||||
|
|
||||||
#if defined(Q_OS_IOS) || defined(MACOS_NE)
|
#if defined(Q_OS_IOS) || defined(MACOS_NE)
|
||||||
#include <AmneziaVPN-Swift.h>
|
#include "core/utils/swiftInterop.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include "core/utils/api/apiUtils.h"
|
#include "core/utils/api/apiUtils.h"
|
||||||
|
|||||||
@@ -56,17 +56,14 @@ ListViewType {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
var containerIndex = proxyDefaultServerContainersModel.mapToSource(index)
|
if (checked) {
|
||||||
|
containersDropDown.closeTriggered()
|
||||||
if (!isInstalled) {
|
ServersUiController.setDefaultContainer(ServersUiController.defaultServerId, proxyDefaultServerContainersModel.mapToSource(index))
|
||||||
ServersUiController.processedContainerIndex = containerIndex
|
} else {
|
||||||
|
ServersUiController.processedContainerIndex = proxyDefaultServerContainersModel.mapToSource(index)
|
||||||
PageController.goToPage(PageEnum.PageSetupWizardProtocolSettings)
|
PageController.goToPage(PageEnum.PageSetupWizardProtocolSettings)
|
||||||
containersDropDown.closeTriggered()
|
containersDropDown.closeTriggered()
|
||||||
return
|
|
||||||
}
|
}
|
||||||
|
|
||||||
containersDropDown.closeTriggered()
|
|
||||||
ServersUiController.setDefaultContainer(ServersUiController.defaultServerId, containerIndex)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
MouseArea {
|
MouseArea {
|
||||||
|
|||||||
@@ -5,6 +5,7 @@ import QtQuick.Layouts
|
|||||||
import SortFilterProxyModel 0.2
|
import SortFilterProxyModel 0.2
|
||||||
|
|
||||||
import PageEnum 1.0
|
import PageEnum 1.0
|
||||||
|
import ContainerProps 1.0
|
||||||
|
|
||||||
import "../Controls2"
|
import "../Controls2"
|
||||||
import "../Controls2/TextTypes"
|
import "../Controls2/TextTypes"
|
||||||
|
|||||||
@@ -6,36 +6,8 @@ Menu {
|
|||||||
|
|
||||||
popupType: Popup.Native
|
popupType: Popup.Native
|
||||||
|
|
||||||
property Item inputBlocker: null
|
onAboutToShow: blocker.enabled = true
|
||||||
|
onClosed: blocker.enabled = false
|
||||||
Component {
|
|
||||||
id: inputBlockerComponent
|
|
||||||
|
|
||||||
MouseArea {
|
|
||||||
anchors.fill: parent
|
|
||||||
preventStealing: true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
onAboutToShow: {
|
|
||||||
if (!textObj || !textObj.window) {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
const contentItem = textObj.window.contentItem
|
|
||||||
if (!inputBlocker) {
|
|
||||||
inputBlocker = inputBlockerComponent.createObject(contentItem)
|
|
||||||
} else {
|
|
||||||
inputBlocker.parent = contentItem
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
onClosed: {
|
|
||||||
if (inputBlocker) {
|
|
||||||
inputBlocker.destroy()
|
|
||||||
inputBlocker = null
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
MenuItem {
|
MenuItem {
|
||||||
text: qsTr("C&ut")
|
text: qsTr("C&ut")
|
||||||
@@ -59,4 +31,11 @@ Menu {
|
|||||||
enabled: textObj.length > 0
|
enabled: textObj.length > 0
|
||||||
onTriggered: textObj.selectAll()
|
onTriggered: textObj.selectAll()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
MouseArea {
|
||||||
|
id: blocker
|
||||||
|
z: 2
|
||||||
|
enabled: false
|
||||||
|
preventStealing: true
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -25,8 +25,8 @@ PageType {
|
|||||||
|
|
||||||
filters: [
|
filters: [
|
||||||
ValueFilter {
|
ValueFilter {
|
||||||
roleName: "serverId"
|
roleName: "isCurrentlyProcessed"
|
||||||
value: ServersUiController.processedServerId
|
value: true
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -440,7 +440,8 @@ PageType {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
InstallController.updateClientConfig(ServersUiController.processedServerId, ServersUiController.processedContainerIndex, ProtocolEnum.Awg)
|
PageController.goToPage(PageEnum.PageSetupWizardInstalling);
|
||||||
|
InstallController.updateContainer(ServersUiController.processedServerId, ServersUiController.processedContainerIndex, ProtocolEnum.Awg)
|
||||||
}
|
}
|
||||||
|
|
||||||
var noButtonFunction = function() {}
|
var noButtonFunction = function() {}
|
||||||
|
|||||||
@@ -561,7 +561,7 @@ PageType {
|
|||||||
}
|
}
|
||||||
|
|
||||||
PageController.goToPage(PageEnum.PageSetupWizardInstalling);
|
PageController.goToPage(PageEnum.PageSetupWizardInstalling);
|
||||||
InstallController.updateServerConfig(ServersUiController.processedServerId, ServersUiController.processedContainerIndex, ProtocolEnum.Awg)
|
InstallController.updateContainer(ServersUiController.processedServerId, ServersUiController.processedContainerIndex, ProtocolEnum.Awg)
|
||||||
}
|
}
|
||||||
|
|
||||||
var noButtonFunction = function() {}
|
var noButtonFunction = function() {}
|
||||||
|
|||||||
@@ -434,7 +434,7 @@ PageType {
|
|||||||
}
|
}
|
||||||
|
|
||||||
PageController.goToPage(PageEnum.PageSetupWizardInstalling);
|
PageController.goToPage(PageEnum.PageSetupWizardInstalling);
|
||||||
InstallController.updateServerConfig(ServersUiController.processedServerId, ServersUiController.processedContainerIndex, ProtocolEnum.OpenVpn)
|
InstallController.updateContainer(ServersUiController.processedServerId, ServersUiController.processedContainerIndex, ProtocolEnum.OpenVpn)
|
||||||
}
|
}
|
||||||
var noButtonFunction = function() {
|
var noButtonFunction = function() {
|
||||||
if (!GC.isMobile()) {
|
if (!GC.isMobile()) {
|
||||||
|
|||||||
@@ -128,7 +128,8 @@ PageType {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
InstallController.updateClientConfig(ServersUiController.processedServerId, ServersUiController.processedContainerIndex, ProtocolEnum.WireGuard)
|
PageController.goToPage(PageEnum.PageSetupWizardInstalling);
|
||||||
|
InstallController.updateContainer(ServersUiController.processedServerId, ServersUiController.processedContainerIndex, ProtocolEnum.WireGuard)
|
||||||
}
|
}
|
||||||
var noButtonFunction = function() {}
|
var noButtonFunction = function() {}
|
||||||
showQuestionDrawer(headerText, descriptionText, yesButtonText, noButtonText, yesButtonFunction, noButtonFunction)
|
showQuestionDrawer(headerText, descriptionText, yesButtonText, noButtonText, yesButtonFunction, noButtonFunction)
|
||||||
|
|||||||
@@ -129,7 +129,7 @@ PageType {
|
|||||||
}
|
}
|
||||||
|
|
||||||
PageController.goToPage(PageEnum.PageSetupWizardInstalling);
|
PageController.goToPage(PageEnum.PageSetupWizardInstalling);
|
||||||
InstallController.updateServerConfig(ServersUiController.processedServerId, ServersUiController.processedContainerIndex, ProtocolEnum.WireGuard)
|
InstallController.updateContainer(ServersUiController.processedServerId, ServersUiController.processedContainerIndex, ProtocolEnum.WireGuard)
|
||||||
}
|
}
|
||||||
var noButtonFunction = function() {
|
var noButtonFunction = function() {
|
||||||
if (!GC.isMobile()) {
|
if (!GC.isMobile()) {
|
||||||
|
|||||||
@@ -112,7 +112,7 @@ PageType {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
PageController.goToPage(PageEnum.PageSetupWizardInstalling)
|
PageController.goToPage(PageEnum.PageSetupWizardInstalling)
|
||||||
InstallController.updateServerConfig(ServersUiController.processedServerId, ServersUiController.processedContainerIndex, ProtocolEnum.Xray)
|
InstallController.updateContainer(ServersUiController.processedIndex, ServersUiController.processedContainerIndex, ProtocolEnum.Xray)
|
||||||
}
|
}
|
||||||
var noButtonFunction = function () {
|
var noButtonFunction = function () {
|
||||||
if (typeof GC !== "undefined" && !GC.isMobile()) {
|
if (typeof GC !== "undefined" && !GC.isMobile()) {
|
||||||
|
|||||||
@@ -279,7 +279,7 @@ PageType {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
PageController.goToPage(PageEnum.PageSetupWizardInstalling)
|
PageController.goToPage(PageEnum.PageSetupWizardInstalling)
|
||||||
InstallController.updateServerConfig(ServersUiController.processedServerId, ServersUiController.processedContainerIndex, ProtocolEnum.Xray)
|
InstallController.updateContainer(ServersUiController.processedIndex, ServersUiController.processedContainerIndex, ProtocolEnum.Xray)
|
||||||
}
|
}
|
||||||
var noButtonFunction = function () {
|
var noButtonFunction = function () {
|
||||||
if (typeof GC !== "undefined" && !GC.isMobile()) {
|
if (typeof GC !== "undefined" && !GC.isMobile()) {
|
||||||
|
|||||||
@@ -17,10 +17,6 @@ import "../Components"
|
|||||||
PageType {
|
PageType {
|
||||||
id: root
|
id: root
|
||||||
|
|
||||||
enableTimer: false
|
|
||||||
|
|
||||||
property bool portDirty: false
|
|
||||||
|
|
||||||
function formatTransport(value) {
|
function formatTransport(value) {
|
||||||
if (value === "raw") return "RAW (TCP)"
|
if (value === "raw") return "RAW (TCP)"
|
||||||
if (value === "xhttp") return "XHTTP"
|
if (value === "xhttp") return "XHTTP"
|
||||||
@@ -43,8 +39,8 @@ PageType {
|
|||||||
anchors.right: parent.right
|
anchors.right: parent.right
|
||||||
anchors.topMargin: 20 + PageController.safeAreaTopMargin
|
anchors.topMargin: 20 + PageController.safeAreaTopMargin
|
||||||
|
|
||||||
onActiveFocusChanged: {
|
onFocusChanged: {
|
||||||
if (backButton.enabled && backButton.activeFocus) {
|
if (this.activeFocus) {
|
||||||
listView.positionViewAtBeginning()
|
listView.positionViewAtBeginning()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -64,6 +60,8 @@ PageType {
|
|||||||
delegate: ColumnLayout {
|
delegate: ColumnLayout {
|
||||||
width: listView.width
|
width: listView.width
|
||||||
|
|
||||||
|
property alias focusItemId: textFieldWithHeaderType.textField
|
||||||
|
|
||||||
spacing: 0
|
spacing: 0
|
||||||
|
|
||||||
Text {
|
Text {
|
||||||
@@ -109,32 +107,13 @@ PageType {
|
|||||||
Layout.rightMargin: 16
|
Layout.rightMargin: 16
|
||||||
enabled: listView.enabled
|
enabled: listView.enabled
|
||||||
headerText: qsTr("Port")
|
headerText: qsTr("Port")
|
||||||
|
textField.text: port
|
||||||
Binding {
|
|
||||||
target: textFieldWithHeaderType.textField
|
|
||||||
property: "text"
|
|
||||||
value: port
|
|
||||||
when: !textFieldWithHeaderType.textField.activeFocus
|
|
||||||
restoreMode: Binding.RestoreNone
|
|
||||||
}
|
|
||||||
|
|
||||||
textField.maximumLength: 5
|
textField.maximumLength: 5
|
||||||
textField.validator: IntValidator {
|
textField.validator: IntValidator {
|
||||||
bottom: 1; top: 65535
|
bottom: 1; top: 65535
|
||||||
}
|
}
|
||||||
textField.onActiveFocusChanged: {
|
|
||||||
if (textField.activeFocus && textField.text === "" && port !== "") {
|
|
||||||
textField.text = port
|
|
||||||
}
|
|
||||||
}
|
|
||||||
textField.onTextChanged: {
|
|
||||||
root.portDirty = (textField.text !== port)
|
|
||||||
}
|
|
||||||
textField.onEditingFinished: {
|
textField.onEditingFinished: {
|
||||||
if (textField.text !== port) {
|
if (textField.text !== port) port = textField.text
|
||||||
port = textField.text
|
|
||||||
}
|
|
||||||
root.portDirty = false
|
|
||||||
}
|
}
|
||||||
checkEmptyText: true
|
checkEmptyText: true
|
||||||
}
|
}
|
||||||
@@ -193,8 +172,9 @@ PageType {
|
|||||||
Layout.leftMargin: 16
|
Layout.leftMargin: 16
|
||||||
Layout.rightMargin: 16
|
Layout.rightMargin: 16
|
||||||
visible: listView.enabled
|
visible: listView.enabled
|
||||||
&& (XrayConfigModel.hasUnsavedChanges || root.portDirty)
|
&& (XrayConfigModel.hasUnsavedChanges
|
||||||
enabled: visible && textFieldWithHeaderType.textField.text !== ""
|
|| textFieldWithHeaderType.textField.text !== port)
|
||||||
|
enabled: visible && textFieldWithHeaderType.errorText === ""
|
||||||
text: qsTr("Save")
|
text: qsTr("Save")
|
||||||
onClicked: function() {
|
onClicked: function() {
|
||||||
forceActiveFocus()
|
forceActiveFocus()
|
||||||
@@ -213,7 +193,7 @@ PageType {
|
|||||||
}
|
}
|
||||||
|
|
||||||
PageController.goToPage(PageEnum.PageSetupWizardInstalling);
|
PageController.goToPage(PageEnum.PageSetupWizardInstalling);
|
||||||
InstallController.updateServerConfig(ServersUiController.processedServerId, ServersUiController.processedContainerIndex, ProtocolEnum.Xray)
|
InstallController.updateContainer(ServersUiController.processedServerId, ServersUiController.processedContainerIndex, ProtocolEnum.Xray)
|
||||||
}
|
}
|
||||||
var noButtonFunction = function() {
|
var noButtonFunction = function() {
|
||||||
if (!GC.isMobile()) saveButton.forceActiveFocus()
|
if (!GC.isMobile()) saveButton.forceActiveFocus()
|
||||||
|
|||||||
@@ -742,7 +742,7 @@ PageType {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
PageController.goToPage(PageEnum.PageSetupWizardInstalling)
|
PageController.goToPage(PageEnum.PageSetupWizardInstalling)
|
||||||
InstallController.updateServerConfig(ServersUiController.processedServerId, ServersUiController.processedContainerIndex, ProtocolEnum.Xray)
|
InstallController.updateContainer(ServersUiController.processedIndex, ServersUiController.processedContainerIndex, ProtocolEnum.Xray)
|
||||||
}
|
}
|
||||||
var noButtonFunction = function () {
|
var noButtonFunction = function () {
|
||||||
if (typeof GC !== "undefined" && !GC.isMobile()) {
|
if (typeof GC !== "undefined" && !GC.isMobile()) {
|
||||||
|
|||||||
@@ -95,7 +95,7 @@ PageType {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
PageController.goToPage(PageEnum.PageSetupWizardInstalling)
|
PageController.goToPage(PageEnum.PageSetupWizardInstalling)
|
||||||
InstallController.updateServerConfig(ServersUiController.processedServerId, ServersUiController.processedContainerIndex, ProtocolEnum.Xray)
|
InstallController.updateContainer(ServersUiController.processedIndex, ServersUiController.processedContainerIndex, ProtocolEnum.Xray)
|
||||||
}
|
}
|
||||||
var noButtonFunction = function () {
|
var noButtonFunction = function () {
|
||||||
if (typeof GC !== "undefined" && !GC.isMobile()) {
|
if (typeof GC !== "undefined" && !GC.isMobile()) {
|
||||||
|
|||||||
@@ -211,7 +211,7 @@ PageType {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
PageController.goToPage(PageEnum.PageSetupWizardInstalling)
|
PageController.goToPage(PageEnum.PageSetupWizardInstalling)
|
||||||
InstallController.updateServerConfig(ServersUiController.processedServerId, ServersUiController.processedContainerIndex, ProtocolEnum.Xray)
|
InstallController.updateContainer(ServersUiController.processedIndex, ServersUiController.processedContainerIndex, ProtocolEnum.Xray)
|
||||||
}
|
}
|
||||||
var noButtonFunction = function () {
|
var noButtonFunction = function () {
|
||||||
if (typeof GC !== "undefined" && !GC.isMobile()) {
|
if (typeof GC !== "undefined" && !GC.isMobile()) {
|
||||||
|
|||||||
@@ -208,7 +208,7 @@ PageType {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
PageController.goToPage(PageEnum.PageSetupWizardInstalling)
|
PageController.goToPage(PageEnum.PageSetupWizardInstalling)
|
||||||
InstallController.updateServerConfig(ServersUiController.processedServerId, ServersUiController.processedContainerIndex, ProtocolEnum.Xray)
|
InstallController.updateContainer(ServersUiController.processedIndex, ServersUiController.processedContainerIndex, ProtocolEnum.Xray)
|
||||||
}
|
}
|
||||||
var noButtonFunction = function () {
|
var noButtonFunction = function () {
|
||||||
if (typeof GC !== "undefined" && !GC.isMobile()) {
|
if (typeof GC !== "undefined" && !GC.isMobile()) {
|
||||||
|
|||||||
@@ -179,7 +179,7 @@ PageType {
|
|||||||
function mtProxyScheduleUpdate(closePage) {
|
function mtProxyScheduleUpdate(closePage) {
|
||||||
var cp = closePage === undefined ? false : closePage
|
var cp = closePage === undefined ? false : closePage
|
||||||
Qt.callLater(function () {
|
Qt.callLater(function () {
|
||||||
InstallController.updateServerConfig(ServersUiController.processedServerId, ServersUiController.processedContainerIndex, ProtocolEnum.MtProxy, cp)
|
InstallController.updateContainer(ServersUiController.processedServerId, ServersUiController.processedContainerIndex, ProtocolEnum.MtProxy, cp)
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -285,7 +285,7 @@ PageType {
|
|||||||
}
|
}
|
||||||
|
|
||||||
PageController.goToPage(PageEnum.PageSetupWizardInstalling)
|
PageController.goToPage(PageEnum.PageSetupWizardInstalling)
|
||||||
InstallController.updateServerConfig(ServersUiController.processedServerId, ServersUiController.processedContainerIndex, ProtocolEnum.Socks5Proxy)
|
InstallController.updateContainer(ServersUiController.processedServerId, ServersUiController.processedContainerIndex, ProtocolEnum.Socks5Proxy)
|
||||||
tempPort = portTextField.textField.text
|
tempPort = portTextField.textField.text
|
||||||
tempUsername = usernameTextField.textField.text
|
tempUsername = usernameTextField.textField.text
|
||||||
tempPassword = passwordTextField.textField.text
|
tempPassword = passwordTextField.textField.text
|
||||||
|
|||||||
@@ -154,7 +154,7 @@ PageType {
|
|||||||
function telemtScheduleUpdate(closePage) {
|
function telemtScheduleUpdate(closePage) {
|
||||||
var cp = closePage === undefined ? false : closePage
|
var cp = closePage === undefined ? false : closePage
|
||||||
Qt.callLater(function () {
|
Qt.callLater(function () {
|
||||||
InstallController.updateServerConfig(ServersUiController.processedServerId, ServersUiController.processedContainerIndex, ProtocolEnum.Telemt, cp)
|
InstallController.updateContainer(ServersUiController.processedServerId, ServersUiController.processedContainerIndex, ProtocolEnum.Telemt, cp)
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -100,12 +100,6 @@ PageType {
|
|||||||
onLinkActivated: Qt.openUrlExternally(link)
|
onLinkActivated: Qt.openUrlExternally(link)
|
||||||
textFormat: Text.RichText
|
textFormat: Text.RichText
|
||||||
text: qsTr("Use <a href=\"https://www.torproject.org/download/\" style=\"color: #FBB26A;\">Tor Browser</a> to open this URL.")
|
text: qsTr("Use <a href=\"https://www.torproject.org/download/\" style=\"color: #FBB26A;\">Tor Browser</a> to open this URL.")
|
||||||
|
|
||||||
MouseArea {
|
|
||||||
anchors.fill: parent
|
|
||||||
acceptedButtons: Qt.NoButton
|
|
||||||
cursorShape: parent.hoveredLink ? Qt.PointingHandCursor : Qt.ArrowCursor
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
ParagraphTextType {
|
ParagraphTextType {
|
||||||
|
|||||||
@@ -30,16 +30,6 @@ PageType {
|
|||||||
root.isInAppPurchase = ApiAccountInfoModel.data("isInAppPurchase")
|
root.isInAppPurchase = ApiAccountInfoModel.data("isInAppPurchase")
|
||||||
}
|
}
|
||||||
|
|
||||||
function selectConnectionCountry(countryIndex, countryCode, countryName) {
|
|
||||||
if (countryIndex === ApiCountryModel.currentIndex) {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
PageController.showBusyIndicator(true)
|
|
||||||
SubscriptionUiController.updateServiceFromGateway(ServersUiController.processedServerId, countryCode, countryName)
|
|
||||||
PageController.showBusyIndicator(false)
|
|
||||||
}
|
|
||||||
|
|
||||||
Component.onCompleted: {
|
Component.onCompleted: {
|
||||||
root.updateSubscriptionState()
|
root.updateSubscriptionState()
|
||||||
}
|
}
|
||||||
@@ -93,7 +83,7 @@ PageType {
|
|||||||
|
|
||||||
model: ApiCountryModel
|
model: ApiCountryModel
|
||||||
|
|
||||||
currentIndex: ApiCountryModel.currentIndex
|
currentIndex: 0
|
||||||
|
|
||||||
ButtonGroup {
|
ButtonGroup {
|
||||||
id: containersRadioButtonGroup
|
id: containersRadioButtonGroup
|
||||||
@@ -214,7 +204,15 @@ PageType {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
root.selectConnectionCountry(index, countryCode, countryName)
|
if (index !== ApiCountryModel.currentIndex) {
|
||||||
|
PageController.showBusyIndicator(true)
|
||||||
|
var prevIndex = ApiCountryModel.currentIndex
|
||||||
|
ApiCountryModel.currentIndex = index
|
||||||
|
if (!SubscriptionUiController.updateServiceFromGateway(ServersUiController.processedServerId, countryCode, countryName)) {
|
||||||
|
ApiCountryModel.currentIndex = prevIndex
|
||||||
|
}
|
||||||
|
PageController.showBusyIndicator(false)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Keys.onEnterPressed: {
|
Keys.onEnterPressed: {
|
||||||
|
|||||||
@@ -108,9 +108,9 @@ PageType {
|
|||||||
text: qsTr("Auto start")
|
text: qsTr("Auto start")
|
||||||
descriptionText: qsTr("Launch the application every time the device is starts")
|
descriptionText: qsTr("Launch the application every time the device is starts")
|
||||||
|
|
||||||
checked: SettingsController.autoStartEnabled
|
checked: SettingsController.isAutoStartEnabled()
|
||||||
onToggled: function() {
|
onToggled: function() {
|
||||||
if (checked !== SettingsController.autoStartEnabled) {
|
if (checked !== SettingsController.isAutoStartEnabled()) {
|
||||||
SettingsController.toggleAutoStart(checked)
|
SettingsController.toggleAutoStart(checked)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -154,10 +154,10 @@ PageType {
|
|||||||
text: qsTr("Start minimized")
|
text: qsTr("Start minimized")
|
||||||
descriptionText: qsTr("Launch application minimized (works with autostart option turned on)")
|
descriptionText: qsTr("Launch application minimized (works with autostart option turned on)")
|
||||||
|
|
||||||
enabled: SettingsController.autoStartEnabled
|
enabled: SettingsController.isAutoStartEnabled()
|
||||||
opacity: enabled ? 1.0 : 0.5
|
opacity: enabled ? 1.0 : 0.5
|
||||||
|
|
||||||
checked: SettingsController.autoStartEnabled && SettingsController.startMinimized
|
checked: SettingsController.isAutoStartEnabled() && SettingsController.startMinimized
|
||||||
onToggled: function() {
|
onToggled: function() {
|
||||||
if (checked !== SettingsController.startMinimized) {
|
if (checked !== SettingsController.startMinimized) {
|
||||||
SettingsController.toggleStartMinimized(checked)
|
SettingsController.toggleStartMinimized(checked)
|
||||||
@@ -166,7 +166,7 @@ PageType {
|
|||||||
}
|
}
|
||||||
|
|
||||||
DividerType {
|
DividerType {
|
||||||
visible: !GC.isMobile() && ServersUiController.hasServersFromGatewayApi
|
visible: !GC.isMobile()
|
||||||
}
|
}
|
||||||
|
|
||||||
SwitcherType {
|
SwitcherType {
|
||||||
|
|||||||
@@ -36,6 +36,17 @@ PageType {
|
|||||||
function onRebootServerFinished(finishedMessage) {
|
function onRebootServerFinished(finishedMessage) {
|
||||||
PageController.showNotificationMessage(finishedMessage)
|
PageController.showNotificationMessage(finishedMessage)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function onRemoveAllContainersFinished(finishedMessage) {
|
||||||
|
PageController.closePage() // close deInstalling page
|
||||||
|
PageController.showNotificationMessage(finishedMessage)
|
||||||
|
}
|
||||||
|
|
||||||
|
function onRemoveContainerFinished(finishedMessage) {
|
||||||
|
PageController.closePage() // close deInstalling page
|
||||||
|
PageController.closePage() // close page with remove button
|
||||||
|
PageController.showNotificationMessage(finishedMessage)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Connections {
|
Connections {
|
||||||
|
|||||||
@@ -17,8 +17,7 @@ import "../Components"
|
|||||||
PageType {
|
PageType {
|
||||||
id: root
|
id: root
|
||||||
|
|
||||||
property bool isUnsupportedContainer: ContainerProps.isUnsupportedContainer(ServersUiController.processedContainerIndex)
|
property bool isClearCacheVisible: ServersUiController.isProcessedServerHasWriteAccess() && !ContainersModel.isServiceContainer(ServersUiController.processedContainerIndex)
|
||||||
property bool isClearCacheVisible: !isUnsupportedContainer && ServersUiController.isProcessedServerHasWriteAccess() && !ContainersModel.isServiceContainer(ServersUiController.processedContainerIndex)
|
|
||||||
|
|
||||||
BackButtonType {
|
BackButtonType {
|
||||||
id: backButton
|
id: backButton
|
||||||
@@ -53,11 +52,10 @@ PageType {
|
|||||||
Layout.bottomMargin: 32
|
Layout.bottomMargin: 32
|
||||||
|
|
||||||
headerText: ContainersModel.getProcessedContainerName() + qsTr(" settings")
|
headerText: ContainersModel.getProcessedContainerName() + qsTr(" settings")
|
||||||
descriptionText: root.isUnsupportedContainer ? qsTr("This protocol is no longer supported.") : ""
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
model: root.isUnsupportedContainer ? null : ProtocolsModel
|
model: ProtocolsModel
|
||||||
|
|
||||||
delegate: ColumnLayout {
|
delegate: ColumnLayout {
|
||||||
id: delegateContent
|
id: delegateContent
|
||||||
|
|||||||
@@ -29,10 +29,6 @@ PageType {
|
|||||||
ValueFilter {
|
ValueFilter {
|
||||||
roleName: "isInstallationAllowed"
|
roleName: "isInstallationAllowed"
|
||||||
value: true
|
value: true
|
||||||
},
|
|
||||||
ValueFilter {
|
|
||||||
roleName: "isUnsupportedContainer"
|
|
||||||
value: false
|
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
sorters: RoleSorter {
|
sorters: RoleSorter {
|
||||||
|
|||||||
@@ -382,10 +382,6 @@ PageType {
|
|||||||
ValueFilter {
|
ValueFilter {
|
||||||
roleName: "isShareable"
|
roleName: "isShareable"
|
||||||
value: true
|
value: true
|
||||||
},
|
|
||||||
ValueFilter {
|
|
||||||
roleName: "isUnsupportedContainer"
|
|
||||||
value: false
|
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
@@ -400,19 +396,9 @@ PageType {
|
|||||||
target: serverSelector
|
target: serverSelector
|
||||||
|
|
||||||
function onServerSelectorIndexChanged() {
|
function onServerSelectorIndexChanged() {
|
||||||
if (!proxyContainersModel.count) {
|
var defaultContainer = proxyContainersModel.mapFromSource(ServersUiController.serverDefaultContainer(ServersUiController.processedServerId))
|
||||||
root.shareButtonEnabled = false
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
var defaultContainer = proxyContainersModel.mapFromSource(
|
|
||||||
ServersUiController.serverDefaultContainer(ServersUiController.processedServerId))
|
|
||||||
if (defaultContainer < 0) {
|
|
||||||
defaultContainer = 0
|
|
||||||
}
|
|
||||||
|
|
||||||
containerSelectorListView.selectedIndex = defaultContainer
|
containerSelectorListView.selectedIndex = defaultContainer
|
||||||
containerSelectorListView.positionViewAtIndex(defaultContainer, ListView.Beginning)
|
containerSelectorListView.positionViewAtIndex(selectedIndex, ListView.Beginning)
|
||||||
containerSelectorListView.triggerCurrentItem()
|
containerSelectorListView.triggerCurrentItem()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -851,10 +837,11 @@ PageType {
|
|||||||
var noButtonFunction = function() {
|
var noButtonFunction = function() {
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ConnectionController.isRevokeBlockedDuringActiveConnection(
|
var isActiveConfigForCurrentClient = ServersUiController.isDefaultServerCurrentlyProcessed()
|
||||||
ServersUiController.processedServerId,
|
&& ServersUiController.serverDefaultContainer(ServersUiController.defaultServerId) === ServersUiController.processedContainerIndex
|
||||||
ServersUiController.processedContainerIndex,
|
|
||||||
clientId)) {
|
if ((ConnectionController.isConnectionInProgress || ConnectionController.isConnected)
|
||||||
|
&& isActiveConfigForCurrentClient) {
|
||||||
PageController.showNotificationMessage("Unable to revoke current config during active connection")
|
PageController.showNotificationMessage("Unable to revoke current config during active connection")
|
||||||
} else {
|
} else {
|
||||||
showQuestionDrawer(headerText, descriptionText, yesButtonText, noButtonText, yesButtonFunction, noButtonFunction)
|
showQuestionDrawer(headerText, descriptionText, yesButtonText, noButtonText, yesButtonFunction, noButtonFunction)
|
||||||
|
|||||||
@@ -105,19 +105,6 @@ PageType {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Connections {
|
|
||||||
objectName: "connectionControllerConnections"
|
|
||||||
|
|
||||||
target: ConnectionController
|
|
||||||
|
|
||||||
function onNoInstalledContainers() {
|
|
||||||
PageController.setTriggeredByConnectButton(true)
|
|
||||||
|
|
||||||
ServersUiController.setProcessedServerId(ServersUiController.defaultServerId)
|
|
||||||
PageController.goToPage(PageEnum.PageSetupWizardEasy)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Connections {
|
Connections {
|
||||||
objectName: "installControllerConnections"
|
objectName: "installControllerConnections"
|
||||||
|
|
||||||
@@ -166,19 +153,11 @@ PageType {
|
|||||||
PageController.showNotificationMessage(finishedMessage)
|
PageController.showNotificationMessage(finishedMessage)
|
||||||
}
|
}
|
||||||
|
|
||||||
function onRemoveAllContainersFinished(finishedMessage) {
|
function onNoInstalledContainers() {
|
||||||
if (tabBarStackView.currentItem.objectName === PageController.getPagePath(PageEnum.PageDeinstalling)) {
|
PageController.setTriggeredByConnectButton(true)
|
||||||
PageController.closePage()
|
|
||||||
}
|
|
||||||
PageController.showNotificationMessage(finishedMessage)
|
|
||||||
}
|
|
||||||
|
|
||||||
function onRemoveContainerFinished(finishedMessage) {
|
ServersUiController.setProcessedServerId(ServersUiController.defaultServerId)
|
||||||
if (tabBarStackView.currentItem.objectName === PageController.getPagePath(PageEnum.PageDeinstalling)) {
|
PageController.goToPage(PageEnum.PageSetupWizardEasy)
|
||||||
PageController.closePage()
|
|
||||||
}
|
|
||||||
PageController.closePage()
|
|
||||||
PageController.showNotificationMessage(finishedMessage)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -234,8 +234,6 @@ Window {
|
|||||||
DrawerType2 {
|
DrawerType2 {
|
||||||
id: privateKeyPassphraseDrawer
|
id: privateKeyPassphraseDrawer
|
||||||
|
|
||||||
property bool isCloseByUser: false
|
|
||||||
|
|
||||||
anchors.fill: parent
|
anchors.fill: parent
|
||||||
expandedHeight: root.height * 0.35 + PageController.safeAreaBottomMargin + PageController.imeHeight
|
expandedHeight: root.height * 0.35 + PageController.safeAreaBottomMargin + PageController.imeHeight
|
||||||
|
|
||||||
@@ -255,11 +253,6 @@ Window {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function onAboutToHide() {
|
function onAboutToHide() {
|
||||||
if (privateKeyPassphraseDrawer.isCloseByUser === false) {
|
|
||||||
privateKeyPassphraseDrawer.isCloseByUser = true
|
|
||||||
PageController.passphraseRequestDrawerClosed("")
|
|
||||||
}
|
|
||||||
|
|
||||||
if (passphrase.textField.text !== "") {
|
if (passphrase.textField.text !== "") {
|
||||||
PageController.showBusyIndicator(true)
|
PageController.showBusyIndicator(true)
|
||||||
}
|
}
|
||||||
@@ -300,7 +293,6 @@ Window {
|
|||||||
text: qsTr("Save")
|
text: qsTr("Save")
|
||||||
|
|
||||||
clickedFunc: function() {
|
clickedFunc: function() {
|
||||||
privateKeyPassphraseDrawer.isCloseByUser = true
|
|
||||||
privateKeyPassphraseDrawer.closeTriggered()
|
privateKeyPassphraseDrawer.closeTriggered()
|
||||||
PageController.passphraseRequestDrawerClosed(passphrase.textField.text)
|
PageController.passphraseRequestDrawerClosed(passphrase.textField.text)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -20,7 +20,8 @@ if(CMAKE_SYSTEM_NAME STREQUAL "Android")
|
|||||||
set(_CONAN_INSTALL_ARGS
|
set(_CONAN_INSTALL_ARGS
|
||||||
"-c=tools.android:cmake_legacy_toolchain=false"
|
"-c=tools.android:cmake_legacy_toolchain=false"
|
||||||
"-c=tools.build:sharedlinkflags=['-Wl,-z,max-page-size=16384']"
|
"-c=tools.build:sharedlinkflags=['-Wl,-z,max-page-size=16384']"
|
||||||
"-c=tools.build:exelinkflags=['-Wl,-z,max-page-size=16384']")
|
"-c=tools.build:exelinkflags=['-Wl,-z,max-page-size=16384']"
|
||||||
|
"-o=openssl/*:shared=True")
|
||||||
set(CMAKE_ANDROID_STL_TYPE "c++_shared" CACHE STRING "")
|
set(CMAKE_ANDROID_STL_TYPE "c++_shared" CACHE STRING "")
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
@@ -28,12 +29,6 @@ if (WIN32 OR APPLE)
|
|||||||
set(CMAKE_INSTALL_BINDIR ".")
|
set(CMAKE_INSTALL_BINDIR ".")
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
# Apple NE-based apps do not support any dylibs or variations
|
|
||||||
# So Qt would use the openssl bundled with system, not application
|
|
||||||
if (NOT(CMAKE_SYSTEM_NAME STREQUAL "iOS" OR (APPLE AND MACOS_NE)))
|
|
||||||
list(APPEND _CONAN_INSTALL_ARGS "-o=openssl/*:shared=True")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
list(PREPEND _CONAN_INSTALL_ARGS "--build=missing")
|
list(PREPEND _CONAN_INSTALL_ARGS "--build=missing")
|
||||||
list(JOIN _CONAN_INSTALL_ARGS ";" _CONAN_INSTALL_ARGS_JOINED)
|
list(JOIN _CONAN_INSTALL_ARGS ";" _CONAN_INSTALL_ARGS_JOINED)
|
||||||
set(CONAN_INSTALL_ARGS ${_CONAN_INSTALL_ARGS_JOINED} CACHE STRING "" FORCE)
|
set(CONAN_INSTALL_ARGS ${_CONAN_INSTALL_ARGS_JOINED} CACHE STRING "" FORCE)
|
||||||
|
|||||||
@@ -17,7 +17,7 @@
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef Q_OS_IOS
|
#ifdef Q_OS_IOS
|
||||||
#include <AmneziaVPN-Swift.h>
|
#include "core/utils/swiftInterop.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
QFile Logger::m_file;
|
QFile Logger::m_file;
|
||||||
@@ -146,7 +146,7 @@ QString Logger::getLogFile()
|
|||||||
QString qtLog = file.readAll();
|
QString qtLog = file.readAll();
|
||||||
|
|
||||||
#ifdef Q_OS_IOS
|
#ifdef Q_OS_IOS
|
||||||
return QString().fromStdString(AmneziaVPN::swiftUpdateLogData(qtLog.toStdString()));
|
return QString().fromStdString(SWIFT_INTEROP_NAMESPACE::swiftUpdateLogData(qtLog.toStdString()));
|
||||||
#else
|
#else
|
||||||
return qtLog;
|
return qtLog;
|
||||||
#endif
|
#endif
|
||||||
@@ -163,7 +163,7 @@ QString Logger::getServiceLogFile()
|
|||||||
QString qtLog = file.readAll();
|
QString qtLog = file.readAll();
|
||||||
|
|
||||||
#ifdef Q_OS_IOS
|
#ifdef Q_OS_IOS
|
||||||
return QString().fromStdString(AmneziaVPN::swiftUpdateLogData(qtLog.toStdString()));
|
return QString().fromStdString(SWIFT_INTEROP_NAMESPACE::swiftUpdateLogData(qtLog.toStdString()));
|
||||||
#else
|
#else
|
||||||
return qtLog;
|
return qtLog;
|
||||||
#endif
|
#endif
|
||||||
@@ -194,7 +194,7 @@ void Logger::clearLogs(bool isServiceLogger)
|
|||||||
file.close();
|
file.close();
|
||||||
|
|
||||||
#ifdef Q_OS_IOS
|
#ifdef Q_OS_IOS
|
||||||
AmneziaVPN::swiftDeleteLog();
|
SWIFT_INTEROP_NAMESPACE::swiftDeleteLog();
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (isLogActive) {
|
if (isLogActive) {
|
||||||
|
|||||||
@@ -28,42 +28,6 @@ IpcServer::IpcServer(QObject *parent) : IpcInterfaceSource(parent)
|
|||||||
connect(&m_pingHelper, &PingHelper::connectionLose, this, &IpcServer::connectionLose);
|
connect(&m_pingHelper, &PingHelper::connectionLose, this, &IpcServer::connectionLose);
|
||||||
}
|
}
|
||||||
|
|
||||||
IpcServer::~IpcServer()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
void IpcServer::resetServiceState()
|
|
||||||
{
|
|
||||||
qDebug() << "IpcServer::resetServiceState — tearing down active VPN state";
|
|
||||||
|
|
||||||
Xray::getInstance().stopXray();
|
|
||||||
|
|
||||||
for (auto it = m_processes.cbegin(); it != m_processes.cend(); ++it) {
|
|
||||||
const ProcessDescriptor &pd = it.value();
|
|
||||||
if (!pd.ipcProcess)
|
|
||||||
continue;
|
|
||||||
pd.ipcProcess->terminate();
|
|
||||||
if (!pd.ipcProcess->waitForFinished(1000)) {
|
|
||||||
pd.ipcProcess->kill();
|
|
||||||
pd.ipcProcess->waitForFinished(1000);
|
|
||||||
}
|
|
||||||
pd.ipcProcess->close();
|
|
||||||
}
|
|
||||||
m_processes.clear();
|
|
||||||
|
|
||||||
Utils::killProcessByName(Utils::tun2socksPath());
|
|
||||||
Utils::killProcessByName(Utils::openVpnExecPath());
|
|
||||||
|
|
||||||
KillSwitch::instance()->disableKillSwitch();
|
|
||||||
|
|
||||||
Router::restoreResolvers();
|
|
||||||
Router::clearSavedRoutes();
|
|
||||||
Router::StartRoutingIpv6();
|
|
||||||
Router::flushDns();
|
|
||||||
|
|
||||||
m_pingHelper.stop();
|
|
||||||
}
|
|
||||||
|
|
||||||
int IpcServer::createPrivilegedProcess()
|
int IpcServer::createPrivilegedProcess()
|
||||||
{
|
{
|
||||||
#ifdef MZ_DEBUG
|
#ifdef MZ_DEBUG
|
||||||
|
|||||||
@@ -17,10 +17,6 @@ class IpcServer : public IpcInterfaceSource
|
|||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
explicit IpcServer(QObject *parent = nullptr);
|
explicit IpcServer(QObject *parent = nullptr);
|
||||||
virtual ~IpcServer();
|
|
||||||
|
|
||||||
void resetServiceState();
|
|
||||||
|
|
||||||
virtual int createPrivilegedProcess() override;
|
virtual int createPrivilegedProcess() override;
|
||||||
|
|
||||||
virtual int routeAddList(const QString &gw, const QStringList &ips) override;
|
virtual int routeAddList(const QString &gw, const QStringList &ips) override;
|
||||||
|
|||||||
@@ -5,7 +5,6 @@ from conan.errors import ConanInvalidConfiguration
|
|||||||
from conan.tools.scm import Git
|
from conan.tools.scm import Git
|
||||||
from conan.internal.model.pkg_type import PackageType
|
from conan.internal.model.pkg_type import PackageType
|
||||||
from conan.tools.files import chdir
|
from conan.tools.files import chdir
|
||||||
from conan.tools.apple import XCRun
|
|
||||||
|
|
||||||
import os
|
import os
|
||||||
import shutil
|
import shutil
|
||||||
@@ -50,10 +49,7 @@ class OpenVPNAdapter(ConanFile):
|
|||||||
|
|
||||||
def build(self):
|
def build(self):
|
||||||
with chdir(self, self.source_folder):
|
with chdir(self, self.source_folder):
|
||||||
xcrun = XCRun(self)
|
self.run("xcrun xcodebuild"
|
||||||
|
|
||||||
xcodebuild = xcrun.find("xcodebuild")
|
|
||||||
self.run(f"{xcodebuild}"
|
|
||||||
" -project OpenVPNAdapter.xcodeproj"
|
" -project OpenVPNAdapter.xcodeproj"
|
||||||
" -scheme OpenVPNAdapter"
|
" -scheme OpenVPNAdapter"
|
||||||
" -configuration Release"
|
" -configuration Release"
|
||||||
@@ -61,20 +57,10 @@ class OpenVPNAdapter(ConanFile):
|
|||||||
f" -sdk {self._sdk}"
|
f" -sdk {self._sdk}"
|
||||||
f' "CONFIGURATION_BUILD_DIR={self.build_folder}"'
|
f' "CONFIGURATION_BUILD_DIR={self.build_folder}"'
|
||||||
f' "BUILT_PRODUCTS_DIR={self.build_folder}"'
|
f' "BUILT_PRODUCTS_DIR={self.build_folder}"'
|
||||||
" MACH_O_TYPE=staticlib"
|
|
||||||
" BUILD_LIBRARY_FOR_DISTRIBUTION=YES"
|
" BUILD_LIBRARY_FOR_DISTRIBUTION=YES"
|
||||||
" CODE_SIGNING_ALLOWED=NO"
|
" CODE_SIGNING_ALLOWED=NO"
|
||||||
)
|
)
|
||||||
|
|
||||||
openvpnadapter = os.path.join(self.build_folder, "OpenVPNAdapter.framework", "OpenVPNAdapter")
|
|
||||||
self.run(f"{xcrun.libtool} -static -o"
|
|
||||||
f" {openvpnadapter}"
|
|
||||||
f" {openvpnadapter}"
|
|
||||||
f' {os.path.join(self.build_folder, "OpenVPNClient.framework", "OpenVPNClient")}'
|
|
||||||
f' {os.path.join(self.build_folder, "LZ4.framework", "LZ4")}'
|
|
||||||
f' {os.path.join(self.build_folder, "mbedTLS.framework", "mbedTLS")}'
|
|
||||||
)
|
|
||||||
|
|
||||||
def package(self):
|
def package(self):
|
||||||
shutil.copytree(os.path.join(self.build_folder, "OpenVPNAdapter.framework"),
|
shutil.copytree(os.path.join(self.build_folder, "OpenVPNAdapter.framework"),
|
||||||
os.path.join(self.package_folder, "OpenVPNAdapter.framework"))
|
os.path.join(self.package_folder, "OpenVPNAdapter.framework"))
|
||||||
@@ -84,4 +70,3 @@ class OpenVPNAdapter(ConanFile):
|
|||||||
self.cpp_info.type = PackageType.STATIC
|
self.cpp_info.type = PackageType.STATIC
|
||||||
self.cpp_info.package_framework = True
|
self.cpp_info.package_framework = True
|
||||||
self.cpp_info.location = os.path.join(self.package_folder, "OpenVPNAdapter.framework")
|
self.cpp_info.location = os.path.join(self.package_folder, "OpenVPNAdapter.framework")
|
||||||
self.cpp_info.frameworks = ["SystemConfiguration"]
|
|
||||||
|
|||||||
@@ -316,9 +316,12 @@ if(CMAKE_BUILD_TYPE STREQUAL "Debug")
|
|||||||
endif()
|
endif()
|
||||||
|
|
||||||
if(APPLE)
|
if(APPLE)
|
||||||
set_target_properties(${PROJECT} PROPERTIES
|
if(NOT CMAKE_BUILD_TYPE STREQUAL "Debug")
|
||||||
INSTALL_RPATH "@executable_path/../Frameworks"
|
set_target_properties(${PROJECT} PROPERTIES
|
||||||
)
|
INSTALL_RPATH "@executable_path/../Frameworks"
|
||||||
|
BUILD_WITH_INSTALL_RPATH TRUE
|
||||||
|
)
|
||||||
|
endif()
|
||||||
|
|
||||||
find_library(FW_COREFOUNDATION CoreFoundation)
|
find_library(FW_COREFOUNDATION CoreFoundation)
|
||||||
find_library(FW_SYSTEMCONFIG SystemConfiguration)
|
find_library(FW_SYSTEMCONFIG SystemConfiguration)
|
||||||
@@ -425,32 +428,11 @@ endif()
|
|||||||
# install target
|
# install target
|
||||||
install(TARGETS ${PROJECT}
|
install(TARGETS ${PROJECT}
|
||||||
DESTINATION ${CMAKE_INSTALL_BINDIR}
|
DESTINATION ${CMAKE_INSTALL_BINDIR}
|
||||||
RUNTIME_DEPENDENCY_SET service_deps
|
|
||||||
COMPONENT AmneziaVPN
|
COMPONENT AmneziaVPN
|
||||||
)
|
)
|
||||||
|
install(FILES $<TARGET_RUNTIME_DLLS:${PROJECT}>
|
||||||
if(APPLE)
|
DESTINATION ${CMAKE_INSTALL_BINDIR}
|
||||||
set(RUNTIME_DEPS_DIR ${CMAKE_INSTALL_BINDIR}/../Frameworks)
|
|
||||||
else()
|
|
||||||
set(RUNTIME_DEPS_DIR ${CMAKE_INSTALL_BINDIR})
|
|
||||||
endif()
|
|
||||||
|
|
||||||
install(RUNTIME_DEPENDENCY_SET service_deps
|
|
||||||
PRE_EXCLUDE_REGEXES
|
|
||||||
[[api-ms-win-.*]]
|
|
||||||
[[ext-ms-.*]]
|
|
||||||
[[kernel32\.dll]]
|
|
||||||
[[hvsifiletrust\.dll]]
|
|
||||||
[[libc\.so\..*]] [[libgcc_s\.so\..*]] [[libm\.so\..*]] [[libstdc\+\+\.so\..*]]
|
|
||||||
[[.*\.framework]]
|
|
||||||
[[^[Qq]t.*]]
|
|
||||||
POST_EXCLUDE_REGEXES
|
|
||||||
[[^.*[\\/]system32[\\/].*\.dll$]]
|
|
||||||
[[^/lib.*]]
|
|
||||||
[[^/usr/lib.*]]
|
|
||||||
DIRECTORIES ${CONAN_RUNTIME_LIB_DIRS}
|
|
||||||
COMPONENT AmneziaVPN
|
COMPONENT AmneziaVPN
|
||||||
DESTINATION "${RUNTIME_DEPS_DIR}"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
qt_generate_deploy_app_script(
|
qt_generate_deploy_app_script(
|
||||||
|
|||||||
@@ -35,20 +35,7 @@ LocalServer::LocalServer(QObject *parent) : QObject(parent),
|
|||||||
|
|
||||||
QObject::connect(m_server.data(), &QLocalServer::newConnection, this, [this]() {
|
QObject::connect(m_server.data(), &QLocalServer::newConnection, this, [this]() {
|
||||||
qDebug() << "LocalServer new connection";
|
qDebug() << "LocalServer new connection";
|
||||||
|
m_serverNode.addHostSideConnection(m_server->nextPendingConnection());
|
||||||
QLocalSocket *socket = m_server->nextPendingConnection();
|
|
||||||
if (!socket)
|
|
||||||
return;
|
|
||||||
|
|
||||||
m_activeClientSocket = socket;
|
|
||||||
|
|
||||||
QObject::connect(socket, &QLocalSocket::disconnected, this, [this, socket]() {
|
|
||||||
qDebug() << "LocalServer: client disconnected";
|
|
||||||
if (m_activeClientSocket == socket)
|
|
||||||
m_ipcServer.resetServiceState();
|
|
||||||
});
|
|
||||||
|
|
||||||
m_serverNode.addHostSideConnection(socket);
|
|
||||||
|
|
||||||
if (!m_isRemotingEnabled) {
|
if (!m_isRemotingEnabled) {
|
||||||
m_isRemotingEnabled = true;
|
m_isRemotingEnabled = true;
|
||||||
|
|||||||
@@ -41,8 +41,6 @@ public:
|
|||||||
QRemoteObjectHost m_serverNode;
|
QRemoteObjectHost m_serverNode;
|
||||||
bool m_isRemotingEnabled = false;
|
bool m_isRemotingEnabled = false;
|
||||||
|
|
||||||
QPointer<QLocalSocket> m_activeClientSocket;
|
|
||||||
|
|
||||||
NetworkWatcher m_networkWatcher;
|
NetworkWatcher m_networkWatcher;
|
||||||
#ifdef Q_OS_LINUX
|
#ifdef Q_OS_LINUX
|
||||||
DaemonLocalServer server{qApp};
|
DaemonLocalServer server{qApp};
|
||||||
|
|||||||
+3
-3
@@ -9,8 +9,8 @@
|
|||||||
#define APP_MAJOR_VERSION "@APP_MAJOR_VERSION@"
|
#define APP_MAJOR_VERSION "@APP_MAJOR_VERSION@"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define APPLICATION_NAME "AmneziaVPN"
|
#define APPLICATION_NAME "@CLIENT_APPLICATION_NAME@"
|
||||||
#define SERVICE_NAME "AmneziaVPN-service"
|
#define SERVICE_NAME "@CLIENT_SERVICE_NAME@"
|
||||||
#define ORGANIZATION_NAME "AmneziaVPN.ORG"
|
#define ORGANIZATION_NAME "@CLIENT_ORGANIZATION_NAME@"
|
||||||
|
|
||||||
#endif // VERSION_H
|
#endif // VERSION_H
|
||||||
|
|||||||
Reference in New Issue
Block a user