From 1e60792f0c351ce0c1791cb0cafbc619110fbbe0 Mon Sep 17 00:00:00 2001 From: Anh TV Date: Fri, 4 Oct 2024 21:52:50 +0700 Subject: [PATCH 01/38] Merge to dev branch --- CMakeLists.txt | 5 +- client/CMakeLists.txt | 29 +- client/cmake/macos_ne.cmake | 181 ++++ .../AmneziaVPNNetworkExtension.entitlements | 28 +- client/macos/networkextension/CMakeLists.txt | 198 ++++ .../{Info.plist => Info.plist.in} | 29 +- .../networkextension/PrivacyInfo.xcprivacy | 25 + ...ireGuardNetworkExtension-Bridging-Header.h | 13 +- .../wireguard-go-version.h.in | 3 + client/macos/scripts/openvpn.sh | 29 + .../platforms/macos_ne/HevSocksTunnel.swift | 74 ++ client/platforms/macos_ne/Log.swift | 122 +++ client/platforms/macos_ne/LogController.swift | 33 + client/platforms/macos_ne/LogRecord.swift | 103 +++ .../platforms/macos_ne/NELogController.swift | 22 + .../PacketTunnelProvider+OpenVPN.swift | 234 +++++ .../PacketTunnelProvider+WireGuard.swift | 187 ++++ .../macos_ne/PacketTunnelProvider+Xray.swift | 166 ++++ .../macos_ne/PacketTunnelProvider.swift | 234 +++++ .../platforms/macos_ne/QRCodeReaderBase.cpp | 14 + client/platforms/macos_ne/QRCodeReaderBase.h | 20 + client/platforms/macos_ne/QRCodeReaderBase.mm | 110 +++ .../macos_ne/QtAppDelegate-C-Interface.h | 6 + client/platforms/macos_ne/QtAppDelegate.h | 7 + client/platforms/macos_ne/QtAppDelegate.mm | 61 ++ .../platforms/macos_ne/ScreenProtection.swift | 10 + .../platforms/macos_ne/VPNCController.swift | 50 + client/platforms/macos_ne/WGConfig.swift | 94 ++ .../macos_ne/WireGuard-Bridging-Header.h | 28 + client/platforms/macos_ne/ios_controller.h | 99 ++ client/platforms/macos_ne/ios_controller.mm | 851 ++++++++++++++++++ .../macos_ne/ios_controller_wrapper.h | 25 + .../macos_ne/ios_controller_wrapper.mm | 45 + client/platforms/macos_ne/iosglue.mm | 244 +++++ client/platforms/macos_ne/iosnetworkwatcher.h | 31 + .../platforms/macos_ne/iosnetworkwatcher.mm | 69 ++ .../macos_ne/iosnotificationhandler.h | 28 + .../macos_ne/iosnotificationhandler.mm | 90 ++ 38 files changed, 3550 insertions(+), 47 deletions(-) create mode 100644 client/cmake/macos_ne.cmake create mode 100644 client/macos/networkextension/CMakeLists.txt rename client/macos/networkextension/{Info.plist => Info.plist.in} (63%) create mode 100644 client/macos/networkextension/PrivacyInfo.xcprivacy create mode 100644 client/macos/networkextension/wireguard-go-version.h.in create mode 100644 client/macos/scripts/openvpn.sh create mode 100644 client/platforms/macos_ne/HevSocksTunnel.swift create mode 100644 client/platforms/macos_ne/Log.swift create mode 100644 client/platforms/macos_ne/LogController.swift create mode 100644 client/platforms/macos_ne/LogRecord.swift create mode 100644 client/platforms/macos_ne/NELogController.swift create mode 100644 client/platforms/macos_ne/PacketTunnelProvider+OpenVPN.swift create mode 100644 client/platforms/macos_ne/PacketTunnelProvider+WireGuard.swift create mode 100644 client/platforms/macos_ne/PacketTunnelProvider+Xray.swift create mode 100644 client/platforms/macos_ne/PacketTunnelProvider.swift create mode 100644 client/platforms/macos_ne/QRCodeReaderBase.cpp create mode 100644 client/platforms/macos_ne/QRCodeReaderBase.h create mode 100644 client/platforms/macos_ne/QRCodeReaderBase.mm create mode 100644 client/platforms/macos_ne/QtAppDelegate-C-Interface.h create mode 100644 client/platforms/macos_ne/QtAppDelegate.h create mode 100644 client/platforms/macos_ne/QtAppDelegate.mm create mode 100644 client/platforms/macos_ne/ScreenProtection.swift create mode 100644 client/platforms/macos_ne/VPNCController.swift create mode 100644 client/platforms/macos_ne/WGConfig.swift create mode 100644 client/platforms/macos_ne/WireGuard-Bridging-Header.h create mode 100644 client/platforms/macos_ne/ios_controller.h create mode 100644 client/platforms/macos_ne/ios_controller.mm create mode 100644 client/platforms/macos_ne/ios_controller_wrapper.h create mode 100644 client/platforms/macos_ne/ios_controller_wrapper.mm create mode 100644 client/platforms/macos_ne/iosglue.mm create mode 100644 client/platforms/macos_ne/iosnetworkwatcher.h create mode 100644 client/platforms/macos_ne/iosnetworkwatcher.mm create mode 100644 client/platforms/macos_ne/iosnotificationhandler.h create mode 100644 client/platforms/macos_ne/iosnotificationhandler.mm diff --git a/CMakeLists.txt b/CMakeLists.txt index fba4183c..b09ea20d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -31,13 +31,14 @@ set(QT_BUILD_TOOLS_WHEN_CROSS_COMPILING ON) set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON) -if(APPLE AND NOT IOS) +if((APPLE AND NOT IOS) OR (DEFINED MACOS_NE AND MACOS_NE AND NOT IOS)) set(CMAKE_OSX_ARCHITECTURES "x86_64") endif() add_subdirectory(client) -if(NOT IOS AND NOT ANDROID) +# Mac OSX with Network Extension don't need service +if(NOT IOS AND NOT ANDROID AND NOT MACOS_NE) add_subdirectory(service) include(${CMAKE_SOURCE_DIR}/deploy/installer/config.cmake) diff --git a/client/CMakeLists.txt b/client/CMakeLists.txt index 2de5db48..62129aff 100644 --- a/client/CMakeLists.txt +++ b/client/CMakeLists.txt @@ -30,11 +30,12 @@ add_definitions(-DPROD_PROXY_STORAGE_KEY="$ENV{PROD_PROXY_STORAGE_KEY}") add_definitions(-DDEV_AGW_PUBLIC_KEY="$ENV{DEV_AGW_PUBLIC_KEY}") add_definitions(-DDEV_AGW_ENDPOINT="$ENV{DEV_AGW_ENDPOINT}") -if(IOS) +if(IOS OR MACOS_NE) set(PACKAGES ${PACKAGES} Multimedia) endif() -if(WIN32 OR (APPLE AND NOT IOS) OR (LINUX AND NOT ANDROID)) +#Macos Network Extension doesn't need Widgets +if(WIN32 OR (APPLE AND NOT IOS) OR (LINUX AND NOT ANDROID) OR (NOT MACOS_NE)) set(PACKAGES ${PACKAGES} Widgets) endif() @@ -47,18 +48,19 @@ set(LIBS ${LIBS} Qt6::Core5Compat Qt6::Concurrent ) -if(IOS) +if(IOS OR MACOS_NE) set(LIBS ${LIBS} Qt6::Multimedia) endif() -if(WIN32 OR (APPLE AND NOT IOS) OR (LINUX AND NOT ANDROID)) +#Macos Network Extension doesn't need Widgets +if(WIN32 OR (APPLE AND NOT IOS) OR (LINUX AND NOT ANDROID) OR (APPLE NOT MACOS_NE)) set(LIBS ${LIBS} Qt6::Widgets) endif() qt_standard_project_setup() qt_add_executable(${PROJECT} MANUAL_FINALIZATION) -if(WIN32 OR (APPLE AND NOT IOS) OR (LINUX AND NOT ANDROID)) +if(WIN32 OR (APPLE AND NOT IOS) OR (LINUX AND NOT ANDROID) OR (APPLE NOT MACOS_NE)) qt_add_repc_replicas(${PROJECT} ${CMAKE_CURRENT_LIST_DIR}/../ipc/ipc_interface.rep) qt_add_repc_replicas(${PROJECT} ${CMAKE_CURRENT_LIST_DIR}/../ipc/ipc_process_interface.rep) qt_add_repc_replicas(${PROJECT} ${CMAKE_CURRENT_LIST_DIR}/../ipc/ipc_process_tun2socks.rep) @@ -100,6 +102,12 @@ if(IOS) WORKING_DIRECTORY ${CMAKE_CURRENT_LIST_DIR}) endif() +# Build openvpn adapter for MacOS Network Extension +if(MACOS_NE) + execute_process(COMMAND bash ${CMAKE_CURRENT_LIST_DIR}/macos/scripts/openvpn.sh args + WORKING_DIRECTORY ${CMAKE_CURRENT_LIST_DIR}) +endif() + set(IS_CI ${CI}) if(IS_CI) message("Detected CI env") @@ -160,7 +168,7 @@ include_directories(mozilla) include_directories(mozilla/shared) include_directories(mozilla/models) -if(NOT IOS) +if((NOT IOS) OR (NOT MACOS_NE)) set(HEADERS ${HEADERS} ${CMAKE_CURRENT_LIST_DIR}/platforms/ios/QRCodeReaderBase.h ) @@ -210,7 +218,7 @@ if(CMAKE_BUILD_TYPE STREQUAL "Debug") target_compile_definitions(${PROJECT} PRIVATE "MZ_DEBUG") endif() -if(NOT IOS) +if((NOT IOS) OR (NOT MACOS_NE)) set(SOURCES ${SOURCES} ${CMAKE_CURRENT_LIST_DIR}/platforms/ios/QRCodeReaderBase.cpp ) @@ -318,7 +326,8 @@ if(LINUX AND NOT ANDROID) link_directories(${CMAKE_CURRENT_LIST_DIR}/platforms/linux) endif() -if(WIN32 OR (APPLE AND NOT IOS) OR (LINUX AND NOT ANDROID)) +# Macos Network Extension doesn't need +if(WIN32 OR (APPLE AND NOT IOS) OR (LINUX AND NOT ANDROID) OR (APPLE NOT MACOS_NE)) message("Client desktop build") add_compile_definitions(AMNEZIA_DESKTOP) @@ -354,9 +363,11 @@ endif() if(IOS) include(cmake/ios.cmake) include(cmake/ios-arch-fixup.cmake) -elseif(APPLE AND NOT IOS) +elseif(APPLE AND NOT IOS AND NOT MACOS_NE) include(cmake/osxtools.cmake) include(cmake/macos.cmake) + elseif(APPLE AND NOT IOS AND MACOS_NE) + include(cmake/macos_ne.cmake) endif() target_link_libraries(${PROJECT} PRIVATE ${LIBS}) diff --git a/client/cmake/macos_ne.cmake b/client/cmake/macos_ne.cmake new file mode 100644 index 00000000..95f74093 --- /dev/null +++ b/client/cmake/macos_ne.cmake @@ -0,0 +1,181 @@ +message("Client ==> iOS build") + +set_target_properties(${PROJECT} PROPERTIES MACOSX_BUNDLE TRUE) +set(CMAKE_OSX_ARCHITECTURES "x86_64" CACHE INTERNAL "" FORCE) +set(CMAKE_OSX_DEPLOYMENT_TARGET 10.15) + +set(APPLE_PROJECT_VERSION ${CMAKE_PROJECT_VERSION_MAJOR}.${CMAKE_PROJECT_VERSION_MINOR}.${CMAKE_PROJECT_VERSION_PATCH}) + + +enable_language(OBJC) +# enable_language(OBJCXX) +enable_language(Swift) + +find_package(Qt6 REQUIRED COMPONENTS ShaderTools) +set(LIBS ${LIBS} Qt6::ShaderTools) + +find_library(FW_AUTHENTICATIONSERVICES AuthenticationServices) +#find_library(FW_UIKIT UIKit) +find_library(FW_AVFOUNDATION AVFoundation) +find_library(FW_FOUNDATION Foundation) +find_library(FW_STOREKIT StoreKit) +find_library(FW_USERNOTIFICATIONS UserNotifications) +find_library(FW_NETWORKEXTENSION NetworkExtension) + +set(LIBS ${LIBS} + ${FW_AUTHENTICATIONSERVICES} +# ${FW_UIKIT} + ${FW_AVFOUNDATION} + ${FW_FOUNDATION} + ${FW_STOREKIT} + ${FW_USERNOTIFICATIONS} + ${FW_NETWORKEXTENSION} +) + + +set(HEADERS ${HEADERS} + ${CMAKE_CURRENT_SOURCE_DIR}/platforms/ios/ios_controller.h + ${CMAKE_CURRENT_SOURCE_DIR}/platforms/ios/ios_controller_wrapper.h + ${CMAKE_CURRENT_SOURCE_DIR}/platforms/ios/iosnotificationhandler.h + ${CMAKE_CURRENT_SOURCE_DIR}/platforms/ios/QtAppDelegate.h + ${CMAKE_CURRENT_SOURCE_DIR}/platforms/ios/QtAppDelegate-C-Interface.h +) +set_source_files_properties(${CMAKE_CURRENT_SOURCE_DIR}/platforms/ios/ios_controller.h PROPERTIES OBJECTIVE_CPP_HEADER TRUE) + + +set(SOURCES ${SOURCES} + ${CMAKE_CURRENT_SOURCE_DIR}/platforms/ios/ios_controller.mm + ${CMAKE_CURRENT_SOURCE_DIR}/platforms/ios/ios_controller_wrapper.mm + ${CMAKE_CURRENT_SOURCE_DIR}/platforms/ios/iosnotificationhandler.mm + ${CMAKE_CURRENT_SOURCE_DIR}/platforms/ios/iosglue.mm + ${CMAKE_CURRENT_SOURCE_DIR}/platforms/ios/QRCodeReaderBase.mm + ${CMAKE_CURRENT_SOURCE_DIR}/platforms/ios/QtAppDelegate.mm +) + +set(ICON_FILE ${CMAKE_CURRENT_SOURCE_DIR}/images/app.icns) +set(MACOSX_BUNDLE_ICON_FILE app.icns) +set_source_files_properties(${ICON_FILE} PROPERTIES MACOSX_PACKAGE_LOCATION Resources) +set(SOURCES ${SOURCES} ${ICON_FILE}) + +# set(HEADERS ${HEADERS} +# ${CMAKE_CURRENT_SOURCE_DIR}/ui/macos_util.h +# ) + +# set(SOURCES ${SOURCES} +# ${CMAKE_CURRENT_SOURCE_DIR}/ui/macos_util.mm +# ) + + +target_include_directories(${PROJECT} PRIVATE ${Qt6Gui_PRIVATE_INCLUDE_DIRS}) + + +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_ICON_FILE "AppIcon" + MACOSX_BUNDLE_INFO_STRING "AmneziaVPN" + MACOSX_BUNDLE_BUNDLE_NAME "AmneziaVPN" + MACOSX_BUNDLE_BUNDLE_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}" + XCODE_ATTRIBUTE_PRODUCT_BUNDLE_IDENTIFIER "${BUILD_IOS_APP_IDENTIFIER}" + XCODE_ATTRIBUTE_CODE_SIGN_ENTITLEMENTS "${CMAKE_CURRENT_SOURCE_DIR}/ios/app/main.entitlements" + XCODE_ATTRIBUTE_MARKETING_VERSION "${APPLE_PROJECT_VERSION}" + XCODE_ATTRIBUTE_CURRENT_PROJECT_VERSION "${CMAKE_PROJECT_VERSION_TWEAK}" + XCODE_ATTRIBUTE_PRODUCT_NAME "AmneziaVPN" + XCODE_ATTRIBUTE_BUNDLE_INFO_STRING "AmneziaVPN" + XCODE_GENERATE_SCHEME TRUE + XCODE_ATTRIBUTE_ENABLE_BITCODE "NO" + #XCODE_ATTRIBUTE_ASSETCATALOG_COMPILER_APPICON_NAME "AppIcon" + XCODE_ATTRIBUTE_TARGETED_DEVICE_FAMILY "1,2" + XCODE_EMBED_FRAMEWORKS_CODE_SIGN_ON_COPY "NO" + XCODE_EMBED_FRAMEWORKS_REMOVE_HEADERS_ON_COPY "YES" + + XCODE_LINK_BUILD_PHASE_MODE KNOWN_LOCATION + XCODE_ATTRIBUTE_LD_RUNPATH_SEARCH_PATHS "@executable_path/../Frameworks" + XCODE_EMBED_APP_EXTENSIONS networkextension + + XCODE_ATTRIBUTE_CODE_SIGN_STYLE Automatic + #XCODE_ATTRIBUTE_CODE_SIGN_STYLE Manual + + #XCODE_ATTRIBUTE_CODE_SIGN_IDENTITY "Apple Distribution: Privacy Technologies OU (X7UJ388FXK)" + #XCODE_ATTRIBUTE_CODE_SIGN_IDENTITY[variant=Debug] "Apple Development" + + + #XCODE_ATTRIBUTE_PROVISIONING_PROFILE_SPECIFIER "Mac AppStore AmneziaVPN" + #XCODE_ATTRIBUTE_PROVISIONING_PROFILE_SPECIFIER[variant=Debug] "Mac AppStore AmneziaVPN" + +) +set_target_properties(${PROJECT} PROPERTIES + XCODE_ATTRIBUTE_SWIFT_VERSION "5.0" + XCODE_ATTRIBUTE_CLANG_ENABLE_MODULES "YES" + XCODE_ATTRIBUTE_SWIFT_PRECOMPILE_BRIDGING_HEADER "NO" + XCODE_ATTRIBUTE_SWIFT_OBJC_INTERFACE_HEADER_NAME "AmneziaVPN-Swift.h" + XCODE_ATTRIBUTE_SWIFT_OBJC_INTEROP_MODE "objcxx" +) +set_target_properties(${PROJECT} PROPERTIES + XCODE_ATTRIBUTE_DEVELOPMENT_TEAM "X7UJ388FXK" +) +target_include_directories(${PROJECT} PRIVATE ${CMAKE_CURRENT_LIST_DIR}) +target_compile_options(${PROJECT} PRIVATE + -DGROUP_ID=\"${BUILD_IOS_GROUP_IDENTIFIER}\" + -DVPN_NE_BUNDLEID=\"${BUILD_IOS_APP_IDENTIFIER}.network-extension\" +) + +set(WG_APPLE_SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/3rd/amneziawg-apple/Sources) + +target_sources(${PROJECT} PRIVATE +# ${CMAKE_CURRENT_SOURCE_DIR}/platforms/ios/iosvpnprotocol.swift + ${WG_APPLE_SOURCE_DIR}/WireGuardKitC/x25519.c + ${CLIENT_ROOT_DIR}/platforms/ios/LogController.swift + ${CLIENT_ROOT_DIR}/platforms/ios/Log.swift + ${CLIENT_ROOT_DIR}/platforms/ios/LogRecord.swift + ${CLIENT_ROOT_DIR}/platforms/ios/ScreenProtection.swift + ${CLIENT_ROOT_DIR}/platforms/ios/VPNCController.swift +) + +target_sources(${PROJECT} PRIVATE + #${CMAKE_CURRENT_SOURCE_DIR}/ios/app/AmneziaVPNLaunchScreen.storyboard + ${CMAKE_CURRENT_SOURCE_DIR}/ios/app/Media.xcassets + ${CMAKE_CURRENT_SOURCE_DIR}/ios/app/PrivacyInfo.xcprivacy +) + +set_property(TARGET ${PROJECT} APPEND PROPERTY RESOURCE + #${CMAKE_CURRENT_SOURCE_DIR}/ios/app/AmneziaVPNLaunchScreen.storyboard + ${CMAKE_CURRENT_SOURCE_DIR}/ios/app/Media.xcassets + ${CMAKE_CURRENT_SOURCE_DIR}/ios/app/PrivacyInfo.xcprivacy +) + +add_subdirectory(macos/networkextension) +add_dependencies(${PROJECT} networkextension) + +# set_property(TARGET ${PROJECT} PROPERTY XCODE_EMBED_FRAMEWORKS +# "${CMAKE_CURRENT_SOURCE_DIR}/3rd/OpenVPNAdapter/build/Release-iphoneos/OpenVPNAdapter.framework" +# ) + + + +# set(CMAKE_XCODE_ATTRIBUTE_FRAMEWORK_SEARCH_PATHS ${CMAKE_CURRENT_SOURCE_DIR}/3rd/OpenVPNAdapter/build/Release-iphoneos) +# target_link_libraries("networkextension" PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/3rd/OpenVPNAdapter/build/Release-iphoneos/OpenVPNAdapter.framework") + +get_target_property(QtCore_location Qt6::Core LOCATION) +message("QtCore_location") +message(${QtCore_location}) + +get_filename_component(QT_BIN_DIR_DETECTED "${QtCore_location}/../../../../../bin" ABSOLUTE) + + +# add_custom_command(TARGET ${PROJECT} POST_BUILD +# COMMAND ${QT_BIN_DIR_DETECTED}/macdeployqt $ -appstore-compliant -qmldir=${CMAKE_CURRENT_SOURCE_DIR} +# ) + +# if(CMAKE_BUILD_TYPE STREQUAL "Release") +# SET(SIGN_CMD codesign --deep --force --sign 'Apple Distribution: Privacy Technologies OU \(X7UJ388FXK\)' --timestamp --options runtime $) +# message("Manual signing bundle...") +# message(${SIGN_CMD}) + + +# add_custom_command(TARGET ${PROJECT} POST_BUILD +# COMMAND ${SIGN_CMD} +# ) +# endif() diff --git a/client/macos/networkextension/AmneziaVPNNetworkExtension.entitlements b/client/macos/networkextension/AmneziaVPNNetworkExtension.entitlements index b4f08784..1d6ec4a1 100644 --- a/client/macos/networkextension/AmneziaVPNNetworkExtension.entitlements +++ b/client/macos/networkextension/AmneziaVPNNetworkExtension.entitlements @@ -3,40 +3,26 @@ com.apple.application-identifier - $(DEVELOPMENT_TEAM).$(NETEXT_ID_MACOS) - + X7UJ388FXK.org.amnezia.AmneziaVPN.network-extension com.apple.developer.networking.networkextension packet-tunnel-provider - - keychain-access-groups - - $(DEVELOPMENT_TEAM).* - - com.apple.developer.team-identifier - $(DEVELOPMENT_TEAM) - - com.apple.developer.system-extension.install - - + X7UJ388FXK com.apple.security.app-sandbox - com.apple.security.application-groups - $(DEVELOPMENT_TEAM).$(GROUP_ID_MACOS) + group.org.amnezia.AmneziaVPN - com.apple.security.network.client - com.apple.security.network.server - com.apple.security.app-sandbox - - com.apple.private.network.socket-delegate - + keychain-access-groups + + $(AppIdentifierPrefix)org.amnezia.AmneziaVPN.network-extension + diff --git a/client/macos/networkextension/CMakeLists.txt b/client/macos/networkextension/CMakeLists.txt new file mode 100644 index 00000000..5ae76c44 --- /dev/null +++ b/client/macos/networkextension/CMakeLists.txt @@ -0,0 +1,198 @@ +enable_language(Swift) +message("Client message >> macos build >> networkextension") +set(CLIENT_ROOT_DIR ${CMAKE_CURRENT_LIST_DIR}/../..) + +add_executable(networkextension) + +configure_file( + ${CMAKE_CURRENT_LIST_DIR}/Info.plist.in + ${CMAKE_CURRENT_BINARY_DIR}/Info.plist +) + +set_target_properties(networkextension PROPERTIES + XCODE_PRODUCT_TYPE com.apple.product-type.app-extension + BUNDLE_EXTENSION appex + + #MACOSX_BUNDLE_INFO_PLIST ${CMAKE_CURRENT_BINARY_DIR}/Info.plist + + MACOSX_BUNDLE_SHORT_VERSION_STRING "${APPLE_PROJECT_VERSION}" + + XCODE_ATTRIBUTE_PRODUCT_BUNDLE_IDENTIFIER "${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_MARKETING_VERSION "${APP_MAJOR_VERSION}" + XCODE_ATTRIBUTE_CURRENT_PROJECT_VERSION "${BUILD_ID}" + XCODE_ATTRIBUTE_PRODUCT_NAME "AmneziaVPNNetworkExtension" + + XCODE_ATTRIBUTE_APPLICATION_EXTENSION_API_ONLY "YES" + XCODE_ATTRIBUTE_ENABLE_BITCODE "NO" + XCODE_ATTRIBUTE_TARGETED_DEVICE_FAMILY "1,2" + + XCODE_ATTRIBUTE_LD_RUNPATH_SEARCH_PATHS "@executable_path/../../Frameworks" + + # XCODE_ATTRIBUTE_CODE_SIGN_STYLE Automatic + # #XCODE_ATTRIBUTE_CODE_SIGN_STYLE Manual + + # #XCODE_ATTRIBUTE_CODE_SIGN_IDENTITY "Apple Distribution: Privacy Technologies OU (X7UJ388FXK)" + # #XCODE_ATTRIBUTE_CODE_SIGN_IDENTITY[variant=Debug] "Apple Development" + + + # #XCODE_ATTRIBUTE_PROVISIONING_PROFILE_SPECIFIER "Mac AppStore AmneziaVPN.network-extension" + # #XCODE_ATTRIBUTE_PROVISIONING_PROFILE_SPECIFIER[variant=Debug] "Mac AppStore AmneziaVPN.network-extension" + + XCODE_ATTRIBUTE_INFOPLIST_FILE "${CMAKE_CURRENT_BINARY_DIR}/Info.plist" + XCODE_ATTRIBUTE_LD_RUNPATH_SEARCH_PATHS "@executable_path/../../../../Frameworks @loader_path/../../../../Frameworks" +) + +if(CMAKE_BUILD_TYPE STREQUAL "Debug") + set_target_properties(networkextension PROPERTIES + XCODE_ATTRIBUTE_CODE_SIGN_STYLE Automatic + ) +endif() + +if(CMAKE_BUILD_TYPE STREQUAL "Release") + set_target_properties(networkextension PROPERTIES + XCODE_ATTRIBUTE_CODE_SIGN_STYLE Automatic + #XCODE_ATTRIBUTE_CODE_SIGN_STYLE Manual + + #XCODE_ATTRIBUTE_CODE_SIGN_IDENTITY "Apple Distribution: Privacy Technologies OU (X7UJ388FXK)" + #XCODE_ATTRIBUTE_CODE_SIGN_IDENTITY[variant=Debug] "Apple Development" + + + #XCODE_ATTRIBUTE_PROVISIONING_PROFILE_SPECIFIER "Mac AppStore AmneziaVPN.network-extension" + #XCODE_ATTRIBUTE_PROVISIONING_PROFILE_SPECIFIER[variant=Debug] "Mac AppStore AmneziaVPN.network-extension" + ) +endif() + + +set_target_properties(networkextension PROPERTIES + XCODE_ATTRIBUTE_SWIFT_VERSION "5.0" + XCODE_ATTRIBUTE_CLANG_ENABLE_MODULES "YES" + XCODE_ATTRIBUTE_SWIFT_OBJC_BRIDGING_HEADER "${CMAKE_CURRENT_SOURCE_DIR}/WireGuardNetworkExtension-Bridging-Header.h" + XCODE_ATTRIBUTE_SWIFT_OPTIMIZATION_LEVEL "-Onone" + XCODE_ATTRIBUTE_SWIFT_PRECOMPILE_BRIDGING_HEADER "NO" +) + +set_target_properties("networkextension" PROPERTIES + XCODE_ATTRIBUTE_DEVELOPMENT_TEAM "X7UJ388FXK" +) + +find_library(FW_ASSETS_LIBRARY AssetsLibrary) +find_library(FW_MOBILE_CORE MobileCoreServices) +find_library(FW_UI_KIT UIKit) +find_library(FW_LIBRESOLV libresolv.9.tbd) + +# set(OpenVPNAdapter_DIR "${CLIENT_ROOT_DIR}/3rd/") + +# find_library(OPENVPN_ADAPTER_LIBRARY OpenVPNAdapter PATHS ${OpenVPNAdapter_DIR}) +# target_link_libraries(networkextension PRIVATE ${OPENVPN_ADAPTER_LIBRARY}) + +# add_custom_command(TARGET networkextension PRE_BUILD +# COMMAND ${CMAKE_COMMAND} -E make_directory $/../Frameworks +# ) + + +# add_custom_command(TARGET networkextension POST_BUILD +# COMMAND ${CMAKE_COMMAND} -E echo "Copying ${OPENVPN_ADAPTER_LIBRARY} to $/../Frameworks/" +# COMMAND ${CMAKE_COMMAND} -E copy_if_different +# ${OPENVPN_ADAPTER_LIBRARY} +# $/../Frameworks/ +# COMMAND ${CMAKE_COMMAND} -E echo "Copy complete" +# ) + + + + +# Set the root directory +set(CLIENT_ROOT_DIR ${CMAKE_CURRENT_LIST_DIR}/../..) + +# Embedding the framework using CLIENT_ROOT_DIR +set_property(TARGET networkextension PROPERTY XCODE_EMBED_FRAMEWORKS + "${CLIENT_ROOT_DIR}/3rd/OpenVPNAdapter/build/Release-macos/OpenVPNAdapter.framework" +) + +# Setting the framework search paths using CLIENT_ROOT_DIR +set(CMAKE_XCODE_ATTRIBUTE_FRAMEWORK_SEARCH_PATHS "${CLIENT_ROOT_DIR}/3rd/OpenVPNAdapter/build/Release-macos") + +# Linking the framework using CLIENT_ROOT_DIR +target_link_libraries("networkextension" PRIVATE "${CLIENT_ROOT_DIR}/3rd/OpenVPNAdapter/build/Release-macos/OpenVPNAdapter.framework") + + + +#target_link_libraries(networkextension PRIVATE ${FW_ASSETS_LIBRARY}) +#target_link_libraries(networkextension PRIVATE ${FW_MOBILE_CORE}) +#target_link_libraries(networkextension PRIVATE ${FW_UI_KIT}) +target_link_libraries(networkextension PRIVATE ${FW_LIBRESOLV}) + +target_compile_options(networkextension PRIVATE -DGROUP_ID=\"${BUILD_IOS_GROUP_IDENTIFIER}\") +target_compile_options(networkextension PRIVATE -DNETWORK_EXTENSION=1) + +set(WG_APPLE_SOURCE_DIR ${CLIENT_ROOT_DIR}/3rd/amneziawg-apple/Sources) + +message("WG_APPLE_SOURCE_DIR is: ${WG_APPLE_SOURCE_DIR}") +message("CLIENT_ROOT_DIR is: ${CLIENT_ROOT_DIR}") + +target_sources(networkextension PRIVATE + ${WG_APPLE_SOURCE_DIR}/WireGuardKit/WireGuardAdapter.swift + ${WG_APPLE_SOURCE_DIR}/WireGuardKit/PacketTunnelSettingsGenerator.swift + ${WG_APPLE_SOURCE_DIR}/WireGuardKit/DNSResolver.swift + ${WG_APPLE_SOURCE_DIR}/WireGuardNetworkExtension/ErrorNotifier.swift + ${WG_APPLE_SOURCE_DIR}/Shared/Keychain.swift + ${WG_APPLE_SOURCE_DIR}/Shared/Model/TunnelConfiguration+WgQuickConfig.swift + ${WG_APPLE_SOURCE_DIR}/Shared/Model/NETunnelProviderProtocol+Extension.swift + ${WG_APPLE_SOURCE_DIR}/Shared/Model/String+ArrayConversion.swift + ${WG_APPLE_SOURCE_DIR}/WireGuardKit/TunnelConfiguration.swift + ${WG_APPLE_SOURCE_DIR}/WireGuardKit/IPAddressRange.swift + ${WG_APPLE_SOURCE_DIR}/WireGuardKit/Endpoint.swift + ${WG_APPLE_SOURCE_DIR}/WireGuardKit/DNSServer.swift + ${WG_APPLE_SOURCE_DIR}/WireGuardKit/InterfaceConfiguration.swift + ${WG_APPLE_SOURCE_DIR}/WireGuardKit/PeerConfiguration.swift + ${WG_APPLE_SOURCE_DIR}/Shared/FileManager+Extension.swift + ${WG_APPLE_SOURCE_DIR}/WireGuardKitC/x25519.c + ${WG_APPLE_SOURCE_DIR}/WireGuardKit/Array+ConcurrentMap.swift + ${WG_APPLE_SOURCE_DIR}/WireGuardKit/IPAddress+AddrInfo.swift + ${WG_APPLE_SOURCE_DIR}/WireGuardKit/PrivateKey.swift + ${CLIENT_ROOT_DIR}/platforms/macos_ne/HevSocksTunnel.swift + ${CLIENT_ROOT_DIR}/platforms/macos_ne/NELogController.swift + ${CLIENT_ROOT_DIR}/platforms/macos_ne/Log.swift + ${CLIENT_ROOT_DIR}/platforms/macos_ne/LogRecord.swift + ${CLIENT_ROOT_DIR}/platforms/macos_ne/PacketTunnelProvider.swift + ${CLIENT_ROOT_DIR}/platforms/macos_ne/PacketTunnelProvider+WireGuard.swift + ${CLIENT_ROOT_DIR}/platforms/macos_ne/PacketTunnelProvider+OpenVPN.swift + ${CLIENT_ROOT_DIR}/platforms/macos_ne/PacketTunnelProvider+Xray.swift + ${CLIENT_ROOT_DIR}/platforms/macos_ne/WGConfig.swift + ${CLIENT_ROOT_DIR}/platforms/macos_ne/iosglue.mm +) + +target_sources(networkextension PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR}/PrivacyInfo.xcprivacy +) + +set_property(TARGET networkextension APPEND PROPERTY RESOURCE + ${CMAKE_CURRENT_SOURCE_DIR}/PrivacyInfo.xcprivacy +) + +## Build wireguard-go-version.h +execute_process( + COMMAND go list -m golang.zx2c4.com/wireguard + WORKING_DIRECTORY ${CLIENT_ROOT_DIR}/3rd/wireguard-apple/Sources/WireGuardKitGo + OUTPUT_VARIABLE WG_VERSION_FULL +) +string(REGEX REPLACE ".*v\([0-9.]*\).*" "\\1" WG_VERSION_STRING 1.1.1) +configure_file(${CMAKE_CURRENT_SOURCE_DIR}/wireguard-go-version.h.in + ${CMAKE_CURRENT_BINARY_DIR}/wireguard-go-version.h) +target_sources(networkextension PRIVATE + ${CMAKE_CURRENT_BINARY_DIR}/wireguard-go-version.h) + +target_include_directories(networkextension PRIVATE ${CLIENT_ROOT_DIR}) +target_include_directories(networkextension PRIVATE ${CMAKE_CURRENT_BINARY_DIR}) + +target_link_libraries(networkextension PRIVATE ${CLIENT_ROOT_DIR}/3rd-prebuilt/3rd-prebuilt/wireguard/ios/arm64/libwg-go.a) + +# Print the root directory for debugging purposes +message("---------") +message(${CLIENT_ROOT_DIR}) +message(${CLIENT_ROOT_DIR}/3rd-prebuilt/3rd-prebuilt/xray/HevSocks5Tunnel.xcframework/macos-arm64_x86_64/libhev-socks5-tunnel.a) +target_link_libraries("networkextension" PRIVATE "${CLIENT_ROOT_DIR}/3rd-prebuilt/3rd-prebuilt/xray/HevSocks5Tunnel.xcframework/macos-arm64_x86_64/libhev-socks5-tunnel.a") + +target_include_directories(networkextension PRIVATE ${CLIENT_ROOT_DIR}/3rd-prebuilt/3rd-prebuilt/xray/HevSocks5Tunnel.xcframework/macos-arm64_x86_64/Headers) \ No newline at end of file diff --git a/client/macos/networkextension/Info.plist b/client/macos/networkextension/Info.plist.in similarity index 63% rename from client/macos/networkextension/Info.plist rename to client/macos/networkextension/Info.plist.in index 96d82459..5ceaa356 100644 --- a/client/macos/networkextension/Info.plist +++ b/client/macos/networkextension/Info.plist.in @@ -3,27 +3,32 @@ CFBundleDevelopmentRegion - $(DEVELOPMENT_LANGUAGE) - CFBundleDisplayName - AmneziaVPNNetworkExtension + en CFBundleExecutable - $(EXECUTABLE_NAME) + AmneziaVPNNetworkExtension + CFBundleIdentifier - $(PRODUCT_BUNDLE_IDENTIFIER) + ${BUILD_IOS_APP_IDENTIFIER}.network-extension CFBundleInfoDictionaryVersion 6.0 CFBundleName - $(PRODUCT_NAME) + AmneziaVPNNetworkExtension CFBundlePackageType $(PRODUCT_BUNDLE_PACKAGE_TYPE) CFBundleShortVersionString - $(MARKETING_VERSION) + ${APPLE_PROJECT_VERSION} CFBundleVersion - $(CURRENT_PROJECT_VERSION) + ${CMAKE_PROJECT_VERSION_TWEAK} + ITSAppUsesNonExemptEncryption + LSMinimumSystemVersion - $(MACOSX_DEPLOYMENT_TARGET) + ${CMAKE_OSX_DEPLOYMENT_TARGET} + + CFBundleDisplayName + AmneziaVPNNetworkExtension + NSExtension NSExtensionPointIdentifier @@ -31,5 +36,11 @@ NSExtensionPrincipalClass $(PRODUCT_MODULE_NAME).PacketTunnelProvider + + com.wireguard.ios.app_group_id + group.org.amnezia.AmneziaVPN + + com.wireguard.macos.app_group_id + ${BUILD_VPN_DEVELOPMENT_TEAM}.group.org.amnezia.AmneziaVPN diff --git a/client/macos/networkextension/PrivacyInfo.xcprivacy b/client/macos/networkextension/PrivacyInfo.xcprivacy new file mode 100644 index 00000000..380e0b7b --- /dev/null +++ b/client/macos/networkextension/PrivacyInfo.xcprivacy @@ -0,0 +1,25 @@ + + + + + NSPrivacyAccessedAPITypes + + + NSPrivacyAccessedAPIType + NSPrivacyAccessedAPICategoryUserDefaults + NSPrivacyAccessedAPITypeReasons + + 1C8F.1 + + + + NSPrivacyAccessedAPIType + NSPrivacyAccessedAPICategoryFileTimestamp + NSPrivacyAccessedAPITypeReasons + + C617.1 + + + + + diff --git a/client/macos/networkextension/WireGuardNetworkExtension-Bridging-Header.h b/client/macos/networkextension/WireGuardNetworkExtension-Bridging-Header.h index 4ae7bded..f911e186 100644 --- a/client/macos/networkextension/WireGuardNetworkExtension-Bridging-Header.h +++ b/client/macos/networkextension/WireGuardNetworkExtension-Bridging-Header.h @@ -1,10 +1,6 @@ -/* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ - -#include "macos/gobridge/wireguard.h" #include "wireguard-go-version.h" -#include "3rd/awg-apple/Sources/WireGuardKitC/WireGuardKitC.h" +#include "3rd/amneziawg-apple/Sources/WireGuardKitGo/wireguard.h" +#include "3rd/amneziawg-apple/Sources/WireGuardKitC/WireGuardKitC.h" #include #include @@ -23,3 +19,8 @@ bool key_from_hex(uint8_t key[WG_KEY_LEN], const char* hex); bool key_eq(const uint8_t key1[WG_KEY_LEN], const uint8_t key2[WG_KEY_LEN]); void write_msg_to_log(const char* tag, const char* msg); + +// Khai báo hàm C để Swift có thể sử dụng +void hev_socks5_tunnel_quit(void); +// Updated function definition in C +int hev_socks5_tunnel_main(const char* configFile, int fd); diff --git a/client/macos/networkextension/wireguard-go-version.h.in b/client/macos/networkextension/wireguard-go-version.h.in new file mode 100644 index 00000000..860bc3c3 --- /dev/null +++ b/client/macos/networkextension/wireguard-go-version.h.in @@ -0,0 +1,3 @@ +#ifndef WIREGUARD_GO_VERSION +#define WIREGUARD_GO_VERSION "@WG_VERSION_STRING@" +#endif // WIREGUARD_GO_VERSION \ No newline at end of file diff --git a/client/macos/scripts/openvpn.sh b/client/macos/scripts/openvpn.sh new file mode 100644 index 00000000..ce8f6054 --- /dev/null +++ b/client/macos/scripts/openvpn.sh @@ -0,0 +1,29 @@ +XCODEBUILD="/usr/bin/xcodebuild" +WORKINGDIR=`pwd` +PATCH="/usr/bin/patch" + +# Copy the Project.xcconfig settings to amnezia.xcconfig +cat $WORKINGDIR/3rd/OpenVPNAdapter/Configuration/Project.xcconfig > $WORKINGDIR/3rd/OpenVPNAdapter/Configuration/amnezia.xcconfig + +# Append macOS-specific build directory configurations to amnezia.xcconfig +cat << EOF >> $WORKINGDIR/3rd/OpenVPNAdapter/Configuration/amnezia.xcconfig +PROJECT_TEMP_DIR = $WORKINGDIR/3rd/OpenVPNAdapter/build/OpenVPNAdapter.build +CONFIGURATION_BUILD_DIR = $WORKINGDIR/3rd/OpenVPNAdapter/build/Release-macos +BUILT_PRODUCTS_DIR = $WORKINGDIR/3rd/OpenVPNAdapter/build/Release-macos +EOF + +# Fetch the current macOS SDK version dynamically +MACOSX_SDK=macosx15.0 +cd 3rd/OpenVPNAdapter + +# Build for macOS using the correct SDK and destination +if $XCODEBUILD -scheme OpenVPNAdapter -configuration Release -xcconfig Configuration/amnezia.xcconfig -sdk $MACOSX_SDK -destination 'generic/platform=macOS' -project OpenVPNAdapter.xcodeproj ; then + echo "OpenVPNAdapter built successfully for macOS" +else + echo "OpenVPNAdapter macOS build failed ..." +fi + +# Remove CodeSignature if needed for macOS +rm -rf ./build/Release-macos/OpenVPNAdapter.framework/Versions/A/_CodeSignature + +cd ../../ diff --git a/client/platforms/macos_ne/HevSocksTunnel.swift b/client/platforms/macos_ne/HevSocksTunnel.swift new file mode 100644 index 00000000..1b914218 --- /dev/null +++ b/client/platforms/macos_ne/HevSocksTunnel.swift @@ -0,0 +1,74 @@ +import Darwin +import SystemConfiguration + +public enum Socks5Tunnel { + + private static var tunnelFileDescriptor: Int32? { + var ctlInfo = ctl_info() + withUnsafeMutablePointer(to: &ctlInfo.ctl_name) { + $0.withMemoryRebound(to: CChar.self, capacity: MemoryLayout.size(ofValue: $0.pointee)) { + _ = strcpy($0, "com.apple.net.utun_control") // strcpy comes from Darwin + } + } + for fd: Int32 in 0...1024 { + var addr = sockaddr_ctl() + var ret: Int32 = -1 + var len = socklen_t(MemoryLayout.size(ofValue: addr)) // socklen_t comes from Darwin + withUnsafeMutablePointer(to: &addr) { + $0.withMemoryRebound(to: sockaddr.self, capacity: 1) { // sockaddr from Darwin + ret = getpeername(fd, $0, &len) // getpeername from Darwin + } + } + if ret != 0 || addr.sc_family != AF_SYSTEM { // AF_SYSTEM from Darwin + continue + } + if ctlInfo.ctl_id == 0 { + ret = ioctl(fd, CTLIOCGINFO, &ctlInfo) // ioctl from Darwin + if ret != 0 { + continue + } + } + if addr.sc_id == ctlInfo.ctl_id { + return fd + } + } + return nil + } + + private static var interfaceName: String? { + guard let tunnelFileDescriptor = self.tunnelFileDescriptor else { + return nil + } + var buffer = [UInt8](repeating: 0, count: Int(IFNAMSIZ)) // IFNAMSIZ from Darwin + return buffer.withUnsafeMutableBufferPointer { mutableBufferPointer in + guard let baseAddress = mutableBufferPointer.baseAddress else { + return nil + } + var ifnameSize = socklen_t(IFNAMSIZ) // socklen_t and IFNAMSIZ from Darwin + let result = getsockopt( + tunnelFileDescriptor, + 2 /* SYSPROTO_CONTROL */, + 2 /* UTUN_OPT_IFNAME */, + baseAddress, + &ifnameSize + ) + if result == 0 { + return String(cString: baseAddress) + } else { + return nil + } + } + } + + @discardableResult + public static func run(withConfig filePath: String) -> Int32 { + guard let fileDescriptor = self.tunnelFileDescriptor else { + fatalError("Get tunnel file descriptor failed.") + } + return hev_socks5_tunnel_main(filePath.cString(using: .utf8), fileDescriptor) + } + + public static func quit() { + hev_socks5_tunnel_quit() + } +} diff --git a/client/platforms/macos_ne/Log.swift b/client/platforms/macos_ne/Log.swift new file mode 100644 index 00000000..d2222f9d --- /dev/null +++ b/client/platforms/macos_ne/Log.swift @@ -0,0 +1,122 @@ +import Foundation +import os.log + +struct Log { + static let osLog = Logger() + + private static let IsLoggingEnabledKey = "IsLoggingEnabled" + static var isLoggingEnabled: Bool { + get { + sharedUserDefaults.bool(forKey: IsLoggingEnabledKey) + } + set { + sharedUserDefaults.setValue(newValue, forKey: IsLoggingEnabledKey) + } + } + + private static let appGroupID = "group.org.amnezia.AmneziaVPN" + + static let appLogURL = { + let sharedContainerURL = FileManager.default.containerURL(forSecurityApplicationGroupIdentifier: appGroupID)! + return sharedContainerURL.appendingPathComponent("app.log", isDirectory: false) + }() + + static let neLogURL = { + let sharedContainerURL = FileManager.default.containerURL(forSecurityApplicationGroupIdentifier: appGroupID)! + return sharedContainerURL.appendingPathComponent("ne.log", isDirectory: false) + }() + + private static var sharedUserDefaults = { + UserDefaults(suiteName: appGroupID)! + }() + + static let dateFormatter: DateFormatter = { + let dateFormatter = DateFormatter() + dateFormatter.dateFormat = "yyyy-MM-dd HH:mm:ss" + return dateFormatter + }() + + var records = [Record]() + + var lastRecordDate = Date.distantPast + + init() { + self.records = [] + } + + init(_ str: String) { + records = str.split(whereSeparator: \.isNewline) + .map { + if let record = Record(String($0)) { + lastRecordDate = record.date + return record + } else { + return Record(date: lastRecordDate, level: .error, message: "LOG: \($0)") + } + } + } + + init?(at url: URL) { + if !FileManager.default.fileExists(atPath: url.path) { + guard (try? "".data(using: .utf8)?.write(to: url)) != nil else { return nil } + } + + guard let fileHandle = try? FileHandle(forUpdating: url) else { return nil } + + defer { fileHandle.closeFile() } + + guard + let data = try? fileHandle.readToEnd(), + let str = String(data: data, encoding: .utf8) else { + return nil + } + + self.init(str) + } + + static func log(_ type: OSLogType, title: String = "", message: String, url: URL = neLogURL) { + NSLog("\(title) \(message)") + + guard isLoggingEnabled else { return } + + osLog.log(level: type, "\(title) \(message)") + + let date = Date() + let level = Record.Level(from: type) + let messages = message.split(whereSeparator: \.isNewline) + + for index in 0.. std.string { + let qtLog = Log(String(describing: qtString)) + var log = qtLog + + if let appLog = Log(at: Log.appLogURL) { + appLog.records.forEach { + log.records.append($0) + } + } + + if let neLog = Log(at: Log.neLogURL) { + neLog.records.forEach { + log.records.append($0) + } + } + + log.records.sort { + $0.date < $1.date + } + + return std.string(log.description) +} + +public func swiftDeleteLog() { + Log.clear(at: Log.appLogURL) + Log.clear(at: Log.neLogURL) +} + +public func toggleLogging(_ isEnabled: Bool) { + Log.isLoggingEnabled = isEnabled +} diff --git a/client/platforms/macos_ne/LogRecord.swift b/client/platforms/macos_ne/LogRecord.swift new file mode 100644 index 00000000..658d10cf --- /dev/null +++ b/client/platforms/macos_ne/LogRecord.swift @@ -0,0 +1,103 @@ +import Foundation +import os.log + +extension Log { + struct Record { + let date: Date + let level: Level + let message: String + + init?(_ str: String) { + let dateStr = String(str.prefix(19)) + guard let date = Log.dateFormatter.date(from: dateStr) else { return nil } + + let str = str.dropFirst(20) + + guard let endIndex = str.firstIndex(of: " ") else { return nil } + let levelStr = String(str[str.startIndex.. Void) { + guard let protocolConfiguration = self.protocolConfiguration as? NETunnelProviderProtocol, + let providerConfiguration = protocolConfiguration.providerConfiguration, + let openVPNConfigData = providerConfiguration[Constants.ovpnConfigKey] as? Data else { + ovpnLog(.error, message: "Can't start") + return + } + + do { + let openVPNConfig = try JSONDecoder().decode(OpenVPNConfig.self, from: openVPNConfigData) + ovpnLog(.info, title: "config: ", message: openVPNConfig.str) + let ovpnConfiguration = Data(openVPNConfig.config.utf8) + setupAndlaunchOpenVPN(withConfig: ovpnConfiguration, completionHandler: completionHandler) + } catch { + ovpnLog(.error, message: "Can't parse config: \(error.localizedDescription)") + + if let underlyingError = (error as NSError).userInfo[NSUnderlyingErrorKey] as? NSError { + ovpnLog(.error, message: "Can't parse config: \(underlyingError.localizedDescription)") + } + + return + } + } + + private func setupAndlaunchOpenVPN(withConfig ovpnConfiguration: Data, + withShadowSocks viaSS: Bool = false, + completionHandler: @escaping (Error?) -> Void) { + ovpnLog(.info, message: "Setup and launch") + + let str = String(decoding: ovpnConfiguration, as: UTF8.self) + + let configuration = OpenVPNConfiguration() + configuration.fileContent = ovpnConfiguration + if str.contains("cloak") { + configuration.setPTCloak() + } + + let evaluation: OpenVPNConfigurationEvaluation? + do { + ovpnAdapter = OpenVPNAdapter() + ovpnAdapter?.delegate = self + evaluation = try ovpnAdapter?.apply(configuration: configuration) + + } catch { + completionHandler(error) + return + } + + if evaluation?.autologin == false { + ovpnLog(.info, message: "Implement login with user credentials") + } + + vpnReachability.startTracking { [weak self] status in + guard status == .reachableViaWiFi else { return } + self?.ovpnAdapter?.reconnect(afterTimeInterval: 5) + } + + startHandler = completionHandler + ovpnAdapter?.connect(using: packetFlow) + } + + func handleOpenVPNStatusMessage(_ messageData: Data, completionHandler: ((Data?) -> Void)? = nil) { + guard let completionHandler = completionHandler else { return } + let bytesin = ovpnAdapter?.transportStatistics.bytesIn + let bytesout = ovpnAdapter?.transportStatistics.bytesOut + + guard let bytesin, let bytesout else { + completionHandler(nil) + return + } + + let response: [String: Any] = [ + "rx_bytes": bytesin, + "tx_bytes": bytesout + ] + + completionHandler(try? JSONSerialization.data(withJSONObject: response, options: [])) + } + + func stopOpenVPN(with reason: NEProviderStopReason, completionHandler: @escaping () -> Void) { + ovpnLog(.info, message: "Stopping tunnel: reason: \(reason.description)") + + stopHandler = completionHandler + if vpnReachability.isTracking { + vpnReachability.stopTracking() + } + ovpnAdapter?.disconnect() + } +} + +extension PacketTunnelProvider: OpenVPNAdapterDelegate { + // OpenVPNAdapter calls this delegate method to configure a VPN tunnel. + // `completionHandler` callback requires an object conforming to `OpenVPNAdapterPacketFlow` + // protocol if the tunnel is configured without errors. Otherwise send nil. + // `OpenVPNAdapterPacketFlow` method signatures are similar to `NEPacketTunnelFlow` so + // you can just extend that class to adopt `OpenVPNAdapterPacketFlow` protocol and + // send `self.packetFlow` to `completionHandler` callback. + func openVPNAdapter( + _ openVPNAdapter: OpenVPNAdapter, + configureTunnelWithNetworkSettings networkSettings: NEPacketTunnelNetworkSettings?, + completionHandler: @escaping (Error?) -> Void + ) { + // In order to direct all DNS queries first to the VPN DNS servers before the primary DNS servers + // send empty string to NEDNSSettings.matchDomains + networkSettings?.dnsSettings?.matchDomains = [""] + + if splitTunnelType == 1 { + var ipv4IncludedRoutes = [NEIPv4Route]() + + guard let splitTunnelSites else { + completionHandler(NSError(domain: "Split tunnel sited not setted up", code: 0)) + return + } + + for allowedIPString in splitTunnelSites { + if let allowedIP = IPAddressRange(from: allowedIPString) { + ipv4IncludedRoutes.append(NEIPv4Route( + destinationAddress: "\(allowedIP.address)", + subnetMask: "\(allowedIP.subnetMask())")) + } + } + + networkSettings?.ipv4Settings?.includedRoutes = ipv4IncludedRoutes + } else { + if splitTunnelType == 2 { + var ipv4ExcludedRoutes = [NEIPv4Route]() + var ipv4IncludedRoutes = [NEIPv4Route]() + var ipv6IncludedRoutes = [NEIPv6Route]() + + guard let splitTunnelSites else { + completionHandler(NSError(domain: "Split tunnel sited not setted up", code: 0)) + return + } + + for excludeIPString in splitTunnelSites { + if let excludeIP = IPAddressRange(from: excludeIPString) { + ipv4ExcludedRoutes.append(NEIPv4Route( + destinationAddress: "\(excludeIP.address)", + subnetMask: "\(excludeIP.subnetMask())")) + } + } + + if let allIPv4 = IPAddressRange(from: "0.0.0.0/0") { + ipv4IncludedRoutes.append(NEIPv4Route( + destinationAddress: "\(allIPv4.address)", + subnetMask: "\(allIPv4.subnetMask())")) + } + if let allIPv6 = IPAddressRange(from: "::/0") { + ipv6IncludedRoutes.append(NEIPv6Route( + destinationAddress: "\(allIPv6.address)", + networkPrefixLength: NSNumber(value: allIPv6.networkPrefixLength))) + } + networkSettings?.ipv4Settings?.includedRoutes = ipv4IncludedRoutes + networkSettings?.ipv6Settings?.includedRoutes = ipv6IncludedRoutes + networkSettings?.ipv4Settings?.excludedRoutes = ipv4ExcludedRoutes + } + } + + // Set the network settings for the current tunneling session. + setTunnelNetworkSettings(networkSettings, completionHandler: completionHandler) + } + + // Process events returned by the OpenVPN library + func openVPNAdapter( + _ openVPNAdapter: OpenVPNAdapter, + handleEvent event: OpenVPNAdapterEvent, + message: String?) { + switch event { + case .connected: + if reasserting { + reasserting = false + } + + guard let startHandler = startHandler else { return } + + startHandler(nil) + self.startHandler = nil + case .disconnected: + guard let stopHandler = stopHandler else { return } + + if vpnReachability.isTracking { + vpnReachability.stopTracking() + } + + stopHandler() + self.stopHandler = nil + case .reconnecting: + reasserting = true + default: + break + } + } + + // Handle errors thrown by the OpenVPN library + func openVPNAdapter(_ openVPNAdapter: OpenVPNAdapter, handleError error: Error) { + // Handle only fatal errors + guard let fatal = (error as NSError).userInfo[OpenVPNAdapterErrorFatalKey] as? Bool, + fatal == true else { return } + + if vpnReachability.isTracking { + vpnReachability.stopTracking() + } + + if let startHandler { + startHandler(error) + self.startHandler = nil + } else { + cancelTunnelWithError(error) + } + } + + // Use this method to process any log message returned by OpenVPN library. + func openVPNAdapter(_ openVPNAdapter: OpenVPNAdapter, handleLogMessage logMessage: String) { + // Handle log messages + ovpnLog(.info, message: logMessage) + } +} + +extension NEPacketTunnelFlow: OpenVPNAdapterPacketFlow {} diff --git a/client/platforms/macos_ne/PacketTunnelProvider+WireGuard.swift b/client/platforms/macos_ne/PacketTunnelProvider+WireGuard.swift new file mode 100644 index 00000000..18200c7f --- /dev/null +++ b/client/platforms/macos_ne/PacketTunnelProvider+WireGuard.swift @@ -0,0 +1,187 @@ +import Foundation +import NetworkExtension + +extension PacketTunnelProvider { + func startWireguard(activationAttemptId: String?, + errorNotifier: ErrorNotifier, + completionHandler: @escaping (Error?) -> Void) { + guard let protocolConfiguration = self.protocolConfiguration as? NETunnelProviderProtocol, + let providerConfiguration = protocolConfiguration.providerConfiguration, + let wgConfigData: Data = providerConfiguration[Constants.wireGuardConfigKey] as? Data else { + wg_log(.error, message: "Can't start, config missing") + completionHandler(nil) + return + } + + do { + let wgConfig = try JSONDecoder().decode(WGConfig.self, from: wgConfigData) + let wgConfigStr = wgConfig.str + wg_log(.info, title: "config: ", message: wgConfig.redux) + + let tunnelConfiguration = try TunnelConfiguration(fromWgQuickConfig: wgConfigStr) + + if tunnelConfiguration.peers.first!.allowedIPs + .map({ $0.stringRepresentation }) + .joined(separator: ", ") == "0.0.0.0/0, ::/0" { + if wgConfig.splitTunnelType == 1 { + for index in tunnelConfiguration.peers.indices { + tunnelConfiguration.peers[index].allowedIPs.removeAll() + var allowedIPs = [IPAddressRange]() + + for allowedIPString in wgConfig.splitTunnelSites { + if let allowedIP = IPAddressRange(from: allowedIPString) { + allowedIPs.append(allowedIP) + } + } + + tunnelConfiguration.peers[index].allowedIPs = allowedIPs + } + } else if wgConfig.splitTunnelType == 2 { + for index in tunnelConfiguration.peers.indices { + var excludeIPs = [IPAddressRange]() + + for excludeIPString in wgConfig.splitTunnelSites { + if let excludeIP = IPAddressRange(from: excludeIPString) { + excludeIPs.append(excludeIP) + } + } + + tunnelConfiguration.peers[index].excludeIPs = excludeIPs + } + } + } + + wg_log(.info, message: "Starting tunnel from the " + + (activationAttemptId == nil ? "OS directly, rather than the app" : "app")) + + // Start the tunnel + wgAdapter = WireGuardAdapter(with: self) { logLevel, message in + wg_log(logLevel.osLogLevel, message: message) + } + + wgAdapter?.start(tunnelConfiguration: tunnelConfiguration) { [weak self] adapterError in + guard let adapterError else { + let interfaceName = self?.wgAdapter?.interfaceName ?? "unknown" + wg_log(.info, message: "Tunnel interface is \(interfaceName)") + completionHandler(nil) + return + } + + switch adapterError { + case .cannotLocateTunnelFileDescriptor: + wg_log(.error, staticMessage: "Starting tunnel failed: could not determine file descriptor") + errorNotifier.notify(PacketTunnelProviderError.couldNotDetermineFileDescriptor) + completionHandler(PacketTunnelProviderError.couldNotDetermineFileDescriptor) + case .dnsResolution(let dnsErrors): + let hostnamesWithDnsResolutionFailure = dnsErrors.map { $0.address } + .joined(separator: ", ") + wg_log(.error, message: + "DNS resolution failed for the following hostnames: \(hostnamesWithDnsResolutionFailure)") + errorNotifier.notify(PacketTunnelProviderError.dnsResolutionFailure) + completionHandler(PacketTunnelProviderError.dnsResolutionFailure) + case .setNetworkSettings(let error): + wg_log(.error, message: + "Starting tunnel failed with setTunnelNetworkSettings returning \(error.localizedDescription)") + errorNotifier.notify(PacketTunnelProviderError.couldNotSetNetworkSettings) + completionHandler(PacketTunnelProviderError.couldNotSetNetworkSettings) + case .startWireGuardBackend(let errorCode): + wg_log(.error, message: "Starting tunnel failed with wgTurnOn returning \(errorCode)") + errorNotifier.notify(PacketTunnelProviderError.couldNotStartBackend) + completionHandler(PacketTunnelProviderError.couldNotStartBackend) + case .invalidState: + fatalError() + } + } + } catch { + wg_log(.error, message: "Can't parse WG config: \(error.localizedDescription)") + completionHandler(nil) + return + } + } + + func handleWireguardStatusMessage(_ messageData: Data, completionHandler: ((Data?) -> Void)? = nil) { + guard let completionHandler = completionHandler else { return } + wgAdapter?.getRuntimeConfiguration { settings in + let components = settings!.components(separatedBy: "\n") + + var settingsDictionary: [String: String] = [:] + for component in components { + let pair = component.components(separatedBy: "=") + if pair.count == 2 { + settingsDictionary[pair[0]] = pair[1] + } + } + + let response: [String: Any] = [ + "rx_bytes": settingsDictionary["rx_bytes"] ?? "0", + "tx_bytes": settingsDictionary["tx_bytes"] ?? "0" + ] + + completionHandler(try? JSONSerialization.data(withJSONObject: response, options: [])) + } + } + + private func handleWireguardAppMessage(_ messageData: Data, completionHandler: ((Data?) -> Void)? = nil) { + guard let completionHandler = completionHandler else { return } + if messageData.count == 1 && messageData[0] == 0 { + wgAdapter?.getRuntimeConfiguration { settings in + var data: Data? + if let settings { + data = settings.data(using: .utf8)! + } + completionHandler(data) + } + } else if messageData.count >= 1 { + // Updates the tunnel configuration and responds with the active configuration + wg_log(.info, message: "Switching tunnel configuration") + guard let configString = String(data: messageData, encoding: .utf8) + else { + completionHandler(nil) + return + } + + do { + let tunnelConfiguration = try TunnelConfiguration(fromWgQuickConfig: configString) + wgAdapter?.update(tunnelConfiguration: tunnelConfiguration) { [weak self] error in + if let error { + wg_log(.error, message: "Failed to switch tunnel configuration: \(error.localizedDescription)") + completionHandler(nil) + return + } + + self?.wgAdapter?.getRuntimeConfiguration { settings in + var data: Data? + if let settings { + data = settings.data(using: .utf8)! + } + completionHandler(data) + } + } + } catch { + completionHandler(nil) + } + } else { + completionHandler(nil) + } + } + + func stopWireguard(with reason: NEProviderStopReason, completionHandler: @escaping () -> Void) { + wg_log(.info, message: "Stopping tunnel: reason: \(reason.description)") + + wgAdapter?.stop { error in + ErrorNotifier.removeLastErrorFile() + + if let error { + wg_log(.error, message: "Failed to stop WireGuard adapter: \(error.localizedDescription)") + } + completionHandler() + +#if os(macOS) + // HACK: This is a filthy hack to work around Apple bug 32073323 (dup'd by us as 47526107). + // Remove it when they finally fix this upstream and the fix has been rolled out to + // sufficient quantities of users. + exit(0) +#endif + } + } +} diff --git a/client/platforms/macos_ne/PacketTunnelProvider+Xray.swift b/client/platforms/macos_ne/PacketTunnelProvider+Xray.swift new file mode 100644 index 00000000..277980d6 --- /dev/null +++ b/client/platforms/macos_ne/PacketTunnelProvider+Xray.swift @@ -0,0 +1,166 @@ +import Foundation +import NetworkExtension +import WireGuardKitGo + +enum XrayErrors: Error { + case noXrayConfig + case cantSaveXrayConfig + case cantParseListenAndPort + case cantSaveHevSocksConfig +} + +extension Constants { + static let cachesDirectory: URL = { + if let cachesDirectoryURL = FileManager.default.urls(for: .cachesDirectory, + in: .userDomainMask).first { + return cachesDirectoryURL + } else { + fatalError("Unable to retrieve caches directory.") + } + }() +} + +extension PacketTunnelProvider { + func startXray(completionHandler: @escaping (Error?) -> Void) { + + // Xray configuration + guard let protocolConfiguration = self.protocolConfiguration as? NETunnelProviderProtocol, + let providerConfiguration = protocolConfiguration.providerConfiguration, + let xrayConfigData = providerConfiguration[Constants.xrayConfigKey] as? Data else { + xrayLog(.error, message: "Can't get xray configuration") + completionHandler(XrayErrors.noXrayConfig) + return + } + + // Tunnel settings + let ipv6Enabled = true + let hideVPNIcon = false + + let settings = NEPacketTunnelNetworkSettings(tunnelRemoteAddress: "254.1.1.1") + settings.mtu = 9000 + + settings.ipv4Settings = { + let settings = NEIPv4Settings(addresses: ["198.18.0.1"], subnetMasks: ["255.255.0.0"]) + settings.includedRoutes = [NEIPv4Route.default()] + return settings + }() + + settings.ipv6Settings = { + guard ipv6Enabled else { + return nil + } + let settings = NEIPv6Settings(addresses: ["fd6e:a81b:704f:1211::1"], networkPrefixLengths: [64]) + settings.includedRoutes = [NEIPv6Route.default()] + if hideVPNIcon { + settings.excludedRoutes = [NEIPv6Route(destinationAddress: "::", networkPrefixLength: 128)] + } + return settings + }() + + let dns = ["8.8.4.4","1.1.1.1"] + settings.dnsSettings = NEDNSSettings(servers: dns) + + do { + let port = 10808 + let address = "::1" + + let jsonDict = try JSONSerialization.jsonObject(with: xrayConfigData, + options: []) as? [String: Any] + + guard var jsonDict else { + xrayLog(.error, message: "Can't parse address and port for hevSocks") + completionHandler(XrayErrors.cantParseListenAndPort) + return + } + + if var inboundsArray = jsonDict["inbounds"] as? [[String: Any]], !inboundsArray.isEmpty { + inboundsArray[0]["port"] = port + inboundsArray[0]["listen"] = address + jsonDict["inbounds"] = inboundsArray + } + + let updatedData = try JSONSerialization.data(withJSONObject: jsonDict, options: []) + + setTunnelNetworkSettings(settings) { [weak self] error in + if let error { + completionHandler(error) + return + } + + // Launch xray + self?.setupAndStartXray(configData: updatedData) { xrayError in + if let xrayError { + completionHandler(xrayError) + return + } + + // Launch hevSocks + self?.setupAndRunTun2socks(configData: updatedData, + address: address, + port: port, + completionHandler: completionHandler) + } + } + } catch { + completionHandler(error) + return + } + } + + func stopXray(completionHandler: () -> Void) { + Socks5Tunnel.quit() + LibXrayStopXray() + completionHandler() + } + + private func setupAndStartXray(configData: Data, + completionHandler: @escaping (Error?) -> Void) { + let path = Constants.cachesDirectory.appendingPathComponent("config.json", isDirectory: false).path + guard FileManager.default.createFile(atPath: path, contents: configData) else { + xrayLog(.error, message: "Can't save xray configuration") + completionHandler(XrayErrors.cantSaveXrayConfig) + return + } + + LibXrayRunXray(nil, + path, + Int64.max) + + completionHandler(nil) + xrayLog(.info, message: "Xray started") + } + + private func setupAndRunTun2socks(configData: Data, + address: String, + port: Int, + completionHandler: @escaping (Error?) -> Void) { + let config = """ + tunnel: + mtu: 9000 + socks5: + port: \(port) + address: \(address) + udp: 'udp' + misc: + task-stack-size: 20480 + connect-timeout: 5000 + read-write-timeout: 60000 + log-file: stderr + log-level: error + limit-nofile: 65535 + """ + + let configurationFilePath = Constants.cachesDirectory.appendingPathComponent("config.yml", isDirectory: false).path + guard FileManager.default.createFile(atPath: configurationFilePath, contents: config.data(using: .utf8)!) else { + xrayLog(.info, message: "Cant save hevSocks configuration") + completionHandler(XrayErrors.cantSaveHevSocksConfig) + return + } + + DispatchQueue.global().async { + xrayLog(.info, message: "Hev socks started") + completionHandler(nil) + Socks5Tunnel.run(withConfig: configurationFilePath) + } + } +} diff --git a/client/platforms/macos_ne/PacketTunnelProvider.swift b/client/platforms/macos_ne/PacketTunnelProvider.swift new file mode 100644 index 00000000..9a5a5846 --- /dev/null +++ b/client/platforms/macos_ne/PacketTunnelProvider.swift @@ -0,0 +1,234 @@ +import Foundation +import NetworkExtension +import os +import Darwin +import OpenVPNAdapter + +enum TunnelProtoType: String { + case wireguard, openvpn, xray + +} + +struct Constants { + static let kDefaultPathKey = "defaultPath" + static let processQueueName = "org.amnezia.process-packets" + static let kActivationAttemptId = "activationAttemptId" + static let ovpnConfigKey = "ovpn" + static let xrayConfigKey = "xray" + static let wireGuardConfigKey = "wireguard" + static let loggerTag = "NET" + + static let kActionStart = "start" + static let kActionRestart = "restart" + static let kActionStop = "stop" + static let kActionGetTunnelId = "getTunnelId" + static let kActionStatus = "status" + static let kActionIsServerReachable = "isServerReachable" + static let kMessageKeyAction = "action" + static let kMessageKeyTunnelId = "tunnelId" + static let kMessageKeyConfig = "config" + static let kMessageKeyErrorCode = "errorCode" + static let kMessageKeyHost = "host" + static let kMessageKeyPort = "port" + static let kMessageKeyOnDemand = "is-on-demand" + static let kMessageKeySplitTunnelType = "SplitTunnelType" + static let kMessageKeySplitTunnelSites = "SplitTunnelSites" +} + +class PacketTunnelProvider: NEPacketTunnelProvider { + var wgAdapter: WireGuardAdapter? + var ovpnAdapter: OpenVPNAdapter? + + var splitTunnelType: Int? + var splitTunnelSites: [String]? + + let vpnReachability = OpenVPNReachability() + + var startHandler: ((Error?) -> Void)? + var stopHandler: (() -> Void)? + var protoType: TunnelProtoType? + + override func handleAppMessage(_ messageData: Data, completionHandler: ((Data?) -> Void)? = nil) { + guard let message = String(data: messageData, encoding: .utf8) else { + if let completionHandler { + completionHandler(nil) + } + return + } + + neLog(.info, title: "App said: ", message: message) + + guard let message = try? JSONSerialization.jsonObject(with: messageData, options: []) as? [String: Any] else { + neLog(.error, message: "Failed to serialize message from app") + return + } + + guard let completionHandler else { + neLog(.error, message: "Missing message completion handler") + return + } + + guard let action = message[Constants.kMessageKeyAction] as? String else { + neLog(.error, message: "Missing action key in app message") + completionHandler(nil) + return + } + + if action == Constants.kActionStatus { + handleStatusAppMessage(messageData, + completionHandler: completionHandler) + } + } + + override func startTunnel(options: [String : NSObject]? = nil, + completionHandler: @escaping ((any Error)?) -> Void) { + let activationAttemptId = options?[Constants.kActivationAttemptId] as? String + let errorNotifier = ErrorNotifier(activationAttemptId: activationAttemptId) + + neLog(.info, message: "Start tunnel") + + if let protocolConfiguration = protocolConfiguration as? NETunnelProviderProtocol { + let providerConfiguration = protocolConfiguration.providerConfiguration + if (providerConfiguration?[Constants.ovpnConfigKey] as? Data) != nil { + protoType = .openvpn + } else if (providerConfiguration?[Constants.wireGuardConfigKey] as? Data) != nil { + protoType = .wireguard + } else if (providerConfiguration?[Constants.xrayConfigKey] as? Data) != nil { + protoType = .xray + } + } + + guard let protoType else { + let error = NSError(domain: "Protocol is not selected", code: 0) + completionHandler(error) + return + } + + switch protoType { + case .wireguard: + startWireguard(activationAttemptId: activationAttemptId, + errorNotifier: errorNotifier, + completionHandler: completionHandler) + case .openvpn: + startOpenVPN(completionHandler: completionHandler) + case .xray: + startXray(completionHandler: completionHandler) + + } + } + + + override func stopTunnel(with reason: NEProviderStopReason, completionHandler: @escaping () -> Void) { + guard let protoType else { + completionHandler() + return + } + + switch protoType { + case .wireguard: + stopWireguard(with: reason, + completionHandler: completionHandler) + case .openvpn: + stopOpenVPN(with: reason, + completionHandler: completionHandler) + case .xray: + stopXray(completionHandler: completionHandler) + } + } + + func handleStatusAppMessage(_ messageData: Data, completionHandler: ((Data?) -> Void)? = nil) { + guard let protoType else { + completionHandler?(nil) + return + } + + switch protoType { + case .wireguard: + handleWireguardStatusMessage(messageData, completionHandler: completionHandler) + case .openvpn: + handleOpenVPNStatusMessage(messageData, completionHandler: completionHandler) + case .xray: + break; + } + } + + // MARK: Network observing methods + override func observeValue(forKeyPath keyPath: String?, + of object: Any?, + change: [NSKeyValueChangeKey: Any]?, + context: UnsafeMutableRawPointer?) { + guard Constants.kDefaultPathKey != keyPath else { return } + // Since iOS 11, we have observed that this KVO event fires repeatedly when connecting over Wifi, + // even though the underlying network has not changed (i.e. `isEqualToPath` returns false), + // leading to "wakeup crashes" due to excessive network activity. Guard against false positives by + // comparing the paths' string description, which includes properties not exposed by the class + guard let lastPath: NWPath = change?[.oldKey] as? NWPath, + let defPath = defaultPath, + lastPath != defPath || lastPath.description != defPath.description else { + return + } + DispatchQueue.main.async { [weak self] in + guard let self, self.defaultPath != nil else { return } + self.handle(networkChange: self.defaultPath!) { _ in } + } + } + + private func handle(networkChange changePath: NWPath, completion: @escaping (Error?) -> Void) { + wg_log(.info, message: "Tunnel restarted.") + startTunnel(options: nil, completionHandler: completion) + } +} + +extension WireGuardLogLevel { + var osLogLevel: OSLogType { + switch self { + case .verbose: + return .debug + case .error: + return .error + } + } +} + +extension NEProviderStopReason: CustomStringConvertible { + public var description: String { + switch self { + case .none: + return "No specific reason" + case .userInitiated: + return "The user stopped the NE" + case .providerFailed: + return "The NE failed to function correctly" + case .noNetworkAvailable: + return "No network connectivity is currently available" + case .unrecoverableNetworkChange: + return "The device’s network connectivity changed" + case .providerDisabled: + return "The NE was disabled" + case .authenticationCanceled: + return "The authentication process was canceled" + case .configurationFailed: + return "The VPNC is invalid" + case .idleTimeout: + return "The session timed out" + case .configurationDisabled: + return "The VPNC was disabled" + case .configurationRemoved: + return "The VPNC was removed" + case .superceded: + return "VPNC was superceded by a higher-priority VPNC" + case .userLogout: + return "The user logged out" + case .userSwitch: + return "The current console user changed" + case .connectionFailed: + return "The connection failed" + case .sleep: + return "A stop reason indicating the VPNC enabled disconnect on sleep and the device went to sleep" + case .appUpdate: + return "appUpdat" + @unknown default: + return "@unknown default" + } + } +} diff --git a/client/platforms/macos_ne/QRCodeReaderBase.cpp b/client/platforms/macos_ne/QRCodeReaderBase.cpp new file mode 100644 index 00000000..c3148a85 --- /dev/null +++ b/client/platforms/macos_ne/QRCodeReaderBase.cpp @@ -0,0 +1,14 @@ +#include "QRCodeReaderBase.h" + +QRCodeReader::QRCodeReader() +{ + +} + +QRect QRCodeReader::cameraSize() { + return QRect(); +} + +void QRCodeReader::startReading() {} +void QRCodeReader::stopReading() {} +void QRCodeReader::setCameraSize(QRect) {} diff --git a/client/platforms/macos_ne/QRCodeReaderBase.h b/client/platforms/macos_ne/QRCodeReaderBase.h new file mode 100644 index 00000000..83a766d0 --- /dev/null +++ b/client/platforms/macos_ne/QRCodeReaderBase.h @@ -0,0 +1,20 @@ +#ifndef QRCODEREADERBASE_H +#define QRCODEREADERBASE_H + +#include +#include + +class QRCodeReader: public QObject { + Q_OBJECT + +public: + +signals: + void codeReaded(QString code); + +private: + void* m_qrCodeReader; + QRect m_cameraSize; +}; + +#endif // QRCODEREADERBASE_H diff --git a/client/platforms/macos_ne/QRCodeReaderBase.mm b/client/platforms/macos_ne/QRCodeReaderBase.mm new file mode 100644 index 00000000..e08feb74 --- /dev/null +++ b/client/platforms/macos_ne/QRCodeReaderBase.mm @@ -0,0 +1,110 @@ +#include "QRCodeReaderBase.h" + +//#import +#import + +//@interface QRCodeReaderImpl : UIViewController +//@end + +/*@interface QRCodeReaderImpl () +@property (nonatomic) QRCodeReader* qrCodeReader; +@property (nonatomic, strong) AVCaptureSession *captureSession; +@property (nonatomic, strong) AVCaptureVideoPreviewLayer *videoPreviewPlayer; +@end + + +@implementation QRCodeReaderImpl + +//- (void)viewDidLoad { +// [super viewDidLoad]; + +// _captureSession = nil; +//} + +//- (void)setQrCodeReader: (QRCodeReader*)value { +// _qrCodeReader = value; +//} + +- (BOOL)startReading { + NSError *error; + + AVCaptureDevice *captureDevice = [AVCaptureDevice defaultDeviceWithMediaType: AVMediaTypeVideo]; + AVCaptureDeviceInput *deviceInput = [AVCaptureDeviceInput deviceInputWithDevice: captureDevice error: &error]; + + if(!deviceInput) { + NSLog(@"Error %@", error.localizedDescription); + return NO; + } + + _captureSession = [[AVCaptureSession alloc]init]; + [_captureSession addInput:deviceInput]; + + AVCaptureMetadataOutput *capturedMetadataOutput = [[AVCaptureMetadataOutput alloc] init]; + [_captureSession addOutput:capturedMetadataOutput]; + + dispatch_queue_t dispatchQueue; + dispatchQueue = dispatch_queue_create("myQueue", NULL); + [capturedMetadataOutput setMetadataObjectsDelegate: self queue: dispatchQueue]; + [capturedMetadataOutput setMetadataObjectTypes: [NSArray arrayWithObject:AVMetadataObjectTypeQRCode]]; + + _videoPreviewPlayer = [[AVCaptureVideoPreviewLayer alloc] initWithSession: _captureSession]; + + //CGFloat statusBarHeight = [UIApplication sharedApplication].statusBarFrame.size.height; + + QRect cameraRect = _qrCodeReader->cameraSize(); + CGRect cameraCGRect = CGRectMake(cameraRect.x(), + cameraRect.y() + statusBarHeight, + cameraRect.width(), + cameraRect.height()); + + [_videoPreviewPlayer setVideoGravity: AVLayerVideoGravityResizeAspectFill]; + [_videoPreviewPlayer setFrame: cameraCGRect]; + + // CALayer* layer = [UIApplication sharedApplication].keyWindow.layer; + [layer addSublayer: _videoPreviewPlayer]; + + [_captureSession startRunning]; + + return YES; +} + +- (void)stopReading { + [_captureSession stopRunning]; + _captureSession = nil; + + [_videoPreviewPlayer removeFromSuperlayer]; +} + +- (void)captureOutput:(AVCaptureOutput *)output didOutputMetadataObjects:(NSArray<__kindof AVMetadataObject *> *)metadataObjects fromConnection:(AVCaptureConnection *)connection { + + if (metadataObjects != nil && metadataObjects.count > 0) { + AVMetadataMachineReadableCodeObject *metadataObject = [metadataObjects objectAtIndex:0]; + + if ([[metadataObject type] isEqualToString: AVMetadataObjectTypeQRCode]) { + _qrCodeReader->emit codeReaded([metadataObject stringValue].UTF8String); + } + } +} + +@end + +QRCodeReader::QRCodeReader() { + m_qrCodeReader = [[QRCodeReaderImpl alloc] init]; + [m_qrCodeReader setQrCodeReader: this]; +} + +QRect QRCodeReader::cameraSize() { + return m_cameraSize; +} + +void QRCodeReader::setCameraSize(QRect value) { + m_cameraSize = value; +} + +void QRCodeReader::startReading() { + [m_qrCodeReader startReading]; +} + +void QRCodeReader::stopReading() { + [m_qrCodeReader stopReading]; +}*/ diff --git a/client/platforms/macos_ne/QtAppDelegate-C-Interface.h b/client/platforms/macos_ne/QtAppDelegate-C-Interface.h new file mode 100644 index 00000000..dd358097 --- /dev/null +++ b/client/platforms/macos_ne/QtAppDelegate-C-Interface.h @@ -0,0 +1,6 @@ +#ifndef QTAPPDELEGATECINTERFACE_H +#define QTAPPDELEGATECINTERFACE_H + +void QtAppDelegateInitialize(); + +#endif // QTAPPDELEGATECINTERFACE_H diff --git a/client/platforms/macos_ne/QtAppDelegate.h b/client/platforms/macos_ne/QtAppDelegate.h new file mode 100644 index 00000000..19978965 --- /dev/null +++ b/client/platforms/macos_ne/QtAppDelegate.h @@ -0,0 +1,7 @@ +//#import + +@interface QIOSApplicationDelegate +@end + +@interface QIOSApplicationDelegate (AmneziaVPNDelegate) +@end diff --git a/client/platforms/macos_ne/QtAppDelegate.mm b/client/platforms/macos_ne/QtAppDelegate.mm new file mode 100644 index 00000000..2ac7e612 --- /dev/null +++ b/client/platforms/macos_ne/QtAppDelegate.mm @@ -0,0 +1,61 @@ +#import "QtAppDelegate.h" +#import "ios_controller.h" + +#include + + +@implementation QIOSApplicationDelegate (AmneziaVPNDelegate) + +/*- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions +{ + [application setMinimumBackgroundFetchInterval: UIApplicationBackgroundFetchIntervalMinimum]; + // Override point for customization after application launch. + NSLog(@"Application didFinishLaunchingWithOptions"); + return YES; +} + +- (void)applicationDidEnterBackground:(UIApplication *)application +{ + // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later. + // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits. + NSLog(@"In the background"); +} + +- (void)applicationWillEnterForeground:(UIApplication *)application +{ + // Called as part of the transition from the background to the inactive state; here you can undo many of the changes made on entering the background. + NSLog(@"In the foreground"); +} + +-(void)application:(UIApplication *)application performFetchWithCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler { + // We will add content here soon. + NSLog(@"In the completionHandler"); +} + +- (BOOL)application:(UIApplication *)app + openURL:(NSURL *)url + options:(NSDictionary *)options { + if (url.fileURL) { + QString filePath(url.path.UTF8String); + if (filePath.isEmpty()) return NO; + + dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 1 * NSEC_PER_SEC), dispatch_get_main_queue(), ^{ + NSLog(@"Application openURL: %@", url); + + if (filePath.contains("backup")) { + IosController::Instance()->importBackupFromOutside(filePath); + } else { + QFile file(filePath); + bool isOpenFile = file.open(QIODevice::ReadOnly); + QByteArray data = file.readAll(); + + IosController::Instance()->importConfigFromOutside(QString(data)); + } + }); + + return YES; + } + return NO; +}*/ + +@end diff --git a/client/platforms/macos_ne/ScreenProtection.swift b/client/platforms/macos_ne/ScreenProtection.swift new file mode 100644 index 00000000..1e85479b --- /dev/null +++ b/client/platforms/macos_ne/ScreenProtection.swift @@ -0,0 +1,10 @@ +//import UIKit + +public func toggleScreenshots(_ isEnabled: Bool) { + +} + +class ScreenProtection { + + +} diff --git a/client/platforms/macos_ne/VPNCController.swift b/client/platforms/macos_ne/VPNCController.swift new file mode 100644 index 00000000..3ad0cbbf --- /dev/null +++ b/client/platforms/macos_ne/VPNCController.swift @@ -0,0 +1,50 @@ +import Foundation +import NetworkExtension + +public func removeVPNC(_ vpncName: std.string) { + let vpncName = String(describing: vpncName) + + Task { + await getManagers()?.first { manager in + if let name = manager.localizedDescription, name == vpncName { + Task { + await remove(manager) + } + + return true + } else { + return false + } + } + } +} + +public func clearSettings() { + Task { + await getManagers()?.forEach { manager in + Task { + await remove(manager) + } + } + } +} + +func getManagers() async -> [NETunnelProviderManager]? { + do { + return try await NETunnelProviderManager.loadAllFromPreferences() + } catch { + log(.error, title: "VPNC: ", message: "loadAllFromPreferences error: \(error.localizedDescription)") + return nil + } +} + +func remove(_ manager: NETunnelProviderManager) async { + let vpncName = manager.localizedDescription ?? "Unknown" + do { + try await manager.removeFromPreferences() + try await manager.loadFromPreferences() + log(.info, title: "VPNC: ", message: "Remove \(vpncName)") + } catch { + log(.error, title: "VPNC: ", message: "Failed to remove \(vpncName) (\(error.localizedDescription))") + } +} diff --git a/client/platforms/macos_ne/WGConfig.swift b/client/platforms/macos_ne/WGConfig.swift new file mode 100644 index 00000000..e3b67efe --- /dev/null +++ b/client/platforms/macos_ne/WGConfig.swift @@ -0,0 +1,94 @@ +import Foundation + +struct WGConfig: Decodable { + let initPacketMagicHeader, responsePacketMagicHeader: String? + let underloadPacketMagicHeader, transportPacketMagicHeader: String? + let junkPacketCount, junkPacketMinSize, junkPacketMaxSize: String? + let initPacketJunkSize, responsePacketJunkSize: String? + let dns1: String + let dns2: String + let mtu: String + let hostName: String + let port: Int + let clientIP: String + let clientPrivateKey: String + let serverPublicKey: String + let presharedKey: String? + var allowedIPs: [String] + var persistentKeepAlive: String + let splitTunnelType: Int + let splitTunnelSites: [String] + + enum CodingKeys: String, CodingKey { + case initPacketMagicHeader = "H1", responsePacketMagicHeader = "H2" + case underloadPacketMagicHeader = "H3", transportPacketMagicHeader = "H4" + case junkPacketCount = "Jc", junkPacketMinSize = "Jmin", junkPacketMaxSize = "Jmax" + case initPacketJunkSize = "S1", responsePacketJunkSize = "S2" + case dns1 + case dns2 + case mtu + case hostName + case port + case clientIP = "client_ip" + case clientPrivateKey = "client_priv_key" + case serverPublicKey = "server_pub_key" + case presharedKey = "psk_key" + case allowedIPs = "allowed_ips" + case persistentKeepAlive = "persistent_keep_alive" + case splitTunnelType + case splitTunnelSites + } + + var settings: String { + junkPacketCount == nil ? "" : + """ + Jc = \(junkPacketCount!) + Jmin = \(junkPacketMinSize!) + Jmax = \(junkPacketMaxSize!) + S1 = \(initPacketJunkSize!) + S2 = \(responsePacketJunkSize!) + H1 = \(initPacketMagicHeader!) + H2 = \(responsePacketMagicHeader!) + H3 = \(underloadPacketMagicHeader!) + H4 = \(transportPacketMagicHeader!) + + """ + } + + var str: String { + """ + [Interface] + Address = \(clientIP) + DNS = \(dns1), \(dns2) + MTU = \(mtu) + PrivateKey = \(clientPrivateKey) + \(settings) + [Peer] + PublicKey = \(serverPublicKey) + \(presharedKey == nil ? "" : "PresharedKey = \(presharedKey!)") + AllowedIPs = \(allowedIPs.joined(separator: ", ")) + Endpoint = \(hostName):\(port) + PersistentKeepalive = \(persistentKeepAlive) + """ + } + + var redux: String { + """ + [Interface] + Address = \(clientIP) + DNS = \(dns1), \(dns2) + MTU = \(mtu) + PrivateKey = *** + \(settings) + [Peer] + PublicKey = *** + PresharedKey = *** + AllowedIPs = \(allowedIPs.joined(separator: ", ")) + Endpoint = \(hostName):\(port) + PersistentKeepalive = \(persistentKeepAlive) + + SplitTunnelType = \(splitTunnelType) + SplitTunnelSites = \(splitTunnelSites.joined(separator: ", ")) + """ + } +} diff --git a/client/platforms/macos_ne/WireGuard-Bridging-Header.h b/client/platforms/macos_ne/WireGuard-Bridging-Header.h new file mode 100644 index 00000000..0183367b --- /dev/null +++ b/client/platforms/macos_ne/WireGuard-Bridging-Header.h @@ -0,0 +1,28 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +#include "3rd/amneziawg-apple/Sources/WireGuardKitC/WireGuardKitC.h" + +#include +#include + +#define WG_KEY_LEN (32) +#define WG_KEY_LEN_BASE64 (45) +#define WG_KEY_LEN_HEX (65) + +void key_to_base64(char base64[WG_KEY_LEN_BASE64], + const uint8_t key[WG_KEY_LEN]); +bool key_from_base64(uint8_t key[WG_KEY_LEN], const char* base64); + +void key_to_hex(char hex[WG_KEY_LEN_HEX], const uint8_t key[WG_KEY_LEN]); +bool key_from_hex(uint8_t key[WG_KEY_LEN], const char* hex); + +bool key_eq(const uint8_t key1[WG_KEY_LEN], const uint8_t key2[WG_KEY_LEN]); + +void write_msg_to_log(const char* tag, const char* msg); + +#import "TargetConditionals.h" +#if TARGET_OS_OSX +# include +#endif diff --git a/client/platforms/macos_ne/ios_controller.h b/client/platforms/macos_ne/ios_controller.h new file mode 100644 index 00000000..8e13eaa9 --- /dev/null +++ b/client/platforms/macos_ne/ios_controller.h @@ -0,0 +1,99 @@ +#ifndef IOS_CONTROLLER_H +#define IOS_CONTROLLER_H + +#include "protocols/vpnprotocol.h" + +#ifdef __OBJC__ + #import +@class NETunnelProviderManager; +#endif + +using namespace amnezia; + +struct Action +{ + static const char *start; + static const char *restart; + static const char *stop; + static const char *getTunnelId; + static const char *getStatus; +}; + +struct MessageKey +{ + static const char *action; + static const char *tunnelId; + static const char *config; + static const char *errorCode; + static const char *host; + static const char *port; + static const char *isOnDemand; + static const char *SplitTunnelType; + static const char *SplitTunnelSites; +}; + +class IosController : public QObject +{ + Q_OBJECT + +public: + static IosController *Instance(); + + virtual ~IosController() override = default; + + bool initialize(); + bool connectVpn(amnezia::Proto proto, const QJsonObject &configuration); + void disconnectVpn(); + + void vpnStatusDidChange(void *pNotification); + void vpnConfigurationDidChange(void *pNotification); + + void getBackendLogs(std::function &&callback); + void checkStatus(); + + bool shareText(const QStringList &filesToSend); + QString openFile(); + + void requestInetAccess(); +signals: + void connectionStateChanged(Vpn::ConnectionState state); + void bytesChanged(quint64 receivedBytes, quint64 sentBytes); + void importConfigFromOutside(const QString); + void importBackupFromOutside(const QString); + + void finished(); + +protected slots: + +private: + explicit IosController(); + + bool setupOpenVPN(); + bool setupCloak(); + bool setupWireGuard(); + bool setupAwg(); + bool setupXray(); + + bool startOpenVPN(const QString &config); + bool startWireGuard(const QString &jsonConfig); + bool startXray(const QString &jsonConfig); + + void startTunnel(); + +private: + void *m_iosControllerWrapper {}; +#ifdef __OBJC__ + NETunnelProviderManager *m_currentTunnel {}; + NSString *m_serverAddress {}; + bool isOurManager(NETunnelProviderManager *manager); + void sendVpnExtensionMessage(NSDictionary *message, std::function callback = nullptr); +#endif + + amnezia::Proto m_proto; + QJsonObject m_rawConfig; + QString m_tunnelId; + uint64_t m_txBytes; + uint64_t m_rxBytes; +}; + +#endif // IOS_CONTROLLER_H diff --git a/client/platforms/macos_ne/ios_controller.mm b/client/platforms/macos_ne/ios_controller.mm new file mode 100644 index 00000000..7308b178 --- /dev/null +++ b/client/platforms/macos_ne/ios_controller.mm @@ -0,0 +1,851 @@ +#include "ios_controller.h" + +#include +#include +#include +#include +#include +#include +#include + +#include "../protocols/vpnprotocol.h" +#import "ios_controller_wrapper.h" + +#include + +const char* Action::start = "start"; +const char* Action::restart = "restart"; +const char* Action::stop = "stop"; +const char* Action::getTunnelId = "getTunnelId"; +const char* Action::getStatus = "status"; + +const char* MessageKey::action = "action"; +const char* MessageKey::tunnelId = "tunnelId"; +const char* MessageKey::config = "config"; +const char* MessageKey::errorCode = "errorCode"; +const char* MessageKey::host = "host"; +const char* MessageKey::port = "port"; +const char* MessageKey::isOnDemand = "is-on-demand"; +const char* MessageKey::SplitTunnelType = "SplitTunnelType"; +const char* MessageKey::SplitTunnelSites = "SplitTunnelSites"; + +//static UIViewController* getViewController() { +// NSArray *windows = [[UIApplication sharedApplication]windows]; +// for (UIWindow *window in windows) { +// if (window.isKeyWindow) { +// return window.rootViewController; +// } +// } +// return nil; +//} + +OSStatus requestAuthorization() { + AuthorizationRef authRef; + OSStatus status = AuthorizationCreate(NULL, kAuthorizationEmptyEnvironment, kAuthorizationFlagDefaults, &authRef); + if (status != errAuthorizationSuccess) { + qDebug() << "Authorization failed with status:" << status; + return status; + } + + AuthorizationItem authItem = {kAuthorizationRightExecute, 0, NULL, 0}; + AuthorizationRights authRights = {1, &authItem}; + AuthorizationFlags flags = kAuthorizationFlagDefaults | kAuthorizationFlagInteractionAllowed | kAuthorizationFlagExtendRights; + + status = AuthorizationCopyRights(authRef, &authRights, NULL, flags, NULL); + if (status != errAuthorizationSuccess) { + qDebug() << "Authorization rights copy failed with status:" << status; + } + + return status; +} + +Vpn::ConnectionState iosStatusToState(NEVPNStatus status) { + switch (status) { + case NEVPNStatusInvalid: + return Vpn::ConnectionState::Unknown; + case NEVPNStatusDisconnected: + return Vpn::ConnectionState::Disconnected; + case NEVPNStatusConnecting: + return Vpn::ConnectionState::Connecting; + case NEVPNStatusConnected: + return Vpn::ConnectionState::Connected; + case NEVPNStatusReasserting: + return Vpn::ConnectionState::Connecting; + case NEVPNStatusDisconnecting: + return Vpn::ConnectionState::Disconnecting; + default: + return Vpn::ConnectionState::Unknown; +} +} + +namespace { +IosController* s_instance = nullptr; +} + +IosController::IosController() : QObject() +{ + s_instance = this; + m_iosControllerWrapper = [[IosControllerWrapper alloc] initWithCppController:this]; + + [[NSNotificationCenter defaultCenter] + removeObserver: (__bridge NSObject *)m_iosControllerWrapper]; + [[NSNotificationCenter defaultCenter] + addObserver: (__bridge NSObject *)m_iosControllerWrapper selector:@selector(vpnStatusDidChange:) name:NEVPNStatusDidChangeNotification object:nil]; + [[NSNotificationCenter defaultCenter] + addObserver: (__bridge NSObject *)m_iosControllerWrapper selector:@selector(vpnConfigurationDidChange:) name:NEVPNConfigurationChangeNotification object:nil]; + +} + +IosController* IosController::Instance() { + if (!s_instance) { + s_instance = new IosController(); + } + + return s_instance; +} + +bool IosController::initialize() +{ + if (requestAuthorization() != errAuthorizationSuccess) { + emit connectionStateChanged(Vpn::ConnectionState::Error); + return false; + } + + __block bool ok = true; + [NETunnelProviderManager loadAllFromPreferencesWithCompletionHandler:^(NSArray * _Nullable managers, NSError * _Nullable error) { + @try { + if (error) { + qDebug() << "IosController::initialize : Error:" << [error.localizedDescription UTF8String]; + emit connectionStateChanged(Vpn::ConnectionState::Error); + ok = false; + return; + } + + NSInteger managerCount = managers.count; + qDebug() << "IosController::initialize : We have received managers:" << (long)managerCount; + + + for (NETunnelProviderManager *manager in managers) { + qDebug() << "IosController::initialize : VPNC: " << manager.localizedDescription; + + if (manager.connection.status == NEVPNStatusConnected) { + m_currentTunnel = manager; + qDebug() << "IosController::initialize : VPN already connected with" << manager.localizedDescription; + emit connectionStateChanged(Vpn::ConnectionState::Connected); + break; + + // TODO: show connected state + } + } + } + @catch (NSException *exception) { + qDebug() << "IosController::setTunnel : exception" << QString::fromNSString(exception.reason); + ok = false; + } + }]; + + return ok; +} + +bool IosController::connectVpn(amnezia::Proto proto, const QJsonObject& configuration) +{ + m_proto = proto; + m_rawConfig = configuration; + m_serverAddress = configuration.value(config_key::hostName).toString().toNSString(); + + QString tunnelName; + if (configuration.value(config_key::description).toString().isEmpty()) { + tunnelName = QString("%1 %2") + .arg(configuration.value(config_key::hostName).toString()) + .arg(ProtocolProps::protoToString(proto)); + } + else { + tunnelName = QString("%1 (%2) %3") + .arg(configuration.value(config_key::description).toString()) + .arg(configuration.value(config_key::hostName).toString()) + .arg(ProtocolProps::protoToString(proto)); + } + + qDebug() << "IosController::connectVpn" << tunnelName; + + m_currentTunnel = nullptr; + + dispatch_semaphore_t semaphore = dispatch_semaphore_create(0); + __block bool ok = true; + __block bool isNewTunnelCreated = false; + + [NETunnelProviderManager loadAllFromPreferencesWithCompletionHandler:^(NSArray * _Nullable managers, NSError * _Nullable error) { + @try { + if (error) { + qDebug() << "IosController::connectVpn : VPNC: loadAllFromPreferences error:" << [error.localizedDescription UTF8String]; + emit connectionStateChanged(Vpn::ConnectionState::Error); + ok = false; + return; + } + + NSInteger managerCount = managers.count; + qDebug() << "IosController::connectVpn : We have received managers:" << (long)managerCount; + + + for (NETunnelProviderManager *manager in managers) { + if ([manager.localizedDescription isEqualToString:tunnelName.toNSString()]) { + m_currentTunnel = manager; + qDebug() << "IosController::connectVpn : Using existing tunnel:" << manager.localizedDescription; + if (manager.connection.status == NEVPNStatusConnected) { + emit connectionStateChanged(Vpn::ConnectionState::Connected); + return; + } + + break; + } + } + + if (!m_currentTunnel) { + isNewTunnelCreated = true; + m_currentTunnel = [[NETunnelProviderManager alloc] init]; + m_currentTunnel.localizedDescription = [NSString stringWithUTF8String:tunnelName.toStdString().c_str()]; + qDebug() << "IosController::connectVpn : Creating new tunnel" << m_currentTunnel.localizedDescription; + } + + } + @catch (NSException *exception) { + qDebug() << "IosController::connectVpn : exception" << QString::fromNSString(exception.reason); + ok = false; + m_currentTunnel = nullptr; + } + @finally { + dispatch_semaphore_signal(semaphore); + } + }]; + + dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER); + if (!ok) return false; + + [[NSNotificationCenter defaultCenter] + removeObserver:(__bridge NSObject *)m_iosControllerWrapper]; + + [[NSNotificationCenter defaultCenter] + addObserver:(__bridge NSObject *)m_iosControllerWrapper + selector:@selector(vpnStatusDidChange:) + name:NEVPNStatusDidChangeNotification + object:m_currentTunnel.connection]; + + + if (proto == amnezia::Proto::OpenVpn) { + return setupOpenVPN(); + } + if (proto == amnezia::Proto::Cloak) { + return setupCloak(); + } + if (proto == amnezia::Proto::WireGuard) { + return setupWireGuard(); + } + if (proto == amnezia::Proto::Awg) { + return setupAwg(); + } + if (proto == amnezia::Proto::Xray) { + return setupXray(); + } + + return false; +} + +void IosController::disconnectVpn() +{ + if (!m_currentTunnel) { + return; + } + + if ([m_currentTunnel.connection isKindOfClass:[NETunnelProviderSession class]]) { + [(NETunnelProviderSession *)m_currentTunnel.connection stopTunnel]; + } +} + + +void IosController::checkStatus() +{ + NSString *actionKey = [NSString stringWithUTF8String:MessageKey::action]; + NSString *actionValue = [NSString stringWithUTF8String:Action::getStatus]; + NSString *tunnelIdKey = [NSString stringWithUTF8String:MessageKey::tunnelId]; + NSString *tunnelIdValue = !m_tunnelId.isEmpty() ? m_tunnelId.toNSString() : @""; + + NSDictionary* message = @{actionKey: actionValue, tunnelIdKey: tunnelIdValue}; + sendVpnExtensionMessage(message, [&](NSDictionary* response){ + uint64_t txBytes = [response[@"tx_bytes"] intValue]; + uint64_t rxBytes = [response[@"rx_bytes"] intValue]; + emit bytesChanged(rxBytes - m_rxBytes, txBytes - m_txBytes); + m_rxBytes = rxBytes; + m_txBytes = txBytes; + }); +} + +void IosController::vpnStatusDidChange(void *pNotification) +{ + NETunnelProviderSession *session = (NETunnelProviderSession *)pNotification; + + if (session /* && session == TunnelManager.session */ ) { + qDebug() << "IosController::vpnStatusDidChange" << iosStatusToState(session.status) << session; + + if (session.status == NEVPNStatusDisconnected) { + if (@available(iOS 16.0, *)) { + [session fetchLastDisconnectErrorWithCompletionHandler:^(NSError * _Nullable error) { + if (error != nil) { + qDebug() << "Disconnect error" << error.domain << error.code << error.localizedDescription; + + if ([error.domain isEqualToString:NEVPNConnectionErrorDomain]) { + switch (error.code) { + case NEVPNConnectionErrorOverslept: + qDebug() << "Disconnect error info" << "The VPN connection was terminated because the system slept for an extended period of time."; + break; + case NEVPNConnectionErrorNoNetworkAvailable: + qDebug() << "Disconnect error info" << "The VPN connection could not be established because the system is not connected to a network."; + break; + case NEVPNConnectionErrorUnrecoverableNetworkChange: + qDebug() << "Disconnect error info" << "The VPN connection was terminated because the network conditions changed in such a way that the VPN connection could not be maintained."; + break; + case NEVPNConnectionErrorConfigurationFailed: + qDebug() << "Disconnect error info" << "The VPN connection could not be established because the configuration is invalid. "; + break; + case NEVPNConnectionErrorServerAddressResolutionFailed: + qDebug() << "Disconnect error info" << "The address of the VPN server could not be determined."; + break; + case NEVPNConnectionErrorServerNotResponding: + qDebug() << "Disconnect error info" << "Network communication with the VPN server has failed."; + break; + case NEVPNConnectionErrorServerDead: + qDebug() << "Disconnect error info" << "The VPN server is no longer functioning."; + break; + case NEVPNConnectionErrorAuthenticationFailed: + qDebug() << "Disconnect error info" << "The user credentials were rejected by the VPN server."; + break; + case NEVPNConnectionErrorClientCertificateInvalid: + qDebug() << "Disconnect error info" << "The client certificate is invalid."; + break; + case NEVPNConnectionErrorClientCertificateNotYetValid: + qDebug() << "Disconnect error info" << "The client certificate will not be valid until some future point in time."; + break; + case NEVPNConnectionErrorClientCertificateExpired: + qDebug() << "Disconnect error info" << "The validity period of the client certificate has passed."; + break; + case NEVPNConnectionErrorPluginFailed: + qDebug() << "Disconnect error info" << "The VPN plugin died unexpectedly."; + break; + case NEVPNConnectionErrorConfigurationNotFound: + qDebug() << "Disconnect error info" << "The VPN configuration could not be found."; + break; + case NEVPNConnectionErrorPluginDisabled: + qDebug() << "Disconnect error info" << "The VPN plugin could not be found or needed to be updated."; + break; + case NEVPNConnectionErrorNegotiationFailed: + qDebug() << "Disconnect error info" << "The VPN protocol negotiation failed."; + break; + case NEVPNConnectionErrorServerDisconnected: + qDebug() << "Disconnect error info" << "The VPN server terminated the connection."; + break; + case NEVPNConnectionErrorServerCertificateInvalid: + qDebug() << "Disconnect error info" << "The server certificate is invalid."; + break; + case NEVPNConnectionErrorServerCertificateNotYetValid: + qDebug() << "Disconnect error info" << "The server certificate will not be valid until some future point in time."; + break; + case NEVPNConnectionErrorServerCertificateExpired: + qDebug() << "Disconnect error info" << "The validity period of the server certificate has passed."; + break; + default: + qDebug() << "Disconnect error info" << "Unknown code."; + break; + } + } + + NSError *underlyingError = error.userInfo[@"NSUnderlyingError"]; + if (underlyingError != nil) { + qDebug() << "Disconnect underlying error" << underlyingError.domain << underlyingError.code << underlyingError.localizedDescription; + + if ([underlyingError.domain isEqualToString:@"NEAgentErrorDomain"]) { + switch (underlyingError.code) { + case 1: + qDebug() << "Disconnect underlying error" << "General. Use sysdiagnose."; + break; + case 2: + qDebug() << "Disconnect underlying error" << "Plug-in unavailable. Use sysdiagnose."; + break; + default: + qDebug() << "Disconnect underlying error" << "Unknown code. Use sysdiagnose."; + break; + } + } + } + } else { + qDebug() << "Disconnect error is absent"; + } + }]; + } else { + qDebug() << "Disconnect error is unavailable on iOS < 16.0"; + } + } + + emit connectionStateChanged(iosStatusToState(session.status)); + } +} + +void IosController::vpnConfigurationDidChange(void *pNotification) +{ + qDebug() << "IosController::vpnConfigurationDidChange" << pNotification; +} + +bool IosController::setupOpenVPN() +{ + QJsonObject ovpn = m_rawConfig[ProtocolProps::key_proto_config_data(amnezia::Proto::OpenVpn)].toObject(); + QString ovpnConfig = ovpn[config_key::config].toString(); + + QJsonObject openVPNConfig {}; + openVPNConfig.insert(config_key::config, ovpnConfig); + + if (ovpn.contains(config_key::mtu)) { + openVPNConfig.insert(config_key::mtu, ovpn[config_key::mtu]); + } else { + openVPNConfig.insert(config_key::mtu, protocols::openvpn::defaultMtu); + } + + openVPNConfig.insert(config_key::splitTunnelType, m_rawConfig[config_key::splitTunnelType]); + + QJsonArray splitTunnelSites = m_rawConfig[config_key::splitTunnelSites].toArray(); + + for(int index = 0; index < splitTunnelSites.count(); index++) { + splitTunnelSites[index] = splitTunnelSites[index].toString().remove(" "); + } + + openVPNConfig.insert(config_key::splitTunnelSites, splitTunnelSites); + + QJsonDocument openVPNConfigDoc(openVPNConfig); + QString openVPNConfigStr(openVPNConfigDoc.toJson(QJsonDocument::Compact)); + + return startOpenVPN(openVPNConfigStr); +} + +bool IosController::setupCloak() +{ + m_serverAddress = @"127.0.0.1"; + QJsonObject ovpn = m_rawConfig[ProtocolProps::key_proto_config_data(amnezia::Proto::OpenVpn)].toObject(); + QString ovpnConfig = ovpn[config_key::config].toString(); + + QJsonObject cloak = m_rawConfig[ProtocolProps::key_proto_config_data(amnezia::Proto::Cloak)].toObject(); + + cloak["NumConn"] = 1; + if (cloak.contains("remote")) { + cloak["RemoteHost"] = cloak["remote"].toString(); + } + if (cloak.contains("port")) { + cloak["RemotePort"] = cloak["port"].toString(); + } + cloak.remove("remote"); + cloak.remove("port"); + cloak.remove("transport_proto"); + + QJsonObject jsonObject {}; + foreach(const QString& key, cloak.keys()) { + if(key == "NumConn" or key == "StreamTimeout"){ + jsonObject.insert(key, cloak.value(key).toInt()); + }else{ + jsonObject.insert(key, cloak.value(key).toString()); + } + } + QJsonDocument doc(jsonObject); + QString strJson(doc.toJson(QJsonDocument::Compact)); + QString cloakBase64 = strJson.toUtf8().toBase64(); + ovpnConfig.append("\n\n"); + ovpnConfig.append(cloakBase64); + ovpnConfig.append("\n\n"); + + QJsonObject openVPNConfig {}; + openVPNConfig.insert(config_key::config, ovpnConfig); + + if (ovpn.contains(config_key::mtu)) { + openVPNConfig.insert(config_key::mtu, ovpn[config_key::mtu]); + } else { + openVPNConfig.insert(config_key::mtu, protocols::openvpn::defaultMtu); + } + + openVPNConfig.insert(config_key::splitTunnelType, m_rawConfig[config_key::splitTunnelType]); + + QJsonArray splitTunnelSites = m_rawConfig[config_key::splitTunnelSites].toArray(); + + for(int index = 0; index < splitTunnelSites.count(); index++) { + splitTunnelSites[index] = splitTunnelSites[index].toString().remove(" "); + } + + openVPNConfig.insert(config_key::splitTunnelSites, splitTunnelSites); + + QJsonDocument openVPNConfigDoc(openVPNConfig); + QString openVPNConfigStr(openVPNConfigDoc.toJson(QJsonDocument::Compact)); + + return startOpenVPN(openVPNConfigStr); +} + +bool IosController::setupWireGuard() +{ + QJsonObject config = m_rawConfig[ProtocolProps::key_proto_config_data(amnezia::Proto::WireGuard)].toObject(); + + QJsonObject wgConfig {}; + wgConfig.insert(config_key::dns1, m_rawConfig[config_key::dns1]); + wgConfig.insert(config_key::dns2, m_rawConfig[config_key::dns2]); + + if (config.contains(config_key::mtu)) { + wgConfig.insert(config_key::mtu, config[config_key::mtu]); + } else { + wgConfig.insert(config_key::mtu, protocols::wireguard::defaultMtu); + } + + wgConfig.insert(config_key::hostName, config[config_key::hostName]); + wgConfig.insert(config_key::port, config[config_key::port]); + wgConfig.insert(config_key::client_ip, config[config_key::client_ip]); + wgConfig.insert(config_key::client_priv_key, config[config_key::client_priv_key]); + wgConfig.insert(config_key::server_pub_key, config[config_key::server_pub_key]); + wgConfig.insert(config_key::psk_key, config[config_key::psk_key]); + wgConfig.insert(config_key::splitTunnelType, m_rawConfig[config_key::splitTunnelType]); + + QJsonArray splitTunnelSites = m_rawConfig[config_key::splitTunnelSites].toArray(); + + for(int index = 0; index < splitTunnelSites.count(); index++) { + splitTunnelSites[index] = splitTunnelSites[index].toString().remove(" "); + } + + wgConfig.insert(config_key::splitTunnelSites, splitTunnelSites); + + if (config.contains(config_key::allowed_ips) && config[config_key::allowed_ips].isArray()) { + wgConfig.insert(config_key::allowed_ips, config[config_key::allowed_ips]); + } else { + QJsonArray allowed_ips { "0.0.0.0/0", "::/0" }; + wgConfig.insert(config_key::allowed_ips, allowed_ips); + } + + if (config.contains(config_key::persistent_keep_alive)) { + wgConfig.insert(config_key::persistent_keep_alive, config[config_key::persistent_keep_alive]); + } else { + wgConfig.insert(config_key::persistent_keep_alive, "25"); + } + + QJsonDocument wgConfigDoc(wgConfig); + QString wgConfigDocStr(wgConfigDoc.toJson(QJsonDocument::Compact)); + + return startWireGuard(wgConfigDocStr); +} + +bool IosController::setupXray() +{ + QJsonObject config = m_rawConfig[ProtocolProps::key_proto_config_data(amnezia::Proto::Xray)].toObject(); + QJsonDocument xrayConfigDoc(config); + QString xrayConfigStr(xrayConfigDoc.toJson(QJsonDocument::Compact)); + + return startXray(xrayConfigStr); +} + +bool IosController::setupAwg() +{ + QJsonObject config = m_rawConfig[ProtocolProps::key_proto_config_data(amnezia::Proto::Awg)].toObject(); + + QJsonObject wgConfig {}; + wgConfig.insert(config_key::dns1, m_rawConfig[config_key::dns1]); + wgConfig.insert(config_key::dns2, m_rawConfig[config_key::dns2]); + + if (config.contains(config_key::mtu)) { + wgConfig.insert(config_key::mtu, config[config_key::mtu]); + } else { + wgConfig.insert(config_key::mtu, protocols::awg::defaultMtu); + } + + wgConfig.insert(config_key::hostName, config[config_key::hostName]); + wgConfig.insert(config_key::port, config[config_key::port]); + wgConfig.insert(config_key::client_ip, config[config_key::client_ip]); + wgConfig.insert(config_key::client_priv_key, config[config_key::client_priv_key]); + wgConfig.insert(config_key::server_pub_key, config[config_key::server_pub_key]); + wgConfig.insert(config_key::psk_key, config[config_key::psk_key]); + wgConfig.insert(config_key::splitTunnelType, m_rawConfig[config_key::splitTunnelType]); + + QJsonArray splitTunnelSites = m_rawConfig[config_key::splitTunnelSites].toArray(); + + for(int index = 0; index < splitTunnelSites.count(); index++) { + splitTunnelSites[index] = splitTunnelSites[index].toString().remove(" "); + } + + wgConfig.insert(config_key::splitTunnelSites, splitTunnelSites); + + if (config.contains(config_key::allowed_ips) && config[config_key::allowed_ips].isArray()) { + wgConfig.insert(config_key::allowed_ips, config[config_key::allowed_ips]); + } else { + QJsonArray allowed_ips { "0.0.0.0/0", "::/0" }; + wgConfig.insert(config_key::allowed_ips, allowed_ips); + } + + if (config.contains(config_key::persistent_keep_alive)) { + wgConfig.insert(config_key::persistent_keep_alive, config[config_key::persistent_keep_alive]); + } else { + wgConfig.insert(config_key::persistent_keep_alive, "25"); + } + + wgConfig.insert(config_key::initPacketMagicHeader, config[config_key::initPacketMagicHeader]); + wgConfig.insert(config_key::responsePacketMagicHeader, config[config_key::responsePacketMagicHeader]); + wgConfig.insert(config_key::underloadPacketMagicHeader, config[config_key::underloadPacketMagicHeader]); + wgConfig.insert(config_key::transportPacketMagicHeader, config[config_key::transportPacketMagicHeader]); + + wgConfig.insert(config_key::initPacketJunkSize, config[config_key::initPacketJunkSize]); + wgConfig.insert(config_key::responsePacketJunkSize, config[config_key::responsePacketJunkSize]); + + wgConfig.insert(config_key::junkPacketCount, config[config_key::junkPacketCount]); + wgConfig.insert(config_key::junkPacketMinSize, config[config_key::junkPacketMinSize]); + wgConfig.insert(config_key::junkPacketMaxSize, config[config_key::junkPacketMaxSize]); + + QJsonDocument wgConfigDoc(wgConfig); + QString wgConfigDocStr(wgConfigDoc.toJson(QJsonDocument::Compact)); + + return startWireGuard(wgConfigDocStr); +} + +bool IosController::startOpenVPN(const QString &config) +{ + qDebug() << "IosController::startOpenVPN"; + + NETunnelProviderProtocol *tunnelProtocol = [[NETunnelProviderProtocol alloc] init]; + tunnelProtocol.providerBundleIdentifier = [NSString stringWithUTF8String:VPN_NE_BUNDLEID]; + tunnelProtocol.providerConfiguration = @{@"ovpn": [[NSString stringWithUTF8String:config.toStdString().c_str()] dataUsingEncoding:NSUTF8StringEncoding]}; + tunnelProtocol.serverAddress = m_serverAddress; + + m_currentTunnel.protocolConfiguration = tunnelProtocol; + + startTunnel(); +} + +bool IosController::startWireGuard(const QString &config) +{ + qDebug() << "IosController::startWireGuard"; + + NETunnelProviderProtocol *tunnelProtocol = [[NETunnelProviderProtocol alloc] init]; + tunnelProtocol.providerBundleIdentifier = [NSString stringWithUTF8String:VPN_NE_BUNDLEID]; + tunnelProtocol.providerConfiguration = @{@"wireguard": [[NSString stringWithUTF8String:config.toStdString().c_str()] dataUsingEncoding:NSUTF8StringEncoding]}; + tunnelProtocol.serverAddress = m_serverAddress; + + m_currentTunnel.protocolConfiguration = tunnelProtocol; + + startTunnel(); +} + +bool IosController::startXray(const QString &config) +{ + qDebug() << "IosController::startXray"; + + NETunnelProviderProtocol *tunnelProtocol = [[NETunnelProviderProtocol alloc] init]; + tunnelProtocol.providerBundleIdentifier = [NSString stringWithUTF8String:VPN_NE_BUNDLEID]; + tunnelProtocol.providerConfiguration = @{@"xray": [[NSString stringWithUTF8String:config.toStdString().c_str()] dataUsingEncoding:NSUTF8StringEncoding]}; + tunnelProtocol.serverAddress = m_serverAddress; + + m_currentTunnel.protocolConfiguration = tunnelProtocol; + + startTunnel(); +} + +void IosController::startTunnel() +{ + NSString *protocolName = @"Unknown"; + + NETunnelProviderProtocol *tunnelProtocol = (NETunnelProviderProtocol *)m_currentTunnel.protocolConfiguration; + if (tunnelProtocol.providerConfiguration[@"wireguard"] != nil) { + protocolName = @"WireGuard"; + } else if (tunnelProtocol.providerConfiguration[@"ovpn"] != nil) { + protocolName = @"OpenVPN"; + } + + m_rxBytes = 0; + m_txBytes = 0; + + [m_currentTunnel setEnabled:YES]; + + [m_currentTunnel saveToPreferencesWithCompletionHandler:^(NSError *saveError) { + dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ + + if (saveError) { + qDebug().nospace() << "IosController::startTunnel" << protocolName << ": Connect " << protocolName << " Tunnel Save Error" << saveError.localizedDescription.UTF8String; + emit connectionStateChanged(Vpn::ConnectionState::Error); + return; + } + + [m_currentTunnel loadFromPreferencesWithCompletionHandler:^(NSError *loadError) { + if (loadError) { + qDebug().nospace() << "IosController::startTunnel :" << m_currentTunnel.localizedDescription << protocolName << ": Connect " << protocolName << " Tunnel Load Error" << loadError.localizedDescription.UTF8String; + emit connectionStateChanged(Vpn::ConnectionState::Error); + return; + } + + NSError *startError = nil; + qDebug() << iosStatusToState(m_currentTunnel.connection.status); + + BOOL started = [m_currentTunnel.connection startVPNTunnelWithOptions:nil andReturnError:&startError]; + + if (!started || startError) { + qDebug().nospace() << "IosController::startTunnel :" << m_currentTunnel.localizedDescription << protocolName << " : Connect " << protocolName << " Tunnel Start Error" + << (startError ? startError.localizedDescription.UTF8String : ""); + emit connectionStateChanged(Vpn::ConnectionState::Error); + } else { + qDebug().nospace() << "IosController::startTunnel :" << m_currentTunnel.localizedDescription << protocolName << " : Starting the tunnel succeeded"; + } + }]; + }); + }]; +} + +bool IosController::isOurManager(NETunnelProviderManager* manager) { + NETunnelProviderProtocol* tunnelProto = (NETunnelProviderProtocol*)manager.protocolConfiguration; + + if (!tunnelProto) { + qDebug() << "Ignoring manager because the proto is invalid"; + return false; + } + + if (!tunnelProto.providerBundleIdentifier) { + qDebug() << "Ignoring manager because the bundle identifier is null"; + return false; + } + + if (![tunnelProto.providerBundleIdentifier isEqualToString:[NSString stringWithUTF8String:VPN_NE_BUNDLEID]]) { + qDebug() << "Ignoring manager because the bundle identifier doesn't match"; + return false; + } + + qDebug() << "Found the manager with the correct bundle identifier:" << QString::fromNSString(tunnelProto.providerBundleIdentifier); + + return true; +} + +void IosController::sendVpnExtensionMessage(NSDictionary* message, std::function callback) +{ + if (!m_currentTunnel) { + qDebug() << "Cannot set an extension callback without a tunnel manager"; + return; + } + + NSError *error = nil; + NSData *data = [NSJSONSerialization dataWithJSONObject:message options:0 error:&error]; + + if (!data || error) { + qDebug() << "Failed to serialize message to VpnExtension as JSON. Error:" + << [error.localizedDescription UTF8String]; + return; + } + + void (^completionHandler)(NSData *) = ^(NSData *responseData) { + if (!responseData) { + if (callback) callback(nil); + return; + } + + NSError *deserializeError = nil; + NSDictionary *response = [NSJSONSerialization JSONObjectWithData:responseData options:0 error:&deserializeError]; + + if (response && [response isKindOfClass:[NSDictionary class]]) { + if (callback) callback(response); + return; + } else if (deserializeError) { + qDebug() << "Failed to deserialize the VpnExtension response"; + } + + if (callback) callback(nil); + }; + + NETunnelProviderSession *session = (NETunnelProviderSession *)m_currentTunnel.connection; + + NSError *sendError = nil; + + if ([session respondsToSelector:@selector(sendProviderMessage:returnError:responseHandler:)]) { + [session sendProviderMessage:data returnError:&sendError responseHandler:completionHandler]; + } else { + qDebug() << "Method sendProviderMessage:responseHandler:error: does not exist"; + } + + if (sendError) { + qDebug() << "Failed to send message to VpnExtension. Error:" + << [sendError.localizedDescription UTF8String]; + } + +} + +bool IosController::shareText(const QStringList& filesToSend) { + NSMutableArray *sharingItems = [NSMutableArray new]; + + for (int i = 0; i < filesToSend.size(); i++) { + NSURL *logFileUrl = [[NSURL alloc] initFileURLWithPath:filesToSend[i].toNSString()]; + [sharingItems addObject:logFileUrl]; + } + + // UIViewController *qtController = getViewController(); + // if (!qtController) return; + + // UIActivityViewController *activityController = [[UIActivityViewController alloc] initWithActivityItems:sharingItems applicationActivities:nil]; + + __block bool isAccepted = false; + + // [activityController setCompletionWithItemsHandler:^(NSString *activityType, BOOL completed, NSArray *returnedItems, NSError *activityError) { + // isAccepted = completed; + // emit finished(); + // }]; + +// [qtController presentViewController:activityController animated:YES completion:nil]; +// UIPopoverPresentationController *popController = activityController.popoverPresentationController; +// if (popController) { +// popController.sourceView = qtController.view; +// popController.sourceRect = CGRectMake(100, 100, 100, 100); +// } + + QEventLoop wait; + QObject::connect(this, &IosController::finished, &wait, &QEventLoop::quit); + wait.exec(); + + return isAccepted; +} + +QString IosController::openFile() { + // UIDocumentPickerViewController *documentPicker = [[UIDocumentPickerViewController alloc] initWithDocumentTypes:@[@"public.item"] inMode:UIDocumentPickerModeOpen]; + + // DocumentPickerDelegate *documentPickerDelegate = [[DocumentPickerDelegate alloc] init]; + // documentPicker.delegate = documentPickerDelegate; + + // UIViewController *qtController = getViewController(); + // if (!qtController) return; + + // [qtController presentViewController:documentPicker animated:YES completion:nil]; + + __block QString filePath; + + // documentPickerDelegate.documentPickerClosedCallback = ^(NSString *path) { + // if (path) { + // filePath = QString::fromUtf8(path.UTF8String); + // } else { + // filePath = QString(); + // } + // emit finished(); + // }; + + QEventLoop wait; + QObject::connect(this, &IosController::finished, &wait, &QEventLoop::quit); + wait.exec(); + + return filePath; +} + +void IosController::requestInetAccess() { + NSURL *url = [NSURL URLWithString:@"http://captive.apple.com/generate_204"]; + if (url) { + qDebug() << "IosController::requestInetAccess URL error"; + return; + } + + NSURLSession *session = [NSURLSession sharedSession]; + NSURLSessionDataTask *task = [session dataTaskWithURL:url completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) { + if (error) { + qDebug() << "IosController::requestInetAccess error:" << error.localizedDescription; + } else { + NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *)response; + QString responseBody = QString::fromUtf8((const char*)data.bytes, data.length); + qDebug() << "IosController::requestInetAccess server response:" << httpResponse.statusCode << "\n\n" < +#import +#import +//#include +#include + +class IosController; + +@interface IosControllerWrapper : NSObject { + IosController *cppController; +} + +- (instancetype)initWithCppController:(IosController *)controller; +- (void)vpnStatusDidChange:(NSNotification *)notification; +- (void)vpnConfigurationDidChange:(NSNotification *)notification; + +@end + +typedef void (^DocumentPickerClosedCallback)(NSString *path); + +//@interface DocumentPickerDelegate : NSObject + +//@property (nonatomic, copy) DocumentPickerClosedCallback documentPickerClosedCallback; + +//@end diff --git a/client/platforms/macos_ne/ios_controller_wrapper.mm b/client/platforms/macos_ne/ios_controller_wrapper.mm new file mode 100644 index 00000000..f5aa3e4f --- /dev/null +++ b/client/platforms/macos_ne/ios_controller_wrapper.mm @@ -0,0 +1,45 @@ +#import "ios_controller_wrapper.h" +#include "ios_controller.h" + +@implementation IosControllerWrapper + +- (instancetype)initWithCppController:(IosController *)controller { + self = [super init]; + if (self) { + cppController = controller; + } + return self; +} + +- (void)vpnStatusDidChange:(NSNotification *)notification { + + NETunnelProviderSession *session = (NETunnelProviderSession *)notification.object; + + if (session ) { + cppController->vpnStatusDidChange(session); + } +} + +- (void) vpnConfigurationDidChange:(NSNotification *)notification { +// cppController->vpnStatusDidChange(notification); +} + +@end + +//@implementation DocumentPickerDelegate + +//- (void)documentPicker:(UIDocumentPickerViewController *)controller didPickDocumentsAtURLs:(NSArray *)urls { +// for (NSURL *url in urls) { +// if (self.documentPickerClosedCallback) { +// self.documentPickerClosedCallback([url path]); +// } +// } +//} + +//- (void)documentPickerWasCancelled:(UIDocumentPickerViewController *)controller { +// if (self.documentPickerClosedCallback) { +// self.documentPickerClosedCallback(nil); +// } +//} + +//@end diff --git a/client/platforms/macos_ne/iosglue.mm b/client/platforms/macos_ne/iosglue.mm new file mode 100644 index 00000000..1f3283e8 --- /dev/null +++ b/client/platforms/macos_ne/iosglue.mm @@ -0,0 +1,244 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +// This file contains all the C functions needed by the Wireguard swift code. + +#include +#include + +#ifndef NETWORK_EXTENSION +//# include "logger.h" +#else +# import +# import +#endif + +#define MAX_LOG_FILE_SIZE 204800 + +// Key base64/hex functions +// ------------------------ + +#define WG_KEY_LEN (32) +#define WG_KEY_LEN_BASE64 (45) +#define WG_KEY_LEN_HEX (65) + +#define EXPORT __attribute__((visibility("default"))) + +extern "C" { +EXPORT void key_to_base64(char base64[WG_KEY_LEN_BASE64], const uint8_t key[WG_KEY_LEN]); +EXPORT bool key_from_base64(uint8_t key[WG_KEY_LEN], const char* base64); + +EXPORT void key_to_hex(char hex[WG_KEY_LEN_HEX], const uint8_t key[WG_KEY_LEN]); +EXPORT bool key_from_hex(uint8_t key[WG_KEY_LEN], const char* hex); + +EXPORT bool key_eq(const uint8_t key1[WG_KEY_LEN], const uint8_t key2[WG_KEY_LEN]); + +EXPORT void write_msg_to_log(const char* tag, const char* msg); +} + +EXPORT void key_to_base64(char base64[WG_KEY_LEN_BASE64], const uint8_t key[WG_KEY_LEN]) { + const char range[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; + const char padchar = '='; + int padlen = 0; + + char* out = base64; + const uint8_t* in = key; + + for (int i = 0; i < WG_KEY_LEN;) { + int chunk = 0; + chunk |= int(in[i++]) << 16; + if (i == WG_KEY_LEN) { + padlen = 2; + } else { + chunk |= int(in[i++]) << 8; + if (i == WG_KEY_LEN) { + padlen = 1; + } else { + chunk |= int(in[i++]); + } + } + + int j = (chunk & 0x00fc0000) >> 18; + int k = (chunk & 0x0003f000) >> 12; + int l = (chunk & 0x00000fc0) >> 6; + int m = (chunk & 0x0000003f); + + *out++ = range[j]; + *out++ = range[k]; + + if (padlen > 1) { + *out++ = padchar; + } else { + *out++ = range[l]; + } + if (padlen > 0) { + *out++ = padchar; + } else { + *out++ = range[m]; + } + } + + base64[WG_KEY_LEN_BASE64 - 1] = 0; +} + +EXPORT bool key_from_base64(uint8_t key[WG_KEY_LEN], const char* base64) { + if (strlen(base64) != WG_KEY_LEN_BASE64 - 1 || base64[WG_KEY_LEN_BASE64 - 2] != '=') { + return false; + } + + unsigned int buf = 0; + int nbits = 0; + uint8_t* out = key; + int offset = 0; + for (int i = 0; i < WG_KEY_LEN_BASE64; ++i) { + int ch = base64[i]; + int d; + + if (ch >= 'A' && ch <= 'Z') { + d = ch - 'A'; + } else if (ch >= 'a' && ch <= 'z') { + d = ch - 'a' + 26; + } else if (ch >= '0' && ch <= '9') { + d = ch - '0' + 52; + } else if (ch == '+') { + d = 62; + } else if (ch == '/') { + d = 63; + } else { + d = -1; + } + + if (d != -1) { + buf = (buf << 6) | d; + nbits += 6; + if (nbits >= 8) { + nbits -= 8; + out[offset++] = buf >> nbits; + buf &= (1 << nbits) - 1; + } + } + } + + return true; +} + +inline char toHex(uint8_t value) { return "0123456789abcdef"[value & 0xF]; } + +inline int fromHex(uint8_t c) { + return ((c >= '0') && (c <= '9')) + ? int(c - '0') + : ((c >= 'A') && (c <= 'F')) ? int(c - 'A' + 10) + : ((c >= 'a') && (c <= 'f')) ? int(c - 'a' + 10) : -1; +} + +EXPORT void key_to_hex(char hex[WG_KEY_LEN_HEX], const uint8_t key[WG_KEY_LEN]) { + char* hexData = hex; + const unsigned char* data = (const unsigned char*)key; + for (int i = 0, o = 0; i < WG_KEY_LEN; ++i) { + hexData[o++] = toHex(data[i] >> 4); + hexData[o++] = toHex(data[i] & 0xf); + } + + hex[WG_KEY_LEN_HEX - 1] = 0; +} + +EXPORT bool key_from_hex(uint8_t key[WG_KEY_LEN], const char* hex) { + if (strlen(hex) != WG_KEY_LEN_HEX - 1) { + return false; + } + + bool odd_digit = true; + unsigned char* result = (unsigned char*)key + WG_KEY_LEN; + for (int i = WG_KEY_LEN_HEX - 1; i >= 0; --i) { + int tmp = fromHex((unsigned char)(hex[i])); + if (tmp == -1) { + continue; + } + + if (odd_digit) { + --result; + *result = tmp; + odd_digit = false; + } else { + *result |= tmp << 4; + odd_digit = true; + } + } + + return true; +} + +EXPORT bool key_eq(const uint8_t key1[WG_KEY_LEN], const uint8_t key2[WG_KEY_LEN]) { + for (int i = 0; i < WG_KEY_LEN; i++) { + if (key1[i] != key2[i]) { + return false; + } + } + return true; +} + +// Logging functions +// ----------------- + + +EXPORT void write_msg_to_log(const char* tag, const char* msg) { +#ifndef NETWORK_EXTENSION +// logger.debug() << "Swift log - tag:" << tag << "msg: " << msg; +#else + os_log_with_type(OS_LOG_DEFAULT, OS_LOG_TYPE_DEBUG, "tag: %s - msg: %s", tag, msg); + + @autoreleasepool { + NSString* groupId = [NSString stringWithUTF8String:GROUP_ID]; + NSURL* groupPath = + [[NSFileManager defaultManager] containerURLForSecurityApplicationGroupIdentifier:groupId]; + + NSURL* pathUrl = [groupPath URLByAppendingPathComponent:@"networkextension.log"]; + NSString* path = [pathUrl path]; + + if (![[NSFileManager defaultManager] fileExistsAtPath:path]) { + [[NSFileManager defaultManager] createFileAtPath:path contents:nil attributes:nil]; + } else { + NSError* error = nil; + + NSDictionary* fileAttributes = [[NSFileManager defaultManager] attributesOfItemAtPath:path + error:&error]; + + if (error) { + return; + } + + NSNumber* fileSizeNumber = [fileAttributes objectForKey:NSFileSize]; + long long fileSize = [fileSizeNumber longLongValue]; + + if (fileSize > MAX_LOG_FILE_SIZE) { + [[NSFileManager defaultManager] removeItemAtPath:path error:&error]; + [[NSFileManager defaultManager] createFileAtPath:path contents:nil attributes:nil]; + } + } + + NSError* error = nil; + NSFileHandle* fh = [NSFileHandle fileHandleForWritingToURL:pathUrl error:&error]; + if (!fh) { + return; + } + + NSString* dateString = [NSDateFormatter localizedStringFromDate:[NSDate date] + dateStyle:NSDateFormatterShortStyle + timeStyle:NSDateFormatterFullStyle]; + + NSString* str = [NSString stringWithFormat:@" - %s\n", msg]; + NSData* data = + [[dateString stringByAppendingString:str] dataUsingEncoding:NSUTF8StringEncoding]; + + @try { + [fh seekToEndOfFile]; + [fh writeData:data]; + } @catch (NSException* exception) { + } + + [fh closeFile]; + } + +#endif +} diff --git a/client/platforms/macos_ne/iosnetworkwatcher.h b/client/platforms/macos_ne/iosnetworkwatcher.h new file mode 100644 index 00000000..70609e1f --- /dev/null +++ b/client/platforms/macos_ne/iosnetworkwatcher.h @@ -0,0 +1,31 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +#ifndef IOSNETWORKWATCHER_H +#define IOSNETWORKWATCHER_H + +#include + +#include "networkwatcherimpl.h" + +class IOSNetworkWatcher : public NetworkWatcherImpl { + public: + explicit IOSNetworkWatcher(QObject* parent); + ~IOSNetworkWatcher(); + + void initialize() override; + + private: + NetworkWatcherImpl::TransportType toTransportType(nw_path_t path); + void controllerStateChanged(); + + NetworkWatcherImpl::TransportType m_currentDefaultTransport = + NetworkWatcherImpl::TransportType_Unknown; + NetworkWatcherImpl::TransportType m_currentVPNTransport = + NetworkWatcherImpl::TransportType_Unknown; + nw_path_monitor_t m_networkMonitor = nil; + nw_connection_t m_observableConnection = nil; +}; + +#endif // IOSNETWORKWATCHER_H diff --git a/client/platforms/macos_ne/iosnetworkwatcher.mm b/client/platforms/macos_ne/iosnetworkwatcher.mm new file mode 100644 index 00000000..720b303b --- /dev/null +++ b/client/platforms/macos_ne/iosnetworkwatcher.mm @@ -0,0 +1,69 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +#include "iosnetworkwatcher.h" + +#include "leakdetector.h" +#include "logger.h" + +#import + +namespace { +Logger logger("IOSNetworkWatcher"); +dispatch_queue_t s_queue = dispatch_queue_create("VPNNetwork.queue", DISPATCH_QUEUE_SERIAL); +} + +IOSNetworkWatcher::IOSNetworkWatcher(QObject* parent) : NetworkWatcherImpl(parent) { + MZ_COUNT_CTOR(IOSNetworkWatcher); +} + +IOSNetworkWatcher::~IOSNetworkWatcher() { + MZ_COUNT_DTOR(IOSNetworkWatcher); + if (m_networkMonitor != nil) { + nw_path_monitor_cancel(m_networkMonitor); + nw_release(m_networkMonitor); + } +} + +void IOSNetworkWatcher::initialize() { + m_networkMonitor = nw_path_monitor_create(); + nw_path_monitor_set_queue(m_networkMonitor, s_queue); + nw_path_monitor_set_update_handler(m_networkMonitor, ^(nw_path_t _Nonnull path) { + m_currentDefaultTransport = toTransportType(path); + }); + nw_path_monitor_start(m_networkMonitor); + + //TODO IMPL FOR AMNEZIA +} + +NetworkWatcherImpl::TransportType IOSNetworkWatcher::toTransportType(nw_path_t path) { + if (path == nil) { + return NetworkWatcherImpl::TransportType_Unknown; + } + auto status = nw_path_get_status(path); + if (status != nw_path_status_satisfied && status != nw_path_status_satisfiable) { + // We're offline. + return NetworkWatcherImpl::TransportType_None; + } + if (nw_path_uses_interface_type(path, nw_interface_type_wifi)) { + return NetworkWatcherImpl::TransportType_WiFi; + } + if (nw_path_uses_interface_type(path, nw_interface_type_wired)) { + return NetworkWatcherImpl::TransportType_Ethernet; + } + if (nw_path_uses_interface_type(path, nw_interface_type_cellular)) { + return NetworkWatcherImpl::TransportType_Cellular; + } + if (nw_path_uses_interface_type(path, nw_interface_type_other)) { + return NetworkWatcherImpl::TransportType_Other; + } + if (nw_path_uses_interface_type(path, nw_interface_type_loopback)) { + return NetworkWatcherImpl::TransportType_Other; + } + return NetworkWatcherImpl::TransportType_Unknown; +} + +void IOSNetworkWatcher::controllerStateChanged() { + //TODO IMPL FOR AMNEZIA +} diff --git a/client/platforms/macos_ne/iosnotificationhandler.h b/client/platforms/macos_ne/iosnotificationhandler.h new file mode 100644 index 00000000..2845016a --- /dev/null +++ b/client/platforms/macos_ne/iosnotificationhandler.h @@ -0,0 +1,28 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +#ifndef IOSNOTIFICATIONHANDLER_H +#define IOSNOTIFICATIONHANDLER_H + +#include "ui/notificationhandler.h" + +#include + +class IOSNotificationHandler final : public NotificationHandler { + Q_DISABLE_COPY_MOVE(IOSNotificationHandler) + + public: + IOSNotificationHandler(QObject* parent); + ~IOSNotificationHandler(); + + protected: + void notify(Message type, const QString& title, const QString& message, + int timerMsec) override; + + private: + void* m_delegate = nullptr; +}; + + +#endif // IOSNOTIFICATIONHANDLER_H diff --git a/client/platforms/macos_ne/iosnotificationhandler.mm b/client/platforms/macos_ne/iosnotificationhandler.mm new file mode 100644 index 00000000..5759c892 --- /dev/null +++ b/client/platforms/macos_ne/iosnotificationhandler.mm @@ -0,0 +1,90 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +#include "platforms/ios/iosnotificationhandler.h" + +#import +#import +//#import + +/* +@interface IOSNotificationDelegate + : UIResponder { + IOSNotificationHandler* m_iosNotificationHandler; +} +@end + +@implementation IOSNotificationDelegate + +- (id)initWithObject:(IOSNotificationHandler*)notification { + self = [super init]; + if (self) { + m_iosNotificationHandler = notification; + } + return self; +} + +- (void)userNotificationCenter:(UNUserNotificationCenter*)center + willPresentNotification:(UNNotification*)notification + withCompletionHandler: + (void (^)(UNNotificationPresentationOptions options))completionHandler { + Q_UNUSED(center) + completionHandler(UNNotificationPresentationOptionAlert); +} + +- (void)userNotificationCenter:(UNUserNotificationCenter*)center + didReceiveNotificationResponse:(UNNotificationResponse*)response + withCompletionHandler:(void (^)())completionHandler { + Q_UNUSED(center) + Q_UNUSED(response) + completionHandler(); +} +@end + +IOSNotificationHandler::IOSNotificationHandler(QObject* parent) : NotificationHandler(parent) { + + UNUserNotificationCenter* center = [UNUserNotificationCenter currentNotificationCenter]; + [center requestAuthorizationWithOptions:(UNAuthorizationOptionSound | UNAuthorizationOptionAlert | + UNAuthorizationOptionBadge) + completionHandler:^(BOOL granted, NSError* _Nullable error) { + Q_UNUSED(granted); + if (!error) { + m_delegate = [[IOSNotificationDelegate alloc] initWithObject:this]; + } + }]; +} + +IOSNotificationHandler::~IOSNotificationHandler() { } + +void IOSNotificationHandler::notify(NotificationHandler::Message type, const QString& title, + const QString& message, int timerMsec) { + Q_UNUSED(type); + + if (!m_delegate) { + return; + } + + UNMutableNotificationContent* content = [[UNMutableNotificationContent alloc] init]; + content.title = title.toNSString(); + content.body = message.toNSString(); + content.sound = [UNNotificationSound defaultSound]; + + int timerSec = timerMsec / 1000; + UNTimeIntervalNotificationTrigger* trigger = + [UNTimeIntervalNotificationTrigger triggerWithTimeInterval:timerSec repeats:NO]; + + UNNotificationRequest* request = [UNNotificationRequest requestWithIdentifier:@"amneziavpn" + content:content + trigger:trigger]; + + UNUserNotificationCenter* center = [UNUserNotificationCenter currentNotificationCenter]; + center.delegate = id(m_delegate); + + [center addNotificationRequest:request + withCompletionHandler:^(NSError* _Nullable error) { + if (error) { + NSLog(@"Local Notification failed"); + } + }]; +}*/ From b6601d051af30cb361ae824ecd242ceda3764b79 Mon Sep 17 00:00:00 2001 From: Macbook Date: Sat, 5 Oct 2024 00:10:05 +0700 Subject: [PATCH 02/38] error UIKet --- CMakeLists.txt | 3 ++- client/CMakeLists.txt | 10 ++++++---- client/cmake/macos_ne.cmake | 2 +- client/macos/scripts/clangwrap.sh | 19 +++++++++++++++++++ client/macos/scripts/openvpn.sh | 4 +++- 5 files changed, 31 insertions(+), 7 deletions(-) create mode 100755 client/macos/scripts/clangwrap.sh diff --git a/CMakeLists.txt b/CMakeLists.txt index b09ea20d..fe408ada 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -26,7 +26,8 @@ elseif(${CMAKE_SYSTEM_NAME} STREQUAL "iOS") elseif(${CMAKE_SYSTEM_NAME} STREQUAL "Emscripten") set(MZ_PLATFORM_NAME "wasm") endif() - +message(STATUS "Platform: ${MZ_PLATFORM_NAME}") +message(STATUS "Version: ${MACOS_NE}") set(QT_BUILD_TOOLS_WHEN_CROSS_COMPILING ON) set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON) diff --git a/client/CMakeLists.txt b/client/CMakeLists.txt index 62129aff..b217c509 100644 --- a/client/CMakeLists.txt +++ b/client/CMakeLists.txt @@ -51,16 +51,16 @@ set(LIBS ${LIBS} if(IOS OR MACOS_NE) set(LIBS ${LIBS} Qt6::Multimedia) endif() - +message("Client desktop build ", ${MACOS_NE}) #Macos Network Extension doesn't need Widgets -if(WIN32 OR (APPLE AND NOT IOS) OR (LINUX AND NOT ANDROID) OR (APPLE NOT MACOS_NE)) +if(WIN32 OR (APPLE AND NOT IOS) OR (LINUX AND NOT ANDROID) OR (APPLE AND NOT MACOS_NE)) set(LIBS ${LIBS} Qt6::Widgets) endif() qt_standard_project_setup() qt_add_executable(${PROJECT} MANUAL_FINALIZATION) -if(WIN32 OR (APPLE AND NOT IOS) OR (LINUX AND NOT ANDROID) OR (APPLE NOT MACOS_NE)) +if(WIN32 OR (APPLE AND NOT IOS) OR (LINUX AND NOT ANDROID) OR (APPLE AND NOT MACOS_NE)) qt_add_repc_replicas(${PROJECT} ${CMAKE_CURRENT_LIST_DIR}/../ipc/ipc_interface.rep) qt_add_repc_replicas(${PROJECT} ${CMAKE_CURRENT_LIST_DIR}/../ipc/ipc_process_interface.rep) qt_add_repc_replicas(${PROJECT} ${CMAKE_CURRENT_LIST_DIR}/../ipc/ipc_process_tun2socks.rep) @@ -98,12 +98,14 @@ qt6_add_resources(QRC ${I18NQRC} ${CMAKE_CURRENT_BINARY_DIR}/translations.qrc) # -- i18n end if(IOS) + message("Building for iOS") execute_process(COMMAND bash ${CMAKE_CURRENT_LIST_DIR}/ios/scripts/openvpn.sh args WORKING_DIRECTORY ${CMAKE_CURRENT_LIST_DIR}) endif() # Build openvpn adapter for MacOS Network Extension if(MACOS_NE) + message("Building for MacOS Network Extension") execute_process(COMMAND bash ${CMAKE_CURRENT_LIST_DIR}/macos/scripts/openvpn.sh args WORKING_DIRECTORY ${CMAKE_CURRENT_LIST_DIR}) endif() @@ -327,7 +329,7 @@ if(LINUX AND NOT ANDROID) endif() # Macos Network Extension doesn't need -if(WIN32 OR (APPLE AND NOT IOS) OR (LINUX AND NOT ANDROID) OR (APPLE NOT MACOS_NE)) +if(WIN32 OR (APPLE AND NOT IOS) OR (LINUX AND NOT ANDROID) OR (APPLE AND NOT MACOS_NE)) message("Client desktop build") add_compile_definitions(AMNEZIA_DESKTOP) diff --git a/client/cmake/macos_ne.cmake b/client/cmake/macos_ne.cmake index 95f74093..85fe4fa6 100644 --- a/client/cmake/macos_ne.cmake +++ b/client/cmake/macos_ne.cmake @@ -1,4 +1,4 @@ -message("Client ==> iOS build") +message("Client ==> MacOS NE build") set_target_properties(${PROJECT} PROPERTIES MACOSX_BUNDLE TRUE) set(CMAKE_OSX_ARCHITECTURES "x86_64" CACHE INTERNAL "" FORCE) diff --git a/client/macos/scripts/clangwrap.sh b/client/macos/scripts/clangwrap.sh new file mode 100755 index 00000000..1d0db357 --- /dev/null +++ b/client/macos/scripts/clangwrap.sh @@ -0,0 +1,19 @@ +#!/bin/sh + +# go/clangwrap_macos.sh + +# Lấy đường dẫn SDK cho macOS +SDK_PATH=`xcrun --sdk macosx --show-sdk-path` + +# Tìm đường dẫn đến `clang` cho macOS +CLANG=`xcrun --sdk macosx --find clang` + +# Xác định kiến trúc máy dựa trên biến GOARCH +if [ "$GOARCH" == "amd64" ]; then + CARCH="x86_64" +elif [ "$GOARCH" == "arm64" ]; then + CARCH="arm64" +fi + +# Thực thi `clang` với các tùy chọn cụ thể cho macOS +exec $CLANG -arch $CARCH -isysroot $SDK_PATH -mmacosx-version-min=10.15 "$@" diff --git a/client/macos/scripts/openvpn.sh b/client/macos/scripts/openvpn.sh index ce8f6054..18c4729d 100644 --- a/client/macos/scripts/openvpn.sh +++ b/client/macos/scripts/openvpn.sh @@ -1,9 +1,11 @@ XCODEBUILD="/usr/bin/xcodebuild" WORKINGDIR=`pwd` PATCH="/usr/bin/patch" - +echo "Building OpenVPNAdapter for macOS ..." # Copy the Project.xcconfig settings to amnezia.xcconfig cat $WORKINGDIR/3rd/OpenVPNAdapter/Configuration/Project.xcconfig > $WORKINGDIR/3rd/OpenVPNAdapter/Configuration/amnezia.xcconfig +OTHER_LDFLAGS[sdk=iphoneos*] = -framework UIKit +OTHER_LDFLAGS[sdk=macosx*] = -framework Cocoa # Append macOS-specific build directory configurations to amnezia.xcconfig cat << EOF >> $WORKINGDIR/3rd/OpenVPNAdapter/Configuration/amnezia.xcconfig From f7aa82331ed26b5f74c7c6bd973193959f0df9de Mon Sep 17 00:00:00 2001 From: Macbook Date: Sat, 5 Oct 2024 11:16:57 +0700 Subject: [PATCH 03/38] final build network extension --- client/macos/scripts/openvpn.sh | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/client/macos/scripts/openvpn.sh b/client/macos/scripts/openvpn.sh index 18c4729d..1a0bba47 100644 --- a/client/macos/scripts/openvpn.sh +++ b/client/macos/scripts/openvpn.sh @@ -1,11 +1,13 @@ +#!/bin/bash + XCODEBUILD="/usr/bin/xcodebuild" WORKINGDIR=`pwd` PATCH="/usr/bin/patch" + echo "Building OpenVPNAdapter for macOS ..." + # Copy the Project.xcconfig settings to amnezia.xcconfig cat $WORKINGDIR/3rd/OpenVPNAdapter/Configuration/Project.xcconfig > $WORKINGDIR/3rd/OpenVPNAdapter/Configuration/amnezia.xcconfig -OTHER_LDFLAGS[sdk=iphoneos*] = -framework UIKit -OTHER_LDFLAGS[sdk=macosx*] = -framework Cocoa # Append macOS-specific build directory configurations to amnezia.xcconfig cat << EOF >> $WORKINGDIR/3rd/OpenVPNAdapter/Configuration/amnezia.xcconfig @@ -14,12 +16,18 @@ CONFIGURATION_BUILD_DIR = $WORKINGDIR/3rd/OpenVPNAdapter/build/Release-macos BUILT_PRODUCTS_DIR = $WORKINGDIR/3rd/OpenVPNAdapter/build/Release-macos EOF +# Add LDFLAGS for macOS, exclude UIKit which is for iOS only +echo "OTHER_LDFLAGS = -framework Cocoa" >> $WORKINGDIR/3rd/OpenVPNAdapter/Configuration/amnezia.xcconfig + # Fetch the current macOS SDK version dynamically -MACOSX_SDK=macosx15.0 +MACOSX_SDK=$(xcrun --sdk macosx --show-sdk-path | sed -E 's/.*MacOSX([0-9]+\.[0-9]+)\.sdk/\1/') + +echo "Using macOS SDK version: $MACOSX_SDK" + cd 3rd/OpenVPNAdapter # Build for macOS using the correct SDK and destination -if $XCODEBUILD -scheme OpenVPNAdapter -configuration Release -xcconfig Configuration/amnezia.xcconfig -sdk $MACOSX_SDK -destination 'generic/platform=macOS' -project OpenVPNAdapter.xcodeproj ; then +if $XCODEBUILD -scheme OpenVPNAdapter -configuration Release -xcconfig Configuration/amnezia.xcconfig -sdk macosx$MACOSX_SDK -destination 'generic/platform=macOS' -project OpenVPNAdapter.xcodeproj ; then echo "OpenVPNAdapter built successfully for macOS" else echo "OpenVPNAdapter macOS build failed ..." From b1ad874f147fee1a95b58814f578fa2c42c04e2c Mon Sep 17 00:00:00 2001 From: Macbook Date: Sun, 6 Oct 2024 23:07:21 +0700 Subject: [PATCH 04/38] refactor code for iOS and MacNE --- client/3rd/OpenVPNAdapter | 2 +- client/3rd/OpenVPNAdapter.bk | 1 + client/CMakeLists.txt | 37 ++- client/cmake/macos_ne.cmake | 60 ++-- client/cmake/osxtools.cmake | 1 + client/configurators/ssh_configurator.cpp | 2 + .../app/AmneziaVPNLaunchScreen.storyboard | 43 +++ client/macos/app/Info.plist.in | 178 +++++++++++ .../Media.xcassets/AppIcon.appiconset/100.png | Bin 0 -> 4617 bytes .../AppIcon.appiconset/1024.png | Bin 0 -> 47183 bytes .../Media.xcassets/AppIcon.appiconset/114.png | Bin 0 -> 5240 bytes .../Media.xcassets/AppIcon.appiconset/120.png | Bin 0 -> 5452 bytes .../Media.xcassets/AppIcon.appiconset/144.png | Bin 0 -> 6697 bytes .../Media.xcassets/AppIcon.appiconset/152.png | Bin 0 -> 6866 bytes .../Media.xcassets/AppIcon.appiconset/167.png | Bin 0 -> 7581 bytes .../Media.xcassets/AppIcon.appiconset/180.png | Bin 0 -> 8048 bytes .../Media.xcassets/AppIcon.appiconset/20.png | Bin 0 -> 767 bytes .../Media.xcassets/AppIcon.appiconset/29.png | Bin 0 -> 1211 bytes .../Media.xcassets/AppIcon.appiconset/40.png | Bin 0 -> 1719 bytes .../Media.xcassets/AppIcon.appiconset/50.png | Bin 0 -> 2199 bytes .../Media.xcassets/AppIcon.appiconset/57.png | Bin 0 -> 2602 bytes .../Media.xcassets/AppIcon.appiconset/58.png | Bin 0 -> 2595 bytes .../Media.xcassets/AppIcon.appiconset/60.png | Bin 0 -> 2742 bytes .../Media.xcassets/AppIcon.appiconset/72.png | Bin 0 -> 3338 bytes .../Media.xcassets/AppIcon.appiconset/76.png | Bin 0 -> 3496 bytes .../Media.xcassets/AppIcon.appiconset/80.png | Bin 0 -> 3684 bytes .../Media.xcassets/AppIcon.appiconset/87.png | Bin 0 -> 4007 bytes .../AppIcon.appiconset/Contents.json | 290 ++++++++++++++++++ client/macos/app/Media.xcassets/Contents.json | 6 + client/macos/app/PrivacyInfo.xcprivacy | 33 ++ client/macos/app/launch.png | Bin 0 -> 597286 bytes client/macos/app/main.entitlements | 20 ++ client/macos/networkextension/CMakeLists.txt | 4 +- .../PacketTunnelProvider+OpenVPN.swift | 3 +- .../macos_ne/iosnotificationhandler.mm | 15 +- client/protocols/vpnprotocol.cpp | 2 +- client/translations/amneziavpn_ar_EG.ts | 65 ++-- client/translations/amneziavpn_fa_IR.ts | 65 ++-- client/translations/amneziavpn_hi_IN.ts | 65 ++-- client/translations/amneziavpn_my_MM.ts | 65 ++-- client/translations/amneziavpn_ru_RU.ts | 65 ++-- client/translations/amneziavpn_uk_UA.ts | 65 ++-- client/translations/amneziavpn_ur_PK.ts | 65 ++-- client/translations/amneziavpn_zh_CN.ts | 65 ++-- client/ui/controllers/pageController.cpp | 4 +- client/ui/notificationhandler.cpp | 5 +- 46 files changed, 930 insertions(+), 296 deletions(-) create mode 160000 client/3rd/OpenVPNAdapter.bk create mode 100644 client/macos/app/AmneziaVPNLaunchScreen.storyboard create mode 100644 client/macos/app/Info.plist.in create mode 100644 client/macos/app/Media.xcassets/AppIcon.appiconset/100.png create mode 100644 client/macos/app/Media.xcassets/AppIcon.appiconset/1024.png create mode 100644 client/macos/app/Media.xcassets/AppIcon.appiconset/114.png create mode 100644 client/macos/app/Media.xcassets/AppIcon.appiconset/120.png create mode 100644 client/macos/app/Media.xcassets/AppIcon.appiconset/144.png create mode 100644 client/macos/app/Media.xcassets/AppIcon.appiconset/152.png create mode 100644 client/macos/app/Media.xcassets/AppIcon.appiconset/167.png create mode 100644 client/macos/app/Media.xcassets/AppIcon.appiconset/180.png create mode 100644 client/macos/app/Media.xcassets/AppIcon.appiconset/20.png create mode 100644 client/macos/app/Media.xcassets/AppIcon.appiconset/29.png create mode 100644 client/macos/app/Media.xcassets/AppIcon.appiconset/40.png create mode 100644 client/macos/app/Media.xcassets/AppIcon.appiconset/50.png create mode 100644 client/macos/app/Media.xcassets/AppIcon.appiconset/57.png create mode 100644 client/macos/app/Media.xcassets/AppIcon.appiconset/58.png create mode 100644 client/macos/app/Media.xcassets/AppIcon.appiconset/60.png create mode 100644 client/macos/app/Media.xcassets/AppIcon.appiconset/72.png create mode 100644 client/macos/app/Media.xcassets/AppIcon.appiconset/76.png create mode 100644 client/macos/app/Media.xcassets/AppIcon.appiconset/80.png create mode 100644 client/macos/app/Media.xcassets/AppIcon.appiconset/87.png create mode 100644 client/macos/app/Media.xcassets/AppIcon.appiconset/Contents.json create mode 100644 client/macos/app/Media.xcassets/Contents.json create mode 100644 client/macos/app/PrivacyInfo.xcprivacy create mode 100644 client/macos/app/launch.png create mode 100644 client/macos/app/main.entitlements diff --git a/client/3rd/OpenVPNAdapter b/client/3rd/OpenVPNAdapter index 7c821a8d..33afba08 160000 --- a/client/3rd/OpenVPNAdapter +++ b/client/3rd/OpenVPNAdapter @@ -1 +1 @@ -Subproject commit 7c821a8d5c1ad5ad94e0763b4f25a875b5a6fe1b +Subproject commit 33afba081c8592e8632128c7f9d6ebe53cae3d08 diff --git a/client/3rd/OpenVPNAdapter.bk b/client/3rd/OpenVPNAdapter.bk new file mode 160000 index 00000000..7c821a8d --- /dev/null +++ b/client/3rd/OpenVPNAdapter.bk @@ -0,0 +1 @@ +Subproject commit 7c821a8d5c1ad5ad94e0763b4f25a875b5a6fe1b diff --git a/client/CMakeLists.txt b/client/CMakeLists.txt index b217c509..e712fd4a 100644 --- a/client/CMakeLists.txt +++ b/client/CMakeLists.txt @@ -35,7 +35,7 @@ if(IOS OR MACOS_NE) endif() #Macos Network Extension doesn't need Widgets -if(WIN32 OR (APPLE AND NOT IOS) OR (LINUX AND NOT ANDROID) OR (NOT MACOS_NE)) +if(WIN32 OR (APPLE AND NOT IOS) OR (LINUX AND NOT ANDROID) OR (NOT DEFINED MACOS_NE)) set(PACKAGES ${PACKAGES} Widgets) endif() @@ -51,16 +51,16 @@ set(LIBS ${LIBS} if(IOS OR MACOS_NE) set(LIBS ${LIBS} Qt6::Multimedia) endif() -message("Client desktop build ", ${MACOS_NE}) +# message("Client desktop build ", ${MACOS_NE}) #Macos Network Extension doesn't need Widgets -if(WIN32 OR (APPLE AND NOT IOS) OR (LINUX AND NOT ANDROID) OR (APPLE AND NOT MACOS_NE)) +if(WIN32 OR (APPLE AND NOT IOS) OR (LINUX AND NOT ANDROID) OR (APPLE AND NOT DEFINED MACOS_NE)) set(LIBS ${LIBS} Qt6::Widgets) endif() qt_standard_project_setup() qt_add_executable(${PROJECT} MANUAL_FINALIZATION) -if(WIN32 OR (APPLE AND NOT IOS) OR (LINUX AND NOT ANDROID) OR (APPLE AND NOT MACOS_NE)) +if(WIN32 OR (APPLE AND NOT IOS) OR (LINUX AND NOT ANDROID) OR (APPLE AND NOT DEFINED MACOS_NE)) qt_add_repc_replicas(${PROJECT} ${CMAKE_CURRENT_LIST_DIR}/../ipc/ipc_interface.rep) qt_add_repc_replicas(${PROJECT} ${CMAKE_CURRENT_LIST_DIR}/../ipc/ipc_process_interface.rep) qt_add_repc_replicas(${PROJECT} ${CMAKE_CURRENT_LIST_DIR}/../ipc/ipc_process_tun2socks.rep) @@ -170,12 +170,24 @@ include_directories(mozilla) include_directories(mozilla/shared) include_directories(mozilla/models) -if((NOT IOS) OR (NOT MACOS_NE)) +if(MACOS_NE) + message("MACOS_NE is ON") + add_definitions(-DQ_OS_IOS) + add_definitions(-DMACOS_NE) + message("Add macros for MacOS Network Extension") +else() + message("MACOS_NE is OFF") +endif() + + +if(NOT IOS AND NOT MACOS_NE) + message(" Add header for non-IOS and non-MACOS_NE") set(HEADERS ${HEADERS} ${CMAKE_CURRENT_LIST_DIR}/platforms/ios/QRCodeReaderBase.h ) endif() + if(NOT ANDROID) set(HEADERS ${HEADERS} ${CMAKE_CURRENT_LIST_DIR}/ui/notificationhandler.h @@ -220,7 +232,7 @@ if(CMAKE_BUILD_TYPE STREQUAL "Debug") target_compile_definitions(${PROJECT} PRIVATE "MZ_DEBUG") endif() -if((NOT IOS) OR (NOT MACOS_NE)) +if(NOT IOS AND NOT MACOS_NE) set(SOURCES ${SOURCES} ${CMAKE_CURRENT_LIST_DIR}/platforms/ios/QRCodeReaderBase.cpp ) @@ -328,8 +340,12 @@ if(LINUX AND NOT ANDROID) link_directories(${CMAKE_CURRENT_LIST_DIR}/platforms/linux) endif() +if(WIN32 OR (APPLE AND NOT IOS AND NOT MACOS_NE) OR (LINUX AND NOT ANDROID)) + message("Run this block when MACOS_NE is not defined or set to FALSE") +endif() + # Macos Network Extension doesn't need -if(WIN32 OR (APPLE AND NOT IOS) OR (LINUX AND NOT ANDROID) OR (APPLE AND NOT MACOS_NE)) +if(WIN32 OR (APPLE AND NOT IOS AND NOT MACOS_NE) OR (LINUX AND NOT ANDROID)) message("Client desktop build") add_compile_definitions(AMNEZIA_DESKTOP) @@ -365,11 +381,12 @@ endif() if(IOS) include(cmake/ios.cmake) include(cmake/ios-arch-fixup.cmake) -elseif(APPLE AND NOT IOS AND NOT MACOS_NE) +elseif(APPLE AND NOT IOS AND NOT DEFINED MACOS_NE) include(cmake/osxtools.cmake) include(cmake/macos.cmake) - elseif(APPLE AND NOT IOS AND MACOS_NE) - include(cmake/macos_ne.cmake) +elseif(APPLE AND NOT IOS AND MACOS_NE) + include(cmake/osxtools.cmake) + include(cmake/macos_ne.cmake) endif() target_link_libraries(${PROJECT} PRIVATE ${LIBS}) diff --git a/client/cmake/macos_ne.cmake b/client/cmake/macos_ne.cmake index 85fe4fa6..e60c8e1b 100644 --- a/client/cmake/macos_ne.cmake +++ b/client/cmake/macos_ne.cmake @@ -34,22 +34,22 @@ set(LIBS ${LIBS} set(HEADERS ${HEADERS} - ${CMAKE_CURRENT_SOURCE_DIR}/platforms/ios/ios_controller.h - ${CMAKE_CURRENT_SOURCE_DIR}/platforms/ios/ios_controller_wrapper.h - ${CMAKE_CURRENT_SOURCE_DIR}/platforms/ios/iosnotificationhandler.h - ${CMAKE_CURRENT_SOURCE_DIR}/platforms/ios/QtAppDelegate.h - ${CMAKE_CURRENT_SOURCE_DIR}/platforms/ios/QtAppDelegate-C-Interface.h + ${CMAKE_CURRENT_SOURCE_DIR}/platforms/macos_ne/ios_controller.h + ${CMAKE_CURRENT_SOURCE_DIR}/platforms/macos_ne/ios_controller_wrapper.h + ${CMAKE_CURRENT_SOURCE_DIR}/platforms/macos_ne/iosnotificationhandler.h + ${CMAKE_CURRENT_SOURCE_DIR}/platforms/macos_ne/QtAppDelegate.h + ${CMAKE_CURRENT_SOURCE_DIR}/platforms/macos_ne/QtAppDelegate-C-Interface.h ) -set_source_files_properties(${CMAKE_CURRENT_SOURCE_DIR}/platforms/ios/ios_controller.h PROPERTIES OBJECTIVE_CPP_HEADER TRUE) +set_source_files_properties(${CMAKE_CURRENT_SOURCE_DIR}/platforms/macos_ne/ios_controller.h PROPERTIES OBJECTIVE_CPP_HEADER TRUE) set(SOURCES ${SOURCES} - ${CMAKE_CURRENT_SOURCE_DIR}/platforms/ios/ios_controller.mm - ${CMAKE_CURRENT_SOURCE_DIR}/platforms/ios/ios_controller_wrapper.mm - ${CMAKE_CURRENT_SOURCE_DIR}/platforms/ios/iosnotificationhandler.mm - ${CMAKE_CURRENT_SOURCE_DIR}/platforms/ios/iosglue.mm - ${CMAKE_CURRENT_SOURCE_DIR}/platforms/ios/QRCodeReaderBase.mm - ${CMAKE_CURRENT_SOURCE_DIR}/platforms/ios/QtAppDelegate.mm + ${CMAKE_CURRENT_SOURCE_DIR}/platforms/macos_ne/ios_controller.mm + ${CMAKE_CURRENT_SOURCE_DIR}/platforms/macos_ne/ios_controller_wrapper.mm + ${CMAKE_CURRENT_SOURCE_DIR}/platforms/macos_ne/iosnotificationhandler.mm + ${CMAKE_CURRENT_SOURCE_DIR}/platforms/macos_ne/iosglue.mm + ${CMAKE_CURRENT_SOURCE_DIR}/platforms/macos_ne/QRCodeReaderBase.mm + ${CMAKE_CURRENT_SOURCE_DIR}/platforms/macos_ne/QtAppDelegate.mm ) set(ICON_FILE ${CMAKE_CURRENT_SOURCE_DIR}/images/app.icns) @@ -71,7 +71,7 @@ target_include_directories(${PROJECT} PRIVATE ${Qt6Gui_PRIVATE_INCLUDE_DIRS}) 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}/macos/app/Info.plist.in #MACOSX_BUNDLE_ICON_FILE "AppIcon" MACOSX_BUNDLE_INFO_STRING "AmneziaVPN" MACOSX_BUNDLE_BUNDLE_NAME "AmneziaVPN" @@ -79,7 +79,7 @@ set_target_properties(${PROJECT} PROPERTIES MACOSX_BUNDLE_LONG_VERSION_STRING "${APPLE_PROJECT_VERSION}-${CMAKE_PROJECT_VERSION_TWEAK}" MACOSX_BUNDLE_SHORT_VERSION_STRING "${APPLE_PROJECT_VERSION}" 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 "${CMAKE_CURRENT_SOURCE_DIR}/macos/app/main.entitlements" XCODE_ATTRIBUTE_MARKETING_VERSION "${APPLE_PROJECT_VERSION}" XCODE_ATTRIBUTE_CURRENT_PROJECT_VERSION "${CMAKE_PROJECT_VERSION_TWEAK}" XCODE_ATTRIBUTE_PRODUCT_NAME "AmneziaVPN" @@ -96,14 +96,14 @@ set_target_properties(${PROJECT} PROPERTIES XCODE_EMBED_APP_EXTENSIONS networkextension XCODE_ATTRIBUTE_CODE_SIGN_STYLE Automatic - #XCODE_ATTRIBUTE_CODE_SIGN_STYLE Manual + # XCODE_ATTRIBUTE_CODE_SIGN_STYLE Manual - #XCODE_ATTRIBUTE_CODE_SIGN_IDENTITY "Apple Distribution: Privacy Technologies OU (X7UJ388FXK)" - #XCODE_ATTRIBUTE_CODE_SIGN_IDENTITY[variant=Debug] "Apple Development" + # XCODE_ATTRIBUTE_CODE_SIGN_IDENTITY "Apple Distribution: Privacy Technologies OU (X7UJ388FXK)" + # XCODE_ATTRIBUTE_CODE_SIGN_IDENTITY[variant=Debug] "Apple Development" - #XCODE_ATTRIBUTE_PROVISIONING_PROFILE_SPECIFIER "Mac AppStore AmneziaVPN" - #XCODE_ATTRIBUTE_PROVISIONING_PROFILE_SPECIFIER[variant=Debug] "Mac AppStore AmneziaVPN" + # XCODE_ATTRIBUTE_PROVISIONING_PROFILE_SPECIFIER "Mac AppStore AmneziaVPN" + # XCODE_ATTRIBUTE_PROVISIONING_PROFILE_SPECIFIER[variant=Debug] "Mac AppStore AmneziaVPN" ) set_target_properties(${PROJECT} PROPERTIES @@ -127,23 +127,23 @@ set(WG_APPLE_SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/3rd/amneziawg-apple/Sources) target_sources(${PROJECT} PRIVATE # ${CMAKE_CURRENT_SOURCE_DIR}/platforms/ios/iosvpnprotocol.swift ${WG_APPLE_SOURCE_DIR}/WireGuardKitC/x25519.c - ${CLIENT_ROOT_DIR}/platforms/ios/LogController.swift - ${CLIENT_ROOT_DIR}/platforms/ios/Log.swift - ${CLIENT_ROOT_DIR}/platforms/ios/LogRecord.swift - ${CLIENT_ROOT_DIR}/platforms/ios/ScreenProtection.swift - ${CLIENT_ROOT_DIR}/platforms/ios/VPNCController.swift + ${CLIENT_ROOT_DIR}/platforms/macos_ne/LogController.swift + ${CLIENT_ROOT_DIR}/platforms/macos_ne/Log.swift + ${CLIENT_ROOT_DIR}/platforms/macos_ne/LogRecord.swift + ${CLIENT_ROOT_DIR}/platforms/macos_ne/ScreenProtection.swift + ${CLIENT_ROOT_DIR}/platforms/macos_ne/VPNCController.swift ) target_sources(${PROJECT} PRIVATE - #${CMAKE_CURRENT_SOURCE_DIR}/ios/app/AmneziaVPNLaunchScreen.storyboard - ${CMAKE_CURRENT_SOURCE_DIR}/ios/app/Media.xcassets - ${CMAKE_CURRENT_SOURCE_DIR}/ios/app/PrivacyInfo.xcprivacy + #${CMAKE_CURRENT_SOURCE_DIR}/macos_ne/app/AmneziaVPNLaunchScreen.storyboard + ${CMAKE_CURRENT_SOURCE_DIR}/macos/app/Media.xcassets + ${CMAKE_CURRENT_SOURCE_DIR}/macos/app/PrivacyInfo.xcprivacy ) set_property(TARGET ${PROJECT} APPEND PROPERTY RESOURCE - #${CMAKE_CURRENT_SOURCE_DIR}/ios/app/AmneziaVPNLaunchScreen.storyboard - ${CMAKE_CURRENT_SOURCE_DIR}/ios/app/Media.xcassets - ${CMAKE_CURRENT_SOURCE_DIR}/ios/app/PrivacyInfo.xcprivacy + #${CMAKE_CURRENT_SOURCE_DIR}/macos/app/AmneziaVPNLaunchScreen.storyboard + ${CMAKE_CURRENT_SOURCE_DIR}/macos/app/Media.xcassets + ${CMAKE_CURRENT_SOURCE_DIR}/macos/app/PrivacyInfo.xcprivacy ) add_subdirectory(macos/networkextension) diff --git a/client/cmake/osxtools.cmake b/client/cmake/osxtools.cmake index a28c9680..ff8c8a77 100644 --- a/client/cmake/osxtools.cmake +++ b/client/cmake/osxtools.cmake @@ -141,6 +141,7 @@ function(osx_codesign_target TARGET) endif() foreach(FILE ${CODESIGN_FILES}) + message(STATUS "Signing ${TARGET}: ${FILE}") add_custom_command(TARGET ${TARGET} POST_BUILD VERBATIM COMMAND ${COMMENT_ECHO_COMMAND} "Signing ${TARGET}: ${FILE}" COMMAND ${CODESIGN_BIN} ${CODESIGN_ARGS} ${FILE} diff --git a/client/configurators/ssh_configurator.cpp b/client/configurators/ssh_configurator.cpp index 308f5947..d21360e3 100644 --- a/client/configurators/ssh_configurator.cpp +++ b/client/configurators/ssh_configurator.cpp @@ -102,7 +102,9 @@ QProcessEnvironment SshConfigurator::prepareEnv() pathEnvVar.prepend(QDir::toNativeSeparators(QApplication::applicationDirPath()) + "\\cygwin;"); pathEnvVar.prepend(QDir::toNativeSeparators(QApplication::applicationDirPath()) + "\\openvpn;"); #elif defined(Q_OS_MACX) +#if !defined(MACOS_NE) pathEnvVar.prepend(QDir::toNativeSeparators(QApplication::applicationDirPath()) + "/Contents/MacOS"); +#endif #endif env.insert("PATH", pathEnvVar); diff --git a/client/macos/app/AmneziaVPNLaunchScreen.storyboard b/client/macos/app/AmneziaVPNLaunchScreen.storyboard new file mode 100644 index 00000000..92f79f7e --- /dev/null +++ b/client/macos/app/AmneziaVPNLaunchScreen.storyboard @@ -0,0 +1,43 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/client/macos/app/Info.plist.in b/client/macos/app/Info.plist.in new file mode 100644 index 00000000..a10160be --- /dev/null +++ b/client/macos/app/Info.plist.in @@ -0,0 +1,178 @@ + + + + + CFBundleAllowMixedLocalizations + + CFBundleDevelopmentRegion + en + CFBundleDisplayName + ${QT_INTERNAL_DOLLAR_VAR}{PRODUCT_NAME} + CFBundleExecutable + ${MACOSX_BUNDLE_EXECUTABLE_NAME} + CFBundleIdentifier + ${MACOSX_BUNDLE_GUI_IDENTIFIER} + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + ${MACOSX_BUNDLE_BUNDLE_NAME} + CFBundlePackageType + APPL + CFBundleShortVersionString + ${MACOSX_BUNDLE_SHORT_VERSION_STRING} + CFBundleVersion + ${MACOSX_BUNDLE_BUNDLE_VERSION} + NSHumanReadableCopyright + ${MACOSX_BUNDLE_COPYRIGHT} + ITSAppUsesNonExemptEncryption + + LSRequiresIPhoneOS + + LSSupportsOpeningDocumentsInPlace + + UILaunchStoryboardName + AmneziaVPNLaunchScreen + UIRequiredDeviceCapabilities + + UIRequiresFullScreen + + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortraitUpsideDown + UIInterfaceOrientationPortrait + + UISupportedInterfaceOrientations~ipad + + UIUserInterfaceStyle + Light + com.wireguard.ios.app_group_id + group.org.amnezia.AmneziaVPN + UIViewControllerBasedStatusBarAppearance + + NSCameraUsageDescription + Amnezia VPN needs access to the camera for reading QR-codes. + NSAppTransportSecurity + + NSAllowsArbitraryLoads + + NSAllowsLocalNetworking + + + CFBundleIcons + + CFBundleIcons~ipad + + UTImportedTypeDeclarations + + + UTTypeConformsTo + + public.data + + UTTypeDescription + Amnezia VPN config + UTTypeIconFiles + + UTTypeIdentifier + org.amnezia.AmneziaVPN.amnezia-config + UTTypeTagSpecification + + public.filename-extension + + vpn + + public.mime-type + + text/plain + + + + + UTTypeConformsTo + + public.data + + UTTypeDescription + WireGuard config + UTTypeIconFiles + + UTTypeIdentifier + org.amnezia.AmneziaVPN.wireguard-config + UTTypeTagSpecification + + public.filename-extension + + conf + cfg + + public.mime-type + + text/plain + + + + + UTTypeConformsTo + + public.data + + UTTypeDescription + OpenVPN config + UTTypeIconFiles + + UTTypeIdentifier + org.amnezia.AmneziaVPN.openvpn-config + UTTypeTagSpecification + + public.filename-extension + + ovpn + + public.mime-type + + text/plain + + + + + UTTypeConformsTo + + public.data + + UTTypeDescription + AmneziaVPN backup file + UTTypeIconFiles + + UTTypeIdentifier + org.amnezia.AmneziaVPN.backup-config + UTTypeTagSpecification + + public.filename-extension + + backup + + public.mime-type + + text/plain + + + + + CFBundleDocumentTypes + + + CFBundleTypeName + Amnezia VPN config + LSHandlerRank + Alternate + LSItemContentTypes + + org.amnezia.AmneziaVPN.amnezia-config + org.amnezia.AmneziaVPN.wireguard-config + org.amnezia.AmneziaVPN.openvpn-config + org.amnezia.AmneziaVPN.backup-config + + + + + diff --git a/client/macos/app/Media.xcassets/AppIcon.appiconset/100.png b/client/macos/app/Media.xcassets/AppIcon.appiconset/100.png new file mode 100644 index 0000000000000000000000000000000000000000..bbe3d54668b21b394ee80e299c691446804f140d GIT binary patch literal 4617 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%0D@$?fW)yh@lQd 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 OFP$?wTdZgQ;Qs(OiyJZk literal 0 HcmV?d00001 diff --git a/client/macos/app/Media.xcassets/AppIcon.appiconset/114.png b/client/macos/app/Media.xcassets/AppIcon.appiconset/114.png new file mode 100644 index 0000000000000000000000000000000000000000..f88f66c774dcff452a2bac52483e35166c84c310 GIT binary patch literal 5240 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 literal 0 HcmV?d00001 diff --git a/client/macos/app/Media.xcassets/AppIcon.appiconset/120.png b/client/macos/app/Media.xcassets/AppIcon.appiconset/120.png new file mode 100644 index 0000000000000000000000000000000000000000..51829dc1342bc39b907cf52a5dfeede1985308bb GIT binary patch literal 5452 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 literal 0 HcmV?d00001 diff --git a/client/macos/app/Media.xcassets/AppIcon.appiconset/144.png b/client/macos/app/Media.xcassets/AppIcon.appiconset/144.png new file mode 100644 index 0000000000000000000000000000000000000000..0e28bd7b43b4d4eeca39f597456a2f5631b8e739 GIT binary patch literal 6697 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 TGE!b7C=?}mb-5}TaPa>C=#WKm literal 0 HcmV?d00001 diff --git a/client/macos/app/Media.xcassets/AppIcon.appiconset/167.png b/client/macos/app/Media.xcassets/AppIcon.appiconset/167.png new file mode 100644 index 0000000000000000000000000000000000000000..44858c5a539e75930f1a2df0c2208127943f1030 GIT binary patch literal 7581 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 T7d+4lnu?^Xpdnu=YaaF=im8=v literal 0 HcmV?d00001 diff --git a/client/macos/app/Media.xcassets/AppIcon.appiconset/180.png b/client/macos/app/Media.xcassets/AppIcon.appiconset/180.png new file mode 100644 index 0000000000000000000000000000000000000000..911f5491eff0c4e75f8a33510029d9d7ad636c3c GIT binary patch literal 8048 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 literal 0 HcmV?d00001 diff --git a/client/macos/app/Media.xcassets/AppIcon.appiconset/29.png b/client/macos/app/Media.xcassets/AppIcon.appiconset/29.png new file mode 100644 index 0000000000000000000000000000000000000000..bf9a2c1910f598d599d971baead3b34956e7a310 GIT binary patch literal 1211 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 N002ovPDHLkV1gfpErkF8 literal 0 HcmV?d00001 diff --git a/client/macos/app/Media.xcassets/AppIcon.appiconset/50.png b/client/macos/app/Media.xcassets/AppIcon.appiconset/50.png new file mode 100644 index 0000000000000000000000000000000000000000..83c3e6b7ae98c4923bfdb5efcd03fcec550a6bea GIT binary patch literal 2199 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 M07*qoM6N<$f;5=#=Kufz literal 0 HcmV?d00001 diff --git a/client/macos/app/Media.xcassets/AppIcon.appiconset/58.png b/client/macos/app/Media.xcassets/AppIcon.appiconset/58.png new file mode 100644 index 0000000000000000000000000000000000000000..2714c6bfd2efb872d6e71a0d202e21c612581866 GIT binary patch literal 2595 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 literal 0 HcmV?d00001 diff --git a/client/macos/app/Media.xcassets/AppIcon.appiconset/72.png b/client/macos/app/Media.xcassets/AppIcon.appiconset/72.png new file mode 100644 index 0000000000000000000000000000000000000000..d0f203630e5ec2ec3b1985288cefe1b86bb047e7 GIT binary patch literal 3338 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 W8X(74iC$#@0000(aDAZ2J5$RZ4t#%5nGJ_Xl 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 + + + + NSPrivacyAccessedAPITypes + + + NSPrivacyAccessedAPIType + NSPrivacyAccessedAPICategoryFileTimestamp + NSPrivacyAccessedAPITypeReasons + + C617.1 + + + + NSPrivacyAccessedAPIType + NSPrivacyAccessedAPICategoryUserDefaults + NSPrivacyAccessedAPITypeReasons + + 1C8F.1 + + + + NSPrivacyAccessedAPIType + NSPrivacyAccessedAPICategorySystemBootTime + NSPrivacyAccessedAPITypeReasons + + 35F9.1 + + + + + diff --git a/client/macos/app/launch.png b/client/macos/app/launch.png new file mode 100644 index 0000000000000000000000000000000000000000..175b1afc81ded929f2c92f7b41c84826d1a9f1fe GIT binary patch literal 597286 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 cVPJnIjgYhuLRl5Vzr-Lwzz7U0*`f$-#f&kZ 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

VO{oqgPPCX*u4lwi^s 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

+VT)EO}_=MjWvji@5&IT8|LkX)fhT9g_cLG#* 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�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 + + + + com.apple.developer.networking.networkextension + + packet-tunnel-provider + + com.apple.security.application-groups + + group.org.amnezia.AmneziaVPN + + com.apple.security.files.user-selected.read-write + + keychain-access-groups + + $(AppIdentifierPrefix)group.org.amnezia.AmneziaVPN + + + diff --git a/client/macos/networkextension/CMakeLists.txt b/client/macos/networkextension/CMakeLists.txt index 5ae76c44..1f63b0ab 100644 --- a/client/macos/networkextension/CMakeLists.txt +++ b/client/macos/networkextension/CMakeLists.txt @@ -30,7 +30,7 @@ set_target_properties(networkextension PROPERTIES XCODE_ATTRIBUTE_LD_RUNPATH_SEARCH_PATHS "@executable_path/../../Frameworks" - # XCODE_ATTRIBUTE_CODE_SIGN_STYLE Automatic + XCODE_ATTRIBUTE_CODE_SIGN_STYLE Automatic # #XCODE_ATTRIBUTE_CODE_SIGN_STYLE Manual # #XCODE_ATTRIBUTE_CODE_SIGN_IDENTITY "Apple Distribution: Privacy Technologies OU (X7UJ388FXK)" @@ -187,7 +187,7 @@ target_sources(networkextension PRIVATE target_include_directories(networkextension PRIVATE ${CLIENT_ROOT_DIR}) target_include_directories(networkextension PRIVATE ${CMAKE_CURRENT_BINARY_DIR}) -target_link_libraries(networkextension PRIVATE ${CLIENT_ROOT_DIR}/3rd-prebuilt/3rd-prebuilt/wireguard/ios/arm64/libwg-go.a) +target_link_libraries(networkextension PRIVATE ${CLIENT_ROOT_DIR}/3rd-prebuilt/3rd-prebuilt/wireguard/macos/x86_64/libwg-go.a) # Print the root directory for debugging purposes message("---------") diff --git a/client/platforms/macos_ne/PacketTunnelProvider+OpenVPN.swift b/client/platforms/macos_ne/PacketTunnelProvider+OpenVPN.swift index 3e0a4a07..bb002f27 100644 --- a/client/platforms/macos_ne/PacketTunnelProvider+OpenVPN.swift +++ b/client/platforms/macos_ne/PacketTunnelProvider+OpenVPN.swift @@ -47,7 +47,8 @@ extension PacketTunnelProvider { let configuration = OpenVPNConfiguration() configuration.fileContent = ovpnConfiguration if str.contains("cloak") { - configuration.setPTCloak() + // TODO disable cloak +// configuration.setPTCloak() } let evaluation: OpenVPNConfigurationEvaluation? diff --git a/client/platforms/macos_ne/iosnotificationhandler.mm b/client/platforms/macos_ne/iosnotificationhandler.mm index 5759c892..a1aa3d8d 100644 --- a/client/platforms/macos_ne/iosnotificationhandler.mm +++ b/client/platforms/macos_ne/iosnotificationhandler.mm @@ -2,15 +2,14 @@ * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -#include "platforms/ios/iosnotificationhandler.h" +#include "platforms/macos_ne/iosnotificationhandler.h" #import #import -//#import -/* +// Removed the UIResponder and UIApplicationDelegate references as these are not available in macOS @interface IOSNotificationDelegate - : UIResponder { + : NSObject { IOSNotificationHandler* m_iosNotificationHandler; } @end @@ -18,7 +17,7 @@ @implementation IOSNotificationDelegate - (id)initWithObject:(IOSNotificationHandler*)notification { - self = [super init]; + self = [super init]; // Removed `super init` as it refers to UIResponder, which is iOS specific if (self) { m_iosNotificationHandler = notification; } @@ -30,7 +29,7 @@ withCompletionHandler: (void (^)(UNNotificationPresentationOptions options))completionHandler { Q_UNUSED(center) - completionHandler(UNNotificationPresentationOptionAlert); + completionHandler(UNNotificationPresentationOptionList | UNNotificationPresentationOptionBanner); } - (void)userNotificationCenter:(UNUserNotificationCenter*)center @@ -79,7 +78,7 @@ void IOSNotificationHandler::notify(NotificationHandler::Message type, const QSt trigger:trigger]; UNUserNotificationCenter* center = [UNUserNotificationCenter currentNotificationCenter]; - center.delegate = id(m_delegate); + center.delegate = (id)m_delegate; [center addNotificationRequest:request withCompletionHandler:^(NSError* _Nullable error) { @@ -87,4 +86,4 @@ void IOSNotificationHandler::notify(NotificationHandler::Message type, const QSt NSLog(@"Local Notification failed"); } }]; -}*/ +} diff --git a/client/protocols/vpnprotocol.cpp b/client/protocols/vpnprotocol.cpp index 056089b8..3b2375cb 100644 --- a/client/protocols/vpnprotocol.cpp +++ b/client/protocols/vpnprotocol.cpp @@ -109,7 +109,7 @@ VpnProtocol *VpnProtocol::factory(DockerContainer container, const QJsonObject & #if defined(Q_OS_WINDOWS) case DockerContainer::Ipsec: return new Ikev2Protocol(configuration); #endif -#if defined(Q_OS_WINDOWS) || defined(Q_OS_MACX) || (defined(Q_OS_LINUX) && !defined(Q_OS_ANDROID)) +#if defined(Q_OS_WINDOWS) || defined(Q_OS_MACX) and !defined MACOS_NE || (defined(Q_OS_LINUX) && !defined(Q_OS_ANDROID)) case DockerContainer::OpenVpn: return new OpenVpnProtocol(configuration); case DockerContainer::Cloak: return new OpenVpnOverCloakProtocol(configuration); case DockerContainer::ShadowSocks: return new ShadowSocksVpnProtocol(configuration); diff --git a/client/translations/amneziavpn_ar_EG.ts b/client/translations/amneziavpn_ar_EG.ts index e176d8eb..515abd56 100644 --- a/client/translations/amneziavpn_ar_EG.ts +++ b/client/translations/amneziavpn_ar_EG.ts @@ -258,18 +258,18 @@ Can't be disabled for current server غير قادر علي فتح الملف - - + + Invalid configuration file ملف تكوين غير صحيح - + Scanned %1 of %2. تم فحص%1 من %2. - + In the imported configuration, potentially dangerous lines were found: في التكوين المستورد، تم العثور على سطور يحتمل أن تكون خطرة: @@ -401,28 +401,28 @@ Already installed containers were found on the server. All installed containers NotificationHandler - - + + AmneziaVPN AmneziaVPN - + VPN Connected تم الاتصال - + VPN Disconnected تم إنهاء الاتصال - + AmneziaVPN notification إشعار من AmneziaVPN - + Unsecured network detected: تم العثور علي شبكة غير مؤمنة: @@ -2426,12 +2426,12 @@ Already installed containers were found on the server. All installed containers عنوان خادم IP [:منفذ] - + Continue واصل - + All data you enter will remain strictly confidential and will not be shared or disclosed to the Amnezia or any third parties ستظل جميع البيانات التي تدخلها سرية للغاية ولن تتم مشاركتها أو الكشف عنها ل Amnezia أو أي طرف ثالث @@ -2441,42 +2441,42 @@ Already installed containers were found on the server. All installed containers - + SSH Username - + Password or SSH private key كلمة مرور او مفتاح SSH خاص - + How to run your VPN server كيف تقوم بتشغيل خادم ال VPN الخاص بك - + Where to get connection data, step-by-step instructions for buying a VPS اين تحصل علي بيانات الاتصال, تعليمات خطوة ب خطوة لشراء VPS - + Ip address cannot be empty لا يمكن لعنوان IP ان يكون فارغ - + Enter the address in the format 255.255.255.255:88 ادخل العنوان في شكل 255.255.255.255:88 - + Login cannot be empty تسجيل دخول لا يمكن ان يكون فارغ - + Password/private key cannot be empty كلمة مرور/مفتاح خاص لأ يمكن ان يكونو فارغين @@ -2791,42 +2791,47 @@ Already installed containers were found on the server. All installed containers البيانات المٌرسلة: %1 - + + Allowed IPs: %1 + + + + Rename إعادة التسمية - + Client name اسم العميل - + Save احفظ - + Revoke سحب وإبطال - + Revoke the config for a user - %1? سحب وإبطال للمستخدم - %1? - + The user will no longer be able to connect to your server. المستخدم لن يكون قادر علي الاتصال بعد الان. - + Continue واصل - + Cancel إلغاء @@ -4100,12 +4105,12 @@ While it offers a blend of security, stability, and speed, it's essential t main2 - + Private key passphrase عبارة المرور الخاصة بالمفتاح - + Save احفظ diff --git a/client/translations/amneziavpn_fa_IR.ts b/client/translations/amneziavpn_fa_IR.ts index 6cd78e77..468f16b4 100644 --- a/client/translations/amneziavpn_fa_IR.ts +++ b/client/translations/amneziavpn_fa_IR.ts @@ -263,18 +263,18 @@ Can't be disabled for current server نمی‌توان فایل را باز کرد. - - + + Invalid configuration file فایل پیکربندی نامعتبر است. - + Scanned %1 of %2. ارزیابی %1 از %2. - + In the imported configuration, potentially dangerous lines were found: در پیکربندی وارد شده، خطوطی که ممکن است خطرناک باشند، یافت شدند: @@ -405,28 +405,28 @@ Already installed containers were found on the server. All installed containers NotificationHandler - - + + AmneziaVPN AmneziaVPN - + VPN Connected وی‎پی‎ان وصل شد - + VPN Disconnected وی‎پی‎ان قطع شد - + AmneziaVPN notification اخطار AmneziaVPN - + Unsecured network detected: شبکه ناامن شناسایی شد: @@ -2544,12 +2544,12 @@ It's okay as long as it's from someone you trust. آدرس آی‎پی سرور (:پورت) - + Continue ادامه - + Enter the address in the format 255.255.255.255:88 آدرس را با فرمت 255.255.255.255:88 وارد کنید @@ -2564,42 +2564,42 @@ It's okay as long as it's from someone you trust. - + SSH Username - + Password or SSH private key رمز عبور یا کلید خصوصی SSH - + All data you enter will remain strictly confidential and will not be shared or disclosed to the Amnezia or any third parties تمام داده‎هایی که شما وارد می‎کنید به شدت محرمانه‎ است و با Amnezia یا هر شخص ثالث دیگری به اشتراک گذاشته نمی‎شود - + How to run your VPN server چگونه سرور VPN خود را اجرا کنید - + Where to get connection data, step-by-step instructions for buying a VPS داده‌های اتصال را از کجا دریافت کنید و دستورالعمل‌های مرحله به مرحله برای خرید یک VPS - + Ip address cannot be empty آدرس آی‎پی نمی‎تواند خالی باشد - + Login cannot be empty نام‎کاربری نمی‎تواند خالی باشد - + Password/private key cannot be empty پسورد یا کلید خصوصی نمی‎تواند خالی باشد @@ -2958,47 +2958,52 @@ It's okay as long as it's from someone you trust. Data sent: %1 داده‌های ارسال شده: %1 + + + Allowed IPs: %1 + + Creation date: تاریخ ایجاد: - + Rename تغییر نام - + Client name نام کلاینت - + Save ذخیره - + Revoke ابطال - + Revoke the config for a user - %1? لغو پیکربندی برای یک کاربر - %1? - + The user will no longer be able to connect to your server. کاربر دیگر نمی‎تواند به سرور وصل شود. - + Continue ادامه - + Cancel کنسل @@ -4316,12 +4321,12 @@ For more detailed information, you can main2 - + Private key passphrase عبارت کلید خصوصی - + Save ذخیره diff --git a/client/translations/amneziavpn_hi_IN.ts b/client/translations/amneziavpn_hi_IN.ts index ab459b7c..92cebd8c 100644 --- a/client/translations/amneziavpn_hi_IN.ts +++ b/client/translations/amneziavpn_hi_IN.ts @@ -259,18 +259,18 @@ Can't be disabled for current server फाइल खोलने में असमर्थ - - + + Invalid configuration file अमान्य कॉन्फ़िगरेशन फ़ाइल - + Scanned %1 of %2. %2 में से %1 स्कैन किया गया. - + In the imported configuration, potentially dangerous lines were found: @@ -401,28 +401,28 @@ Already installed containers were found on the server. All installed containers NotificationHandler - - + + AmneziaVPN AmneziaVPN - + VPN Connected कनेक्ट - + VPN Disconnected कनेक्ट - + AmneziaVPN notification AmneziaVPN अधिसूचना - + Unsecured network detected: असुरक्षित नेटवर्क का पता चला: @@ -2494,12 +2494,12 @@ Already installed containers were found on the server. All installed containers सर्वर आईपी पता [:पोर्ट] - + Continue जारी रखना - + All data you enter will remain strictly confidential and will not be shared or disclosed to the Amnezia or any third parties आपके द्वारा दर्ज किया गया सभी डेटा पूरी तरह से गोपनीय रहेगा और एमनेज़िया या किसी तीसरे पक्ष को साझा या प्रकट नहीं किया जाएगा @@ -2509,42 +2509,42 @@ Already installed containers were found on the server. All installed containers 255.255.255.255:22 - + SSH Username SSH उपयोगकर्ता नाम - + Password or SSH private key पासवर्ड या SSH निजी कुंजी - + How to run your VPN server - + Where to get connection data, step-by-step instructions for buying a VPS - + Ip address cannot be empty आईपी ​​पता खाली नहीं हो सकता - + Enter the address in the format 255.255.255.255:88 पता 255.255.255.255:88 प्रारूप में दर्ज करें - + Login cannot be empty लॉगिन खाली नहीं हो सकता - + Password/private key cannot be empty पासवर्ड/निजी कुंजी खाली नहीं हो सकती @@ -2876,47 +2876,52 @@ Already installed containers were found on the server. All installed containers Data sent: %1 डेटा भेजा गया: %1 + + + Allowed IPs: %1 + + Creation date: निर्माण तिथि: - + Rename नाम बदलें - + Client name ग्राहक नाम - + Save सहेजें - + Revoke निरस्त करें - + Revoke the config for a user - %1? किसी उपयोक्ता के लिए कॉन्फ़िगरेशन निरस्त करें - %1? - + The user will no longer be able to connect to your server. उपयोगकर्ता अब आपके सर्वर से कनेक्ट नहीं हो पाएगा. - + Continue जारी रखना - + Cancel रद्द करना @@ -4208,12 +4213,12 @@ While it offers a blend of security, stability, and speed, it's essential t main2 - + Private key passphrase निजी कुंजी पासफ़्रेज़ - + Save सहेजें diff --git a/client/translations/amneziavpn_my_MM.ts b/client/translations/amneziavpn_my_MM.ts index 3e964cc9..7479e454 100644 --- a/client/translations/amneziavpn_my_MM.ts +++ b/client/translations/amneziavpn_my_MM.ts @@ -259,18 +259,18 @@ Can't be disabled for current server ဖိုင်ကိုဖွင့်၍မရပါ - - + + Invalid configuration file Configuration ဖိုင် မမှန်ကန်ပါ - + Scanned %1 of %2. %2 ၏ %1 ကို စကင်န်ဖတ်ထားသည်. - + In the imported configuration, potentially dangerous lines were found: တင်သွင်းသည့် configuration တွင်၊ အန္တရာယ်ရှိနိုင်သည့်စာလိုင်းများကို တွေ့ရှိခဲ့သည်: @@ -401,28 +401,28 @@ Already installed containers were found on the server. All installed containers NotificationHandler - - + + AmneziaVPN AmneziaVPN - + VPN Connected VPN ချိတ်ဆက်ထားပါပြီ - + VPN Disconnected VPN ဖြုတ်လိုက်ပါပြီ - + AmneziaVPN notification AmneziaVPN နိုတီ - + Unsecured network detected: လုံခြုံမှုမရှိသောကွန်ရက်မှန်း ထောက်လှန်းမိသည်: @@ -2430,12 +2430,12 @@ Already installed containers were found on the server. All installed containers ဆာဗာ IP လိပ်စာ [:port] - + Continue ဆက်လက်လုပ်ဆောင်မည် - + Enter the address in the format 255.255.255.255:88 လိပ်စာကို 255.255.255.255:88 ဖော်မတ်ဖြင့် ထည့်ပါ @@ -2450,42 +2450,42 @@ Already installed containers were found on the server. All installed containers 255.255.255.255:22 - + SSH Username SSH အသုံးပြုသူအမည် - + Password or SSH private key စကားဝှက် သိုမဟုတ် SSH private key - + All data you enter will remain strictly confidential and will not be shared or disclosed to the Amnezia or any third parties သင်ထည့်သွင်းသည့်ဒေတာအားလုံးကို တင်းကြပ်လုံခြုံစွာလျှို့ဝှက်ထားမည်ဖြစ်ပြီး Amnezia သို့မဟုတ် မည်သည့်ပြင်ပအဖွဲ့အစည်းကိုမျှ မျှဝေမည် သို့မဟုတ် ထုတ်ဖော်မည်မဟုတ်ပါ - + How to run your VPN server သင်၏ဆာဗာကို လည်ပတ်ပုံလည်ပတ်နည်း - + Where to get connection data, step-by-step instructions for buying a VPS ချိတ်ဆက်မှုဒေတာကို ဘယ်မှာရနိုင်မလဲ၊ VPS ဝယ်ယူပုံဝယ်ယူနည်းအတွက် အဆင့်ဆင့် ညွှန်ကြားချက်များ - + Ip address cannot be empty IP လိပ်စာသည် ဗလာမဖြစ်ရပါ - + Login cannot be empty လော့ဂ်အင်အချက်အလက်သည် ဗလာမဖြစ်ရပါ - + Password/private key cannot be empty စကားဝှက်/private key သည် ဗလာမဖြစ်ရပါ @@ -2825,42 +2825,47 @@ Already installed containers were found on the server. All installed containers ပေးပို့လိုက်သည့်ဒေတာ: %1 - + + Allowed IPs: %1 + + + + Rename အမည်ပြောင်းမည် - + Client name ကလိုင်းရင့်အမည် - + Save သိမ်းဆည်းမည် - + Revoke ပြန်ရုပ်သိမ်းမည် - + Revoke the config for a user - %1? အသုံးပြုသူ %1 အတွက် config ကို ပြန်လည်ရုပ်သိမ်းမည်လား? - + The user will no longer be able to connect to your server. ဤအသုံးပြုသူသည် သင့်ဆာဗာသို့ ချိတ်ဆက်နိုင်တော့မည်မဟုတ်ပါ. - + Continue ဆက်လက်လုပ်ဆောင်မည် - + Cancel ပယ်ဖျက်မည် @@ -4105,12 +4110,12 @@ For more detailed information, you can main2 - + Private key passphrase ကိုယ်ပိုင် key စကားဝှက် - + Save သိမ်းဆည်းမည် diff --git a/client/translations/amneziavpn_ru_RU.ts b/client/translations/amneziavpn_ru_RU.ts index 2fb21259..b8f1a242 100644 --- a/client/translations/amneziavpn_ru_RU.ts +++ b/client/translations/amneziavpn_ru_RU.ts @@ -263,18 +263,18 @@ Can't be disabled for current server Невозможно открыть файл - - + + Invalid configuration file Неверный файл конфигурации - + Scanned %1 of %2. Отсканировано %1 из %2. - + In the imported configuration, potentially dangerous lines were found: В импортированной конфигурации были обнаружены потенциально опасные строки: @@ -405,28 +405,28 @@ Already installed containers were found on the server. All installed containers NotificationHandler - - + + AmneziaVPN AmneziaVPN - + VPN Connected VPN подключен - + VPN Disconnected VPN выключен - + AmneziaVPN notification Уведомление AmneziaVPN - + Unsecured network detected: Обнаружена незащищенная сеть: @@ -2628,7 +2628,7 @@ It's okay as long as it's from someone you trust. Password / SSH private key - + Continue Продолжить @@ -2638,7 +2638,7 @@ and will not be shared or disclosed to the Amnezia or any third parties Все данные, которые вы вводите, останутся строго конфиденциальными и не будут переданы или раскрыты Amnezia или каким-либо третьим лицам - + Enter the address in the format 255.255.255.255:88 Введите адрес в формате 255.255.255.255:88 @@ -2657,42 +2657,42 @@ and will not be shared or disclosed to the Amnezia or any third parties 255.255.255.255:22 - + SSH Username Имя пользователя SSH - + Password or SSH private key Пароль или закрытый ключ SSH - + All data you enter will remain strictly confidential and will not be shared or disclosed to the Amnezia or any third parties Все данные, которые вы вводите, останутся строго конфиденциальными и не будут переданы или раскрыты Amnezia или каким-либо третьим лицам - + How to run your VPN server Как создать VPN на собственном сервере - + Where to get connection data, step-by-step instructions for buying a VPS Где взять данные для подключения, пошаговые инстуркции по покупке VPS - + Ip address cannot be empty Поле с IP-адресом не может быть пустым - + Login cannot be empty Поле с логином не может быть пустым - + Password/private key cannot be empty Поле с паролем/закрытым ключом не может быть пустым @@ -3087,47 +3087,52 @@ and will not be shared or disclosed to the Amnezia or any third parties Data sent: %1 Отправлено данных: %1 + + + Allowed IPs: %1 + + Creation date: Дата создания: - + Rename Переименовать - + Client name Имя клиента - + Save Сохранить - + Revoke Отозвать - + Revoke the config for a user - %1? Отозвать конфигурацию для пользователя - %1? - + The user will no longer be able to connect to your server. Пользователь больше не сможет подключаться к вашему серверу. - + Continue Продолжить - + Cancel Отменить @@ -4547,12 +4552,12 @@ This means that AmneziaWG keeps the fast performance of the original while addin main2 - + Private key passphrase Парольная фраза для закрытого ключа - + Save Сохранить diff --git a/client/translations/amneziavpn_uk_UA.ts b/client/translations/amneziavpn_uk_UA.ts index c7195119..73a731ec 100644 --- a/client/translations/amneziavpn_uk_UA.ts +++ b/client/translations/amneziavpn_uk_UA.ts @@ -290,18 +290,18 @@ Can't be disabled for current server Неможливо відкрити файл - - + + Invalid configuration file Недійсний файл конфігурації - + Scanned %1 of %2. Відскановано %1 з %2. - + In the imported configuration, potentially dangerous lines were found: У імпортованій конфігурації знайдено потенційно небезпечні рядки: @@ -431,28 +431,28 @@ Already installed containers were found on the server. All installed containers NotificationHandler - - + + AmneziaVPN AmneziaVPN - + VPN Connected VPN Підключено - + VPN Disconnected VPN Вимкнено - + AmneziaVPN notification Сповіщення AmneziaVPN - + Unsecured network detected: Знайдена не захищена мережа: @@ -2714,7 +2714,7 @@ It's okay as long as it's from someone you trust. Password / SSH private key - + Continue Продовжити @@ -2725,7 +2725,7 @@ and will not be shared or disclosed to the Amnezia or any third parties і не будуть передані чи розголошені Amnezia або будь-яким третім особам - + Enter the address in the format 255.255.255.255:88 Введіть адресу в форматі 255.255.255.255:88 @@ -2744,42 +2744,42 @@ and will not be shared or disclosed to the Amnezia or any third parties 255.255.255.255:22 - + SSH Username SSH Username - + Password or SSH private key Пароль або SSH ключ - + All data you enter will remain strictly confidential and will not be shared or disclosed to the Amnezia or any third parties Усі дані, які ви вводите, залишатимуться суворо конфіденційними та не будуть передані чи розголошені Amnezia або будь-яким третім особам - + How to run your VPN server Як запустити ваш VPN-сервер - + Where to get connection data, step-by-step instructions for buying a VPS Де отримати дані для підключення: покрокові інструкції з придбання VPS - + Ip address cannot be empty Поле IP address не може бути пустим - + Login cannot be empty Поле Login не може бути пустим - + Password/private key cannot be empty Поле Password/Private key не може бути пустим @@ -3182,47 +3182,52 @@ and will not be shared or disclosed to the Amnezia or any third parties Data sent: %1 Відправлено даних: %1 + + + Allowed IPs: %1 + + Creation date: Дата створення: - + Rename Перейменувати - + Client name Назва клієнта - + Save Зберегти - + Revoke Відкликати - + Revoke the config for a user - %1? Відкликати доступ для користувача - %1? - + The user will no longer be able to connect to your server. Користувач більше не зможе підключатись до вашого сервера - + Continue Продовжити - + Cancel Відмінити @@ -4624,12 +4629,12 @@ This means that AmneziaWG keeps the fast performance of the original while addin main2 - + Private key passphrase Пароль для особистого ключа - + Save Зберегти diff --git a/client/translations/amneziavpn_ur_PK.ts b/client/translations/amneziavpn_ur_PK.ts index cf445bfa..5faa241a 100644 --- a/client/translations/amneziavpn_ur_PK.ts +++ b/client/translations/amneziavpn_ur_PK.ts @@ -257,18 +257,18 @@ Can't be disabled for current server فائل کو کھولنے سے قاصر ہے - - + + Invalid configuration file غلط کنفیگریشن فائل - + Scanned %1 of %2. سکین%1 کی%2. - + In the imported configuration, potentially dangerous lines were found: @@ -399,30 +399,30 @@ Already installed containers were found on the server. All installed containers NotificationHandler - - + + AmneziaVPN The translation of "AmneziaVPN" in Urdu would be: امنیزیا وی پی ای - + VPN Connected وی پی این متصل ہوگیا - + VPN Disconnected وی پی این منقطع ہوگیا - + AmneziaVPN notification امنیزیا وی پی این کی اطلاعات - + Unsecured network detected: غیر محفوظ نیٹ ورک کا پتہ لگایا گیا ہے: @@ -2498,12 +2498,12 @@ Already installed containers were found on the server. All installed containers سرور آئی پی پتہ [:پورٹ] - + Continue براہ کرم جاری رکھیں - + All data you enter will remain strictly confidential and will not be shared or disclosed to the Amnezia or any third parties آپ جو ڈیٹا داخل کریں گے وہ بالکل خفیہ رہے گا اور نہ تو امنیزیا یا کسی تیسری شخصیت کے ساتھ اشتراک کیا جائے گا @@ -2513,42 +2513,42 @@ Already installed containers were found on the server. All installed containers - + SSH Username ایس ایس ایچ صارف نام - + Password or SSH private key پاس ورڈ یا SSH نجی کلید - + How to run your VPN server - + Where to get connection data, step-by-step instructions for buying a VPS - + Ip address cannot be empty آئی پی پتہ خالی نہیں ہو سکتا - + Enter the address in the format 255.255.255.255:88 ایڈریس درج کریں فارمیٹ 255.255.255.255:88 - + Login cannot be empty لاگ ان نام خالی نہیں ہو سکتا - + Password/private key cannot be empty پاس ورڈ یا نجی کلید خالی نہیں ہو سکتی @@ -2880,47 +2880,52 @@ Already installed containers were found on the server. All installed containers Data sent: %1 + + + Allowed IPs: %1 + + Creation date: تخلیق کی تاریخ: - + Rename نام تبدیل - + Client name کلائنٹ کا نام - + Save محفوظ - + Revoke واپس لین - + Revoke the config for a user - %1? کیا آپ مستعمل کے لئے کنفیگ کو واپس لینا چاہتے ہیں - %1؟ - + The user will no longer be able to connect to your server. صارف آپ کے سرور سے متصل ہونے کا اختیار نہیں رہے گا. - + Continue جاری رکھیں - + Cancel منسوخ @@ -4154,12 +4159,12 @@ While it offers a blend of security, stability, and speed, it's essential t main2 - + Private key passphrase نجی کلید پاس فریز - + Save محفوظ کریں diff --git a/client/translations/amneziavpn_zh_CN.ts b/client/translations/amneziavpn_zh_CN.ts index 39b6bee0..8015c249 100644 --- a/client/translations/amneziavpn_zh_CN.ts +++ b/client/translations/amneziavpn_zh_CN.ts @@ -262,18 +262,18 @@ Can't be disabled for current server - - + + Invalid configuration file - + Scanned %1 of %2. 扫描 %1 of %2. - + In the imported configuration, potentially dangerous lines were found: @@ -427,28 +427,28 @@ Already installed containers were found on the server. All installed containers NotificationHandler - - + + AmneziaVPN - + VPN Connected 已连接到VPN - + VPN Disconnected 已从VPN断开 - + AmneziaVPN notification AmneziaVPN 提示 - + Unsecured network detected: 发现不安全网络 @@ -2673,12 +2673,12 @@ It's okay as long as it's from someone you trust. 密码 或 私钥 - + Continue 继续 - + All data you enter will remain strictly confidential and will not be shared or disclosed to the Amnezia or any third parties 您输入的所有数据将严格保密,不会与 Amnezia 或任何第三方共享或披露 @@ -2694,42 +2694,42 @@ and will not be shared or disclosed to the Amnezia or any third parties - + SSH Username SSH 用户名 - + Password or SSH private key 密码或 SSH 私钥 - + How to run your VPN server - + Where to get connection data, step-by-step instructions for buying a VPS - + Ip address cannot be empty IP不能为空 - + Enter the address in the format 255.255.255.255:88 按照这种格式输入 255.255.255.255:88 - + Login cannot be empty 账号不能为空 - + Password/private key cannot be empty 密码或私钥不能为空 @@ -3086,47 +3086,52 @@ and will not be shared or disclosed to the Amnezia or any third parties Data sent: %1 + + + Allowed IPs: %1 + + Creation date: 创建日期: - + Rename 重新命名 - + Client name 客户名称 - + Save 保存 - + Revoke 撤销 - + Revoke the config for a user - %1? 撤销用户的配置- %1? - + The user will no longer be able to connect to your server. 该用户将无法再连接到您的服务器. - + Continue 继续 - + Cancel 取消 @@ -4610,12 +4615,12 @@ While it offers a blend of security, stability, and speed, it's essential t main2 - + Private key passphrase 私钥密码 - + Save 保存 diff --git a/client/ui/controllers/pageController.cpp b/client/ui/controllers/pageController.cpp index bbcc55a1..a00eba43 100644 --- a/client/ui/controllers/pageController.cpp +++ b/client/ui/controllers/pageController.cpp @@ -24,7 +24,7 @@ PageController::PageController(const QSharedPointer &serversModel, AndroidController::instance()->setNavigationBarColor(initialPageNavigationBarColor); #endif -#if defined Q_OS_MACX +#if defined Q_OS_MACX and !defined MACOS_NE connect(this, &PageController::raiseMainWindow, []() { setDockIconVisible(true); }); connect(this, &PageController::hideMainWindow, []() { setDockIconVisible(false); }); #endif @@ -114,7 +114,7 @@ void PageController::showOnStartup() } else { #if defined(Q_OS_WIN) || (defined(Q_OS_LINUX) && !defined(Q_OS_ANDROID)) emit hideMainWindow(); -#elif defined Q_OS_MACX +#elif defined Q_OS_MACX and !defined MACOS_NE setDockIconVisible(false); #endif } diff --git a/client/ui/notificationhandler.cpp b/client/ui/notificationhandler.cpp index 5efb45c4..ae588600 100644 --- a/client/ui/notificationhandler.cpp +++ b/client/ui/notificationhandler.cpp @@ -5,12 +5,15 @@ #include #include "notificationhandler.h" -#if defined(Q_OS_IOS) +#if defined(Q_OS_IOS) && !defined(MACOS_NE) # include "platforms/ios/iosnotificationhandler.h" +#elif defined(MACOS_NE) +# include "platforms/macos_ne/iosnotificationhandler.h" #else # include "systemtray_notificationhandler.h" #endif + // static NotificationHandler* NotificationHandler::create(QObject* parent) { #if defined(Q_OS_IOS) From 7da585fc273aee8bb59a5e1b95315e598ec6272f Mon Sep 17 00:00:00 2001 From: Macbook Date: Mon, 7 Oct 2024 21:42:45 +0700 Subject: [PATCH 05/38] update final code and cmake build file --- client/CMakeLists.txt | 53 ++++++++++++++++++++++++-------- client/cmake/osxtools.cmake | 2 +- client/protocols/vpnprotocol.cpp | 2 +- deploy/installer/config.cmake | 2 +- service/CMakeLists.txt | 2 +- 5 files changed, 45 insertions(+), 16 deletions(-) diff --git a/client/CMakeLists.txt b/client/CMakeLists.txt index e712fd4a..fdb1f085 100644 --- a/client/CMakeLists.txt +++ b/client/CMakeLists.txt @@ -35,7 +35,7 @@ if(IOS OR MACOS_NE) endif() #Macos Network Extension doesn't need Widgets -if(WIN32 OR (APPLE AND NOT IOS) OR (LINUX AND NOT ANDROID) OR (NOT DEFINED MACOS_NE)) +if(WIN32 OR (APPLE AND NOT IOS AND NOT MACOS_NE) OR (LINUX AND NOT ANDROID)) set(PACKAGES ${PACKAGES} Widgets) endif() @@ -53,14 +53,18 @@ if(IOS OR MACOS_NE) endif() # message("Client desktop build ", ${MACOS_NE}) #Macos Network Extension doesn't need Widgets -if(WIN32 OR (APPLE AND NOT IOS) OR (LINUX AND NOT ANDROID) OR (APPLE AND NOT DEFINED MACOS_NE)) + +if(WIN32 OR (APPLE AND NOT IOS AND NOT MACOS_NE) OR (LINUX AND NOT ANDROID)) + message("Run this block when MACOS_NE is not defined or set to FALSE") set(LIBS ${LIBS} Qt6::Widgets) endif() qt_standard_project_setup() qt_add_executable(${PROJECT} MANUAL_FINALIZATION) -if(WIN32 OR (APPLE AND NOT IOS) OR (LINUX AND NOT ANDROID) OR (APPLE AND NOT DEFINED MACOS_NE)) +# TODO error in there +if(WIN32 OR (APPLE AND NOT IOS AND NOT MACOS_NE) OR (LINUX AND NOT ANDROID)) + message("Run this block when MACOS_NE is not defined or set to FALSE") qt_add_repc_replicas(${PROJECT} ${CMAKE_CURRENT_LIST_DIR}/../ipc/ipc_interface.rep) qt_add_repc_replicas(${PROJECT} ${CMAKE_CURRENT_LIST_DIR}/../ipc/ipc_process_interface.rep) qt_add_repc_replicas(${PROJECT} ${CMAKE_CURRENT_LIST_DIR}/../ipc/ipc_process_tun2socks.rep) @@ -339,16 +343,12 @@ if(LINUX AND NOT ANDROID) set(LIBS ${LIBS} -static-libstdc++ -static-libgcc -ldl) link_directories(${CMAKE_CURRENT_LIST_DIR}/platforms/linux) endif() - -if(WIN32 OR (APPLE AND NOT IOS AND NOT MACOS_NE) OR (LINUX AND NOT ANDROID)) - message("Run this block when MACOS_NE is not defined or set to FALSE") -endif() - +message("In here") # Macos Network Extension doesn't need if(WIN32 OR (APPLE AND NOT IOS AND NOT MACOS_NE) OR (LINUX AND NOT ANDROID)) - message("Client desktop build") + message("-----> Client desktop build") add_compile_definitions(AMNEZIA_DESKTOP) - + message("-----> Add AMNEZIA_DESKTOP") set(HEADERS ${HEADERS} ${CMAKE_CURRENT_LIST_DIR}/core/ipcclient.h ${CMAKE_CURRENT_LIST_DIR}/core/privileged_process.h @@ -382,7 +382,7 @@ if(IOS) include(cmake/ios.cmake) include(cmake/ios-arch-fixup.cmake) elseif(APPLE AND NOT IOS AND NOT DEFINED MACOS_NE) - include(cmake/osxtools.cmake) + # include(cmake/osxtools.cmake) include(cmake/macos.cmake) elseif(APPLE AND NOT IOS AND MACOS_NE) include(cmake/osxtools.cmake) @@ -405,7 +405,7 @@ elseif(APPLE AND NOT IOS) set(DEPLOY_PLATFORM_PATH "macos") endif() -if(NOT IOS AND NOT ANDROID) +if(NOT IOS AND NOT ANDROID AND NOT MACOS_NE) add_custom_command( TARGET ${PROJECT} POST_BUILD COMMAND ${CMAKE_COMMAND} -E $,copy_directory,true> @@ -424,4 +424,33 @@ if(NOT IOS AND NOT ANDROID) endif() target_sources(${PROJECT} PRIVATE ${SOURCES} ${HEADERS} ${RESOURCES} ${QRC} ${I18NQRC}) +# Sao chép QtConcurrent.framework vào thư mục Frameworks +add_custom_command(TARGET ${PROJECT} POST_BUILD + COMMAND ${CMAKE_COMMAND} -E make_directory + "$/Contents/Frameworks" + + COMMAND ${CMAKE_COMMAND} -E copy_directory + "/Users/macbook/Qt/6.8.0/macos/lib/QtConcurrent.framework" + "$/Contents/Frameworks/QtConcurrent.framework" + + COMMENT "Copying QtConcurrent.framework to the bundle's Frameworks directory" +) + + +# Triển khai ứng dụng với macdeployqt và ký mã (nếu cần) +add_custom_command(TARGET ${PROJECT} POST_BUILD + COMMAND ${QT_BIN_DIR_DETECTED}/macdeployqt $ -appstore-compliant -qmldir=${CMAKE_CURRENT_SOURCE_DIR} +) + +# Nếu ở chế độ Release, ký mã gói ứng dụng +if(CMAKE_BUILD_TYPE STREQUAL "Release") + SET(SIGN_CMD codesign --deep --force --sign 'Apple Distribution: Privacy Technologies OU \(X7UJ388FXK\)' --timestamp --options runtime $) + message("Manual signing bundle...") + message(${SIGN_CMD}) + + add_custom_command(TARGET ${PROJECT} POST_BUILD + COMMAND ${SIGN_CMD} + ) +endif() + qt_finalize_target(${PROJECT}) diff --git a/client/cmake/osxtools.cmake b/client/cmake/osxtools.cmake index ff8c8a77..4564bfe0 100644 --- a/client/cmake/osxtools.cmake +++ b/client/cmake/osxtools.cmake @@ -76,7 +76,7 @@ function(osx_bundle_assetcatalog TARGET) ) ## Patch the asset catalog into the target bundle. - if(NOT IOS) + if(NOT IOS AND NOT MACOS_NE) set(XCASSETS_RESOURCE_DIR "Resources") endif() add_custom_command(TARGET ${TARGET} POST_BUILD diff --git a/client/protocols/vpnprotocol.cpp b/client/protocols/vpnprotocol.cpp index 3b2375cb..4b3edca5 100644 --- a/client/protocols/vpnprotocol.cpp +++ b/client/protocols/vpnprotocol.cpp @@ -4,7 +4,7 @@ #include "core/errorstrings.h" #include "vpnprotocol.h" -#if defined(Q_OS_WINDOWS) || defined(Q_OS_MACX) || (defined(Q_OS_LINUX) && !defined(Q_OS_ANDROID)) +#if defined(Q_OS_WINDOWS) || defined(Q_OS_MACX) and !defined MACOS_NE || (defined(Q_OS_LINUX) && !defined(Q_OS_ANDROID)) #include "openvpnovercloakprotocol.h" #include "openvpnprotocol.h" #include "shadowsocksvpnprotocol.h" diff --git a/deploy/installer/config.cmake b/deploy/installer/config.cmake index 13f09986..f3ab11a4 100644 --- a/deploy/installer/config.cmake +++ b/deploy/installer/config.cmake @@ -4,7 +4,7 @@ if(WIN32) ${CMAKE_CURRENT_LIST_DIR}/config/windows.xml.in ${CMAKE_BINARY_DIR}/installer/config/windows.xml ) -elseif(APPLE AND NOT IOS) +elseif(APPLE AND NOT IOS AND NOT MACOS_NE) configure_file( ${CMAKE_CURRENT_LIST_DIR}/config/macos.xml.in ${CMAKE_BINARY_DIR}/installer/config/macos.xml diff --git a/service/CMakeLists.txt b/service/CMakeLists.txt index f05dbb23..02a21631 100644 --- a/service/CMakeLists.txt +++ b/service/CMakeLists.txt @@ -6,6 +6,6 @@ project(${PROJECT}) set(CMAKE_CXX_STANDARD 20) set(CMAKE_CXX_STANDARD_REQUIRED ON) -if(NOT IOS AND NOT ANDROID) +if(NOT IOS AND NOT ANDROID AND NOT MACOS_NE) add_subdirectory(server) endif() From 022444ad63492d9c4b7f912112a333b0b0274699 Mon Sep 17 00:00:00 2001 From: Macbook Date: Tue, 8 Oct 2024 11:43:01 +0700 Subject: [PATCH 06/38] Removed OpenVPNAdapter.bk submodule --- client/3rd/OpenVPNAdapter.bk | 1 - 1 file changed, 1 deletion(-) delete mode 160000 client/3rd/OpenVPNAdapter.bk diff --git a/client/3rd/OpenVPNAdapter.bk b/client/3rd/OpenVPNAdapter.bk deleted file mode 160000 index 7c821a8d..00000000 --- a/client/3rd/OpenVPNAdapter.bk +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 7c821a8d5c1ad5ad94e0763b4f25a875b5a6fe1b From e2099b16822bba5cfb0460e1a5314c82a982cabe Mon Sep 17 00:00:00 2001 From: Macbook Date: Tue, 8 Oct 2024 21:33:36 +0700 Subject: [PATCH 07/38] clean source code --- client/cmake/macos_ne.cmake | 34 +- client/macos/networkextension/CMakeLists.txt | 29 +- .../ios/PacketTunnelProvider+OpenVPN.swift | 2 +- .../ios/PacketTunnelProvider+Xray.swift | 222 ++++- client/platforms/ios/QRCodeReaderBase.mm | 17 + client/platforms/ios/QtAppDelegate.h | 3 +- client/platforms/ios/QtAppDelegate.mm | 4 +- client/platforms/ios/ScreenProtection.swift | 11 + client/platforms/ios/ios_controller.mm | 18 +- client/platforms/ios/ios_controller_wrapper.h | 7 +- .../platforms/ios/ios_controller_wrapper.mm | 6 +- .../platforms/ios/iosnotificationhandler.mm | 85 ++ .../platforms/macos_ne/HevSocksTunnel.swift | 74 -- client/platforms/macos_ne/Log.swift | 122 --- client/platforms/macos_ne/LogController.swift | 33 - client/platforms/macos_ne/LogRecord.swift | 103 --- .../platforms/macos_ne/NELogController.swift | 22 - .../PacketTunnelProvider+OpenVPN.swift | 235 ----- .../PacketTunnelProvider+WireGuard.swift | 187 ---- .../macos_ne/PacketTunnelProvider+Xray.swift | 166 ---- .../macos_ne/PacketTunnelProvider.swift | 234 ----- .../platforms/macos_ne/QRCodeReaderBase.cpp | 14 - client/platforms/macos_ne/QRCodeReaderBase.h | 20 - client/platforms/macos_ne/QRCodeReaderBase.mm | 110 --- .../macos_ne/QtAppDelegate-C-Interface.h | 6 - client/platforms/macos_ne/QtAppDelegate.h | 7 - client/platforms/macos_ne/QtAppDelegate.mm | 61 -- .../platforms/macos_ne/ScreenProtection.swift | 10 - .../platforms/macos_ne/VPNCController.swift | 50 - client/platforms/macos_ne/WGConfig.swift | 94 -- .../macos_ne/WireGuard-Bridging-Header.h | 28 - client/platforms/macos_ne/ios_controller.h | 99 -- client/platforms/macos_ne/ios_controller.mm | 851 ------------------ .../macos_ne/ios_controller_wrapper.h | 25 - .../macos_ne/ios_controller_wrapper.mm | 45 - client/platforms/macos_ne/iosglue.mm | 244 ----- client/platforms/macos_ne/iosnetworkwatcher.h | 31 - .../platforms/macos_ne/iosnetworkwatcher.mm | 69 -- .../macos_ne/iosnotificationhandler.h | 28 - .../macos_ne/iosnotificationhandler.mm | 89 -- client/ui/notificationhandler.cpp | 6 +- client/ui/systemtray_notificationhandler.h | 2 +- 42 files changed, 373 insertions(+), 3130 deletions(-) delete mode 100644 client/platforms/macos_ne/HevSocksTunnel.swift delete mode 100644 client/platforms/macos_ne/Log.swift delete mode 100644 client/platforms/macos_ne/LogController.swift delete mode 100644 client/platforms/macos_ne/LogRecord.swift delete mode 100644 client/platforms/macos_ne/NELogController.swift delete mode 100644 client/platforms/macos_ne/PacketTunnelProvider+OpenVPN.swift delete mode 100644 client/platforms/macos_ne/PacketTunnelProvider+WireGuard.swift delete mode 100644 client/platforms/macos_ne/PacketTunnelProvider+Xray.swift delete mode 100644 client/platforms/macos_ne/PacketTunnelProvider.swift delete mode 100644 client/platforms/macos_ne/QRCodeReaderBase.cpp delete mode 100644 client/platforms/macos_ne/QRCodeReaderBase.h delete mode 100644 client/platforms/macos_ne/QRCodeReaderBase.mm delete mode 100644 client/platforms/macos_ne/QtAppDelegate-C-Interface.h delete mode 100644 client/platforms/macos_ne/QtAppDelegate.h delete mode 100644 client/platforms/macos_ne/QtAppDelegate.mm delete mode 100644 client/platforms/macos_ne/ScreenProtection.swift delete mode 100644 client/platforms/macos_ne/VPNCController.swift delete mode 100644 client/platforms/macos_ne/WGConfig.swift delete mode 100644 client/platforms/macos_ne/WireGuard-Bridging-Header.h delete mode 100644 client/platforms/macos_ne/ios_controller.h delete mode 100644 client/platforms/macos_ne/ios_controller.mm delete mode 100644 client/platforms/macos_ne/ios_controller_wrapper.h delete mode 100644 client/platforms/macos_ne/ios_controller_wrapper.mm delete mode 100644 client/platforms/macos_ne/iosglue.mm delete mode 100644 client/platforms/macos_ne/iosnetworkwatcher.h delete mode 100644 client/platforms/macos_ne/iosnetworkwatcher.mm delete mode 100644 client/platforms/macos_ne/iosnotificationhandler.h delete mode 100644 client/platforms/macos_ne/iosnotificationhandler.mm diff --git a/client/cmake/macos_ne.cmake b/client/cmake/macos_ne.cmake index e60c8e1b..a7776a0e 100644 --- a/client/cmake/macos_ne.cmake +++ b/client/cmake/macos_ne.cmake @@ -34,22 +34,22 @@ set(LIBS ${LIBS} set(HEADERS ${HEADERS} - ${CMAKE_CURRENT_SOURCE_DIR}/platforms/macos_ne/ios_controller.h - ${CMAKE_CURRENT_SOURCE_DIR}/platforms/macos_ne/ios_controller_wrapper.h - ${CMAKE_CURRENT_SOURCE_DIR}/platforms/macos_ne/iosnotificationhandler.h - ${CMAKE_CURRENT_SOURCE_DIR}/platforms/macos_ne/QtAppDelegate.h - ${CMAKE_CURRENT_SOURCE_DIR}/platforms/macos_ne/QtAppDelegate-C-Interface.h + ${CMAKE_CURRENT_SOURCE_DIR}/platforms/ios/ios_controller.h + ${CMAKE_CURRENT_SOURCE_DIR}/platforms/ios/ios_controller_wrapper.h + ${CMAKE_CURRENT_SOURCE_DIR}/platforms/ios/iosnotificationhandler.h + ${CMAKE_CURRENT_SOURCE_DIR}/platforms/ios/QtAppDelegate.h + ${CMAKE_CURRENT_SOURCE_DIR}/platforms/ios/QtAppDelegate-C-Interface.h ) -set_source_files_properties(${CMAKE_CURRENT_SOURCE_DIR}/platforms/macos_ne/ios_controller.h PROPERTIES OBJECTIVE_CPP_HEADER TRUE) +set_source_files_properties(${CMAKE_CURRENT_SOURCE_DIR}/platforms/ios/ios_controller.h PROPERTIES OBJECTIVE_CPP_HEADER TRUE) set(SOURCES ${SOURCES} - ${CMAKE_CURRENT_SOURCE_DIR}/platforms/macos_ne/ios_controller.mm - ${CMAKE_CURRENT_SOURCE_DIR}/platforms/macos_ne/ios_controller_wrapper.mm - ${CMAKE_CURRENT_SOURCE_DIR}/platforms/macos_ne/iosnotificationhandler.mm - ${CMAKE_CURRENT_SOURCE_DIR}/platforms/macos_ne/iosglue.mm - ${CMAKE_CURRENT_SOURCE_DIR}/platforms/macos_ne/QRCodeReaderBase.mm - ${CMAKE_CURRENT_SOURCE_DIR}/platforms/macos_ne/QtAppDelegate.mm + ${CMAKE_CURRENT_SOURCE_DIR}/platforms/ios/ios_controller.mm + ${CMAKE_CURRENT_SOURCE_DIR}/platforms/ios/ios_controller_wrapper.mm + ${CMAKE_CURRENT_SOURCE_DIR}/platforms/ios/iosnotificationhandler.mm + ${CMAKE_CURRENT_SOURCE_DIR}/platforms/ios/iosglue.mm + ${CMAKE_CURRENT_SOURCE_DIR}/platforms/ios/QRCodeReaderBase.mm + ${CMAKE_CURRENT_SOURCE_DIR}/platforms/ios/QtAppDelegate.mm ) set(ICON_FILE ${CMAKE_CURRENT_SOURCE_DIR}/images/app.icns) @@ -127,11 +127,11 @@ set(WG_APPLE_SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/3rd/amneziawg-apple/Sources) target_sources(${PROJECT} PRIVATE # ${CMAKE_CURRENT_SOURCE_DIR}/platforms/ios/iosvpnprotocol.swift ${WG_APPLE_SOURCE_DIR}/WireGuardKitC/x25519.c - ${CLIENT_ROOT_DIR}/platforms/macos_ne/LogController.swift - ${CLIENT_ROOT_DIR}/platforms/macos_ne/Log.swift - ${CLIENT_ROOT_DIR}/platforms/macos_ne/LogRecord.swift - ${CLIENT_ROOT_DIR}/platforms/macos_ne/ScreenProtection.swift - ${CLIENT_ROOT_DIR}/platforms/macos_ne/VPNCController.swift + ${CLIENT_ROOT_DIR}/platforms/ios/LogController.swift + ${CLIENT_ROOT_DIR}/platforms/ios/Log.swift + ${CLIENT_ROOT_DIR}/platforms/ios/LogRecord.swift + ${CLIENT_ROOT_DIR}/platforms/ios/ScreenProtection.swift + ${CLIENT_ROOT_DIR}/platforms/ios/VPNCController.swift ) target_sources(${PROJECT} PRIVATE diff --git a/client/macos/networkextension/CMakeLists.txt b/client/macos/networkextension/CMakeLists.txt index 1f63b0ab..d0d50b1b 100644 --- a/client/macos/networkextension/CMakeLists.txt +++ b/client/macos/networkextension/CMakeLists.txt @@ -9,6 +9,15 @@ configure_file( ${CMAKE_CURRENT_BINARY_DIR}/Info.plist ) +if(MACOS_NE) + message("MACOS_NE is ON") + add_definitions(-DQ_OS_IOS) + add_definitions(-DMACOS_NE) + message("Add macros for MacOS Network Extension") +else() + message("MACOS_NE is OFF") +endif() + set_target_properties(networkextension PROPERTIES XCODE_PRODUCT_TYPE com.apple.product-type.app-extension BUNDLE_EXTENSION appex @@ -152,16 +161,16 @@ target_sources(networkextension PRIVATE ${WG_APPLE_SOURCE_DIR}/WireGuardKit/Array+ConcurrentMap.swift ${WG_APPLE_SOURCE_DIR}/WireGuardKit/IPAddress+AddrInfo.swift ${WG_APPLE_SOURCE_DIR}/WireGuardKit/PrivateKey.swift - ${CLIENT_ROOT_DIR}/platforms/macos_ne/HevSocksTunnel.swift - ${CLIENT_ROOT_DIR}/platforms/macos_ne/NELogController.swift - ${CLIENT_ROOT_DIR}/platforms/macos_ne/Log.swift - ${CLIENT_ROOT_DIR}/platforms/macos_ne/LogRecord.swift - ${CLIENT_ROOT_DIR}/platforms/macos_ne/PacketTunnelProvider.swift - ${CLIENT_ROOT_DIR}/platforms/macos_ne/PacketTunnelProvider+WireGuard.swift - ${CLIENT_ROOT_DIR}/platforms/macos_ne/PacketTunnelProvider+OpenVPN.swift - ${CLIENT_ROOT_DIR}/platforms/macos_ne/PacketTunnelProvider+Xray.swift - ${CLIENT_ROOT_DIR}/platforms/macos_ne/WGConfig.swift - ${CLIENT_ROOT_DIR}/platforms/macos_ne/iosglue.mm + ${CLIENT_ROOT_DIR}/platforms/ios/HevSocksTunnel.swift + ${CLIENT_ROOT_DIR}/platforms/ios/NELogController.swift + ${CLIENT_ROOT_DIR}/platforms/ios/Log.swift + ${CLIENT_ROOT_DIR}/platforms/ios/LogRecord.swift + ${CLIENT_ROOT_DIR}/platforms/ios/PacketTunnelProvider.swift + ${CLIENT_ROOT_DIR}/platforms/ios/PacketTunnelProvider+WireGuard.swift + ${CLIENT_ROOT_DIR}/platforms/ios/PacketTunnelProvider+OpenVPN.swift + ${CLIENT_ROOT_DIR}/platforms/ios/PacketTunnelProvider+Xray.swift + ${CLIENT_ROOT_DIR}/platforms/ios/WGConfig.swift + ${CLIENT_ROOT_DIR}/platforms/ios/iosglue.mm ) target_sources(networkextension PRIVATE diff --git a/client/platforms/ios/PacketTunnelProvider+OpenVPN.swift b/client/platforms/ios/PacketTunnelProvider+OpenVPN.swift index 3e0a4a07..f1af7449 100644 --- a/client/platforms/ios/PacketTunnelProvider+OpenVPN.swift +++ b/client/platforms/ios/PacketTunnelProvider+OpenVPN.swift @@ -47,7 +47,7 @@ extension PacketTunnelProvider { let configuration = OpenVPNConfiguration() configuration.fileContent = ovpnConfiguration if str.contains("cloak") { - configuration.setPTCloak() +// configuration.setPTCloak() } let evaluation: OpenVPNConfigurationEvaluation? diff --git a/client/platforms/ios/PacketTunnelProvider+Xray.swift b/client/platforms/ios/PacketTunnelProvider+Xray.swift index 648b3613..ff80cb29 100644 --- a/client/platforms/ios/PacketTunnelProvider+Xray.swift +++ b/client/platforms/ios/PacketTunnelProvider+Xray.swift @@ -1,10 +1,196 @@ +//import Foundation +//import NetworkExtension +//import WireGuardKitGo +// +//enum XrayErrors: Error { +// case noXrayConfig +// case xrayConfigIsWrong +// case cantSaveXrayConfig +// case cantParseListenAndPort +// case cantSaveHevSocksConfig +//} +// +//extension Constants { +// static let cachesDirectory: URL = { +// if let cachesDirectoryURL = FileManager.default.urls(for: .cachesDirectory, +// in: .userDomainMask).first { +// return cachesDirectoryURL +// } else { +// fatalError("Unable to retrieve caches directory.") +// } +// }() +//} +// +//extension PacketTunnelProvider { +// func startXray(completionHandler: @escaping (Error?) -> Void) { +// +// // Xray configuration +// guard let protocolConfiguration = self.protocolConfiguration as? NETunnelProviderProtocol, +// let providerConfiguration = protocolConfiguration.providerConfiguration, +// let configData = providerConfiguration[Constants.xrayConfigKey] as? Data else { +// xrayLog(.error, message: "Can't get xray configuration") +// completionHandler(XrayErrors.noXrayConfig) +// return +// } +// +// // Tunnel settings +// let ipv6Enabled = false +// let hideVPNIcon = false +// +// let settings = NEPacketTunnelNetworkSettings(tunnelRemoteAddress: "254.1.1.1") +// settings.mtu = 9000 +// +// settings.ipv4Settings = { +// let settings = NEIPv4Settings(addresses: ["198.18.0.1"], subnetMasks: ["255.255.0.0"]) +// settings.includedRoutes = [NEIPv4Route.default()] +// return settings +// }() +// +// settings.ipv6Settings = { +// guard ipv6Enabled else { +// return nil +// } +// let settings = NEIPv6Settings(addresses: ["fd6e:a81b:704f:1211::1"], networkPrefixLengths: [64]) +// settings.includedRoutes = [NEIPv6Route.default()] +// if hideVPNIcon { +// settings.excludedRoutes = [NEIPv6Route(destinationAddress: "::", networkPrefixLength: 128)] +// } +// return settings +// }() +// +// do { +// let xrayConfig = try JSONDecoder().decode(XrayConfig.self, +// from: configData) +// +// var dnsArray = [String]() +// if let dns1 = xrayConfig.dns1 { +// dnsArray.append(dns1) +// } +// if let dns2 = xrayConfig.dns2 { +// dnsArray.append(dns2) +// } +// +// settings.dnsSettings = !dnsArray.isEmpty +// ? NEDNSSettings(servers: dnsArray) +// : NEDNSSettings(servers: ["1.1.1.1"]) +// +// let xrayConfigData = xrayConfig.config.data(using: .utf8) +// +// guard let xrayConfigData else { +// xrayLog(.error, message: "Can't encode config to data") +// completionHandler(XrayErrors.xrayConfigIsWrong) +// return +// } +// +// let jsonDict = try JSONSerialization.jsonObject(with: xrayConfigData, +// options: []) as? [String: Any] +// +// guard var jsonDict else { +// xrayLog(.error, message: "Can't parse address and port for hevSocks") +// completionHandler(XrayErrors.cantParseListenAndPort) +// return +// } +// +// let port = 10808 +// let address = "::1" +// +// if var inboundsArray = jsonDict["inbounds"] as? [[String: Any]], !inboundsArray.isEmpty { +// inboundsArray[0]["port"] = port +// inboundsArray[0]["listen"] = address +// jsonDict["inbounds"] = inboundsArray +// } +// +// let updatedData = try JSONSerialization.data(withJSONObject: jsonDict, options: []) +// +// setTunnelNetworkSettings(settings) { [weak self] error in +// if let error { +// completionHandler(error) +// return +// } +// +// // Launch xray +// self?.setupAndStartXray(configData: updatedData) { xrayError in +// if let xrayError { +// completionHandler(xrayError) +// return +// } +// +// // Launch hevSocks +// self?.setupAndRunTun2socks(configData: updatedData, +// address: address, +// port: port, +// completionHandler: completionHandler) +// } +// } +// } catch { +// completionHandler(error) +// return +// } +// } +// +// func stopXray(completionHandler: () -> Void) { +// Socks5Tunnel.quit() +// LibXrayStopXray() +// completionHandler() +// } +// +// private func setupAndStartXray(configData: Data, +// completionHandler: @escaping (Error?) -> Void) { +// let path = Constants.cachesDirectory.appendingPathComponent("config.json", isDirectory: false).path +// guard FileManager.default.createFile(atPath: path, contents: configData) else { +// xrayLog(.error, message: "Can't save xray configuration") +// completionHandler(XrayErrors.cantSaveXrayConfig) +// return +// } +// +// LibXrayRunXray(nil, +// path, +// Int64.max) +// +// completionHandler(nil) +// xrayLog(.info, message: "Xray started") +// } +// +// private func setupAndRunTun2socks(configData: Data, +// address: String, +// port: Int, +// completionHandler: @escaping (Error?) -> Void) { +// let config = """ +// tunnel: +// mtu: 9000 +// socks5: +// port: \(port) +// address: \(address) +// udp: 'udp' +// misc: +// task-stack-size: 20480 +// connect-timeout: 5000 +// read-write-timeout: 60000 +// log-file: stderr +// log-level: error +// limit-nofile: 65535 +// """ +// +// let configurationFilePath = Constants.cachesDirectory.appendingPathComponent("config.yml", isDirectory: false).path +// guard FileManager.default.createFile(atPath: configurationFilePath, contents: config.data(using: .utf8)!) else { +// xrayLog(.info, message: "Cant save hevSocks configuration") +// completionHandler(XrayErrors.cantSaveHevSocksConfig) +// return +// } +// +// DispatchQueue.global().async { +// xrayLog(.info, message: "Hev socks started") +// completionHandler(nil) +// Socks5Tunnel.run(withConfig: configurationFilePath) +// } +// } +//} import Foundation import NetworkExtension import WireGuardKitGo enum XrayErrors: Error { case noXrayConfig - case xrayConfigIsWrong case cantSaveXrayConfig case cantParseListenAndPort case cantSaveHevSocksConfig @@ -27,14 +213,14 @@ extension PacketTunnelProvider { // Xray configuration guard let protocolConfiguration = self.protocolConfiguration as? NETunnelProviderProtocol, let providerConfiguration = protocolConfiguration.providerConfiguration, - let configData = providerConfiguration[Constants.xrayConfigKey] as? Data else { + let xrayConfigData = providerConfiguration[Constants.xrayConfigKey] as? Data else { xrayLog(.error, message: "Can't get xray configuration") completionHandler(XrayErrors.noXrayConfig) return } // Tunnel settings - let ipv6Enabled = false + let ipv6Enabled = true let hideVPNIcon = false let settings = NEPacketTunnelNetworkSettings(tunnelRemoteAddress: "254.1.1.1") @@ -58,29 +244,12 @@ extension PacketTunnelProvider { return settings }() + let dns = ["8.8.4.4","1.1.1.1"] + settings.dnsSettings = NEDNSSettings(servers: dns) + do { - let xrayConfig = try JSONDecoder().decode(XrayConfig.self, - from: configData) - - var dnsArray = [String]() - if let dns1 = xrayConfig.dns1 { - dnsArray.append(dns1) - } - if let dns2 = xrayConfig.dns2 { - dnsArray.append(dns2) - } - - settings.dnsSettings = !dnsArray.isEmpty - ? NEDNSSettings(servers: dnsArray) - : NEDNSSettings(servers: ["1.1.1.1"]) - - let xrayConfigData = xrayConfig.config.data(using: .utf8) - - guard let xrayConfigData else { - xrayLog(.error, message: "Can't encode config to data") - completionHandler(XrayErrors.xrayConfigIsWrong) - return - } + let port = 10808 + let address = "::1" let jsonDict = try JSONSerialization.jsonObject(with: xrayConfigData, options: []) as? [String: Any] @@ -91,9 +260,6 @@ extension PacketTunnelProvider { return } - let port = 10808 - let address = "::1" - if var inboundsArray = jsonDict["inbounds"] as? [[String: Any]], !inboundsArray.isEmpty { inboundsArray[0]["port"] = port inboundsArray[0]["listen"] = address diff --git a/client/platforms/ios/QRCodeReaderBase.mm b/client/platforms/ios/QRCodeReaderBase.mm index af879e2f..963c35a8 100644 --- a/client/platforms/ios/QRCodeReaderBase.mm +++ b/client/platforms/ios/QRCodeReaderBase.mm @@ -1,3 +1,4 @@ +#if !MACOS_NE #include "QRCodeReaderBase.h" #import @@ -108,3 +109,19 @@ void QRCodeReader::startReading() { void QRCodeReader::stopReading() { [m_qrCodeReader stopReading]; } +#else +#include "QRCodeReaderBase.h" + +QRCodeReader::QRCodeReader() +{ + +} + +QRect QRCodeReader::cameraSize() { + return QRect(); +} + +void QRCodeReader::startReading() {} +void QRCodeReader::stopReading() {} +void QRCodeReader::setCameraSize(QRect) {} +#endif diff --git a/client/platforms/ios/QtAppDelegate.h b/client/platforms/ios/QtAppDelegate.h index c2c1d2d3..1668f4c3 100644 --- a/client/platforms/ios/QtAppDelegate.h +++ b/client/platforms/ios/QtAppDelegate.h @@ -1,5 +1,6 @@ +#if !MACOS_NE #import - +#endif @interface QIOSApplicationDelegate @end diff --git a/client/platforms/ios/QtAppDelegate.mm b/client/platforms/ios/QtAppDelegate.mm index bd7ad6b1..64ee9425 100644 --- a/client/platforms/ios/QtAppDelegate.mm +++ b/client/platforms/ios/QtAppDelegate.mm @@ -5,7 +5,7 @@ @implementation QIOSApplicationDelegate (AmneziaVPNDelegate) - +#if !MACOS_NE - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { [application setMinimumBackgroundFetchInterval: UIApplicationBackgroundFetchIntervalMinimum]; @@ -57,5 +57,5 @@ } return NO; } - +#endif @end diff --git a/client/platforms/ios/ScreenProtection.swift b/client/platforms/ios/ScreenProtection.swift index 1355dc13..a2b5d7a3 100644 --- a/client/platforms/ios/ScreenProtection.swift +++ b/client/platforms/ios/ScreenProtection.swift @@ -1,3 +1,13 @@ +#if MACOS_NE +public func toggleScreenshots(_ isEnabled: Bool) { + +} + +class ScreenProtection { + + +} +#else import UIKit public func toggleScreenshots(_ isEnabled: Bool) { @@ -85,3 +95,4 @@ struct ProtectionPair { textField.removeFromSuperview() } } +#endif diff --git a/client/platforms/ios/ios_controller.mm b/client/platforms/ios/ios_controller.mm index 85fb50b7..d66c5239 100644 --- a/client/platforms/ios/ios_controller.mm +++ b/client/platforms/ios/ios_controller.mm @@ -27,6 +27,7 @@ const char* MessageKey::isOnDemand = "is-on-demand"; const char* MessageKey::SplitTunnelType = "SplitTunnelType"; const char* MessageKey::SplitTunnelSites = "SplitTunnelSites"; +#if !MACOS_NE static UIViewController* getViewController() { NSArray *windows = [[UIApplication sharedApplication]windows]; for (UIWindow *window in windows) { @@ -36,6 +37,7 @@ static UIViewController* getViewController() { } return nil; } +#endif Vpn::ConnectionState iosStatusToState(NEVPNStatus status) { switch (status) { @@ -789,14 +791,14 @@ bool IosController::shareText(const QStringList& filesToSend) { NSURL *logFileUrl = [[NSURL alloc] initFileURLWithPath:filesToSend[i].toNSString()]; [sharingItems addObject:logFileUrl]; } - +#if !MACOS_NE UIViewController *qtController = getViewController(); if (!qtController) return; UIActivityViewController *activityController = [[UIActivityViewController alloc] initWithActivityItems:sharingItems applicationActivities:nil]; - +#endif __block bool isAccepted = false; - +#if !MACOS_NE [activityController setCompletionWithItemsHandler:^(NSString *activityType, BOOL completed, NSArray *returnedItems, NSError *activityError) { isAccepted = completed; emit finished(); @@ -808,7 +810,7 @@ bool IosController::shareText(const QStringList& filesToSend) { popController.sourceView = qtController.view; popController.sourceRect = CGRectMake(100, 100, 100, 100); } - +#endif QEventLoop wait; QObject::connect(this, &IosController::finished, &wait, &QEventLoop::quit); wait.exec(); @@ -817,6 +819,7 @@ bool IosController::shareText(const QStringList& filesToSend) { } QString IosController::openFile() { +#if !MACOS_NE UIDocumentPickerViewController *documentPicker = [[UIDocumentPickerViewController alloc] initWithDocumentTypes:@[@"public.item"] inMode:UIDocumentPickerModeOpen]; DocumentPickerDelegate *documentPickerDelegate = [[DocumentPickerDelegate alloc] init]; @@ -826,9 +829,9 @@ QString IosController::openFile() { if (!qtController) return; [qtController presentViewController:documentPicker animated:YES completion:nil]; - +#endif __block QString filePath; - +#if !MACOS_NE documentPickerDelegate.documentPickerClosedCallback = ^(NSString *path) { if (path) { filePath = QString::fromUtf8(path.UTF8String); @@ -837,7 +840,7 @@ QString IosController::openFile() { } emit finished(); }; - +#endif QEventLoop wait; QObject::connect(this, &IosController::finished, &wait, &QEventLoop::quit); wait.exec(); @@ -863,3 +866,4 @@ void IosController::requestInetAccess() { }]; [task resume]; } + diff --git a/client/platforms/ios/ios_controller_wrapper.h b/client/platforms/ios/ios_controller_wrapper.h index f0333d77..ab325154 100644 --- a/client/platforms/ios/ios_controller_wrapper.h +++ b/client/platforms/ios/ios_controller_wrapper.h @@ -1,7 +1,11 @@ #import #import #import + +#if !MACOS_NE #include +#endif + #include class IosController; @@ -17,9 +21,10 @@ class IosController; @end typedef void (^DocumentPickerClosedCallback)(NSString *path); - +#if !MACOS_NE @interface DocumentPickerDelegate : NSObject @property (nonatomic, copy) DocumentPickerClosedCallback documentPickerClosedCallback; @end +#endif diff --git a/client/platforms/ios/ios_controller_wrapper.mm b/client/platforms/ios/ios_controller_wrapper.mm index 1f8c938f..38eb2d22 100644 --- a/client/platforms/ios/ios_controller_wrapper.mm +++ b/client/platforms/ios/ios_controller_wrapper.mm @@ -26,7 +26,8 @@ @end -@implementation DocumentPickerDelegate +#if !MACOS_NE +@implementation DocumentPickerDelegate - (void)documentPicker:(UIDocumentPickerViewController *)controller didPickDocumentsAtURLs:(NSArray *)urls { for (NSURL *url in urls) { @@ -42,4 +43,5 @@ } } -@end \ No newline at end of file +@end +#endif diff --git a/client/platforms/ios/iosnotificationhandler.mm b/client/platforms/ios/iosnotificationhandler.mm index efa48385..773c6297 100644 --- a/client/platforms/ios/iosnotificationhandler.mm +++ b/client/platforms/ios/iosnotificationhandler.mm @@ -6,6 +6,8 @@ #import #import + +#if !MACOS_NE #import @interface IOSNotificationDelegate @@ -87,3 +89,86 @@ void IOSNotificationHandler::notify(NotificationHandler::Message type, const QSt } }]; } +#else + +// Removed the UIResponder and UIApplicationDelegate references as these are not available in macOS +@interface IOSNotificationDelegate + : NSObject { + IOSNotificationHandler* m_iosNotificationHandler; +} +@end + +@implementation IOSNotificationDelegate + +- (id)initWithObject:(IOSNotificationHandler*)notification { + self = [super init]; // Removed `super init` as it refers to UIResponder, which is iOS specific + if (self) { + m_iosNotificationHandler = notification; + } + return self; +} + +- (void)userNotificationCenter:(UNUserNotificationCenter*)center + willPresentNotification:(UNNotification*)notification + withCompletionHandler: + (void (^)(UNNotificationPresentationOptions options))completionHandler { + Q_UNUSED(center) + completionHandler(UNNotificationPresentationOptionList | UNNotificationPresentationOptionBanner); +} + +- (void)userNotificationCenter:(UNUserNotificationCenter*)center + didReceiveNotificationResponse:(UNNotificationResponse*)response + withCompletionHandler:(void (^)())completionHandler { + Q_UNUSED(center) + Q_UNUSED(response) + completionHandler(); +} +@end + +IOSNotificationHandler::IOSNotificationHandler(QObject* parent) : NotificationHandler(parent) { + + UNUserNotificationCenter* center = [UNUserNotificationCenter currentNotificationCenter]; + [center requestAuthorizationWithOptions:(UNAuthorizationOptionSound | UNAuthorizationOptionAlert | + UNAuthorizationOptionBadge) + completionHandler:^(BOOL granted, NSError* _Nullable error) { + Q_UNUSED(granted); + if (!error) { + m_delegate = [[IOSNotificationDelegate alloc] initWithObject:this]; + } + }]; +} + +IOSNotificationHandler::~IOSNotificationHandler() { } + +void IOSNotificationHandler::notify(NotificationHandler::Message type, const QString& title, + const QString& message, int timerMsec) { + Q_UNUSED(type); + + if (!m_delegate) { + return; + } + + UNMutableNotificationContent* content = [[UNMutableNotificationContent alloc] init]; + content.title = title.toNSString(); + content.body = message.toNSString(); + content.sound = [UNNotificationSound defaultSound]; + + int timerSec = timerMsec / 1000; + UNTimeIntervalNotificationTrigger* trigger = + [UNTimeIntervalNotificationTrigger triggerWithTimeInterval:timerSec repeats:NO]; + + UNNotificationRequest* request = [UNNotificationRequest requestWithIdentifier:@"amneziavpn" + content:content + trigger:trigger]; + + UNUserNotificationCenter* center = [UNUserNotificationCenter currentNotificationCenter]; + center.delegate = (id)m_delegate; + + [center addNotificationRequest:request + withCompletionHandler:^(NSError* _Nullable error) { + if (error) { + NSLog(@"Local Notification failed"); + } + }]; +} +#endif diff --git a/client/platforms/macos_ne/HevSocksTunnel.swift b/client/platforms/macos_ne/HevSocksTunnel.swift deleted file mode 100644 index 1b914218..00000000 --- a/client/platforms/macos_ne/HevSocksTunnel.swift +++ /dev/null @@ -1,74 +0,0 @@ -import Darwin -import SystemConfiguration - -public enum Socks5Tunnel { - - private static var tunnelFileDescriptor: Int32? { - var ctlInfo = ctl_info() - withUnsafeMutablePointer(to: &ctlInfo.ctl_name) { - $0.withMemoryRebound(to: CChar.self, capacity: MemoryLayout.size(ofValue: $0.pointee)) { - _ = strcpy($0, "com.apple.net.utun_control") // strcpy comes from Darwin - } - } - for fd: Int32 in 0...1024 { - var addr = sockaddr_ctl() - var ret: Int32 = -1 - var len = socklen_t(MemoryLayout.size(ofValue: addr)) // socklen_t comes from Darwin - withUnsafeMutablePointer(to: &addr) { - $0.withMemoryRebound(to: sockaddr.self, capacity: 1) { // sockaddr from Darwin - ret = getpeername(fd, $0, &len) // getpeername from Darwin - } - } - if ret != 0 || addr.sc_family != AF_SYSTEM { // AF_SYSTEM from Darwin - continue - } - if ctlInfo.ctl_id == 0 { - ret = ioctl(fd, CTLIOCGINFO, &ctlInfo) // ioctl from Darwin - if ret != 0 { - continue - } - } - if addr.sc_id == ctlInfo.ctl_id { - return fd - } - } - return nil - } - - private static var interfaceName: String? { - guard let tunnelFileDescriptor = self.tunnelFileDescriptor else { - return nil - } - var buffer = [UInt8](repeating: 0, count: Int(IFNAMSIZ)) // IFNAMSIZ from Darwin - return buffer.withUnsafeMutableBufferPointer { mutableBufferPointer in - guard let baseAddress = mutableBufferPointer.baseAddress else { - return nil - } - var ifnameSize = socklen_t(IFNAMSIZ) // socklen_t and IFNAMSIZ from Darwin - let result = getsockopt( - tunnelFileDescriptor, - 2 /* SYSPROTO_CONTROL */, - 2 /* UTUN_OPT_IFNAME */, - baseAddress, - &ifnameSize - ) - if result == 0 { - return String(cString: baseAddress) - } else { - return nil - } - } - } - - @discardableResult - public static func run(withConfig filePath: String) -> Int32 { - guard let fileDescriptor = self.tunnelFileDescriptor else { - fatalError("Get tunnel file descriptor failed.") - } - return hev_socks5_tunnel_main(filePath.cString(using: .utf8), fileDescriptor) - } - - public static func quit() { - hev_socks5_tunnel_quit() - } -} diff --git a/client/platforms/macos_ne/Log.swift b/client/platforms/macos_ne/Log.swift deleted file mode 100644 index d2222f9d..00000000 --- a/client/platforms/macos_ne/Log.swift +++ /dev/null @@ -1,122 +0,0 @@ -import Foundation -import os.log - -struct Log { - static let osLog = Logger() - - private static let IsLoggingEnabledKey = "IsLoggingEnabled" - static var isLoggingEnabled: Bool { - get { - sharedUserDefaults.bool(forKey: IsLoggingEnabledKey) - } - set { - sharedUserDefaults.setValue(newValue, forKey: IsLoggingEnabledKey) - } - } - - private static let appGroupID = "group.org.amnezia.AmneziaVPN" - - static let appLogURL = { - let sharedContainerURL = FileManager.default.containerURL(forSecurityApplicationGroupIdentifier: appGroupID)! - return sharedContainerURL.appendingPathComponent("app.log", isDirectory: false) - }() - - static let neLogURL = { - let sharedContainerURL = FileManager.default.containerURL(forSecurityApplicationGroupIdentifier: appGroupID)! - return sharedContainerURL.appendingPathComponent("ne.log", isDirectory: false) - }() - - private static var sharedUserDefaults = { - UserDefaults(suiteName: appGroupID)! - }() - - static let dateFormatter: DateFormatter = { - let dateFormatter = DateFormatter() - dateFormatter.dateFormat = "yyyy-MM-dd HH:mm:ss" - return dateFormatter - }() - - var records = [Record]() - - var lastRecordDate = Date.distantPast - - init() { - self.records = [] - } - - init(_ str: String) { - records = str.split(whereSeparator: \.isNewline) - .map { - if let record = Record(String($0)) { - lastRecordDate = record.date - return record - } else { - return Record(date: lastRecordDate, level: .error, message: "LOG: \($0)") - } - } - } - - init?(at url: URL) { - if !FileManager.default.fileExists(atPath: url.path) { - guard (try? "".data(using: .utf8)?.write(to: url)) != nil else { return nil } - } - - guard let fileHandle = try? FileHandle(forUpdating: url) else { return nil } - - defer { fileHandle.closeFile() } - - guard - let data = try? fileHandle.readToEnd(), - let str = String(data: data, encoding: .utf8) else { - return nil - } - - self.init(str) - } - - static func log(_ type: OSLogType, title: String = "", message: String, url: URL = neLogURL) { - NSLog("\(title) \(message)") - - guard isLoggingEnabled else { return } - - osLog.log(level: type, "\(title) \(message)") - - let date = Date() - let level = Record.Level(from: type) - let messages = message.split(whereSeparator: \.isNewline) - - for index in 0.. std.string { - let qtLog = Log(String(describing: qtString)) - var log = qtLog - - if let appLog = Log(at: Log.appLogURL) { - appLog.records.forEach { - log.records.append($0) - } - } - - if let neLog = Log(at: Log.neLogURL) { - neLog.records.forEach { - log.records.append($0) - } - } - - log.records.sort { - $0.date < $1.date - } - - return std.string(log.description) -} - -public func swiftDeleteLog() { - Log.clear(at: Log.appLogURL) - Log.clear(at: Log.neLogURL) -} - -public func toggleLogging(_ isEnabled: Bool) { - Log.isLoggingEnabled = isEnabled -} diff --git a/client/platforms/macos_ne/LogRecord.swift b/client/platforms/macos_ne/LogRecord.swift deleted file mode 100644 index 658d10cf..00000000 --- a/client/platforms/macos_ne/LogRecord.swift +++ /dev/null @@ -1,103 +0,0 @@ -import Foundation -import os.log - -extension Log { - struct Record { - let date: Date - let level: Level - let message: String - - init?(_ str: String) { - let dateStr = String(str.prefix(19)) - guard let date = Log.dateFormatter.date(from: dateStr) else { return nil } - - let str = str.dropFirst(20) - - guard let endIndex = str.firstIndex(of: " ") else { return nil } - let levelStr = String(str[str.startIndex.. Void) { - guard let protocolConfiguration = self.protocolConfiguration as? NETunnelProviderProtocol, - let providerConfiguration = protocolConfiguration.providerConfiguration, - let openVPNConfigData = providerConfiguration[Constants.ovpnConfigKey] as? Data else { - ovpnLog(.error, message: "Can't start") - return - } - - do { - let openVPNConfig = try JSONDecoder().decode(OpenVPNConfig.self, from: openVPNConfigData) - ovpnLog(.info, title: "config: ", message: openVPNConfig.str) - let ovpnConfiguration = Data(openVPNConfig.config.utf8) - setupAndlaunchOpenVPN(withConfig: ovpnConfiguration, completionHandler: completionHandler) - } catch { - ovpnLog(.error, message: "Can't parse config: \(error.localizedDescription)") - - if let underlyingError = (error as NSError).userInfo[NSUnderlyingErrorKey] as? NSError { - ovpnLog(.error, message: "Can't parse config: \(underlyingError.localizedDescription)") - } - - return - } - } - - private func setupAndlaunchOpenVPN(withConfig ovpnConfiguration: Data, - withShadowSocks viaSS: Bool = false, - completionHandler: @escaping (Error?) -> Void) { - ovpnLog(.info, message: "Setup and launch") - - let str = String(decoding: ovpnConfiguration, as: UTF8.self) - - let configuration = OpenVPNConfiguration() - configuration.fileContent = ovpnConfiguration - if str.contains("cloak") { - // TODO disable cloak -// configuration.setPTCloak() - } - - let evaluation: OpenVPNConfigurationEvaluation? - do { - ovpnAdapter = OpenVPNAdapter() - ovpnAdapter?.delegate = self - evaluation = try ovpnAdapter?.apply(configuration: configuration) - - } catch { - completionHandler(error) - return - } - - if evaluation?.autologin == false { - ovpnLog(.info, message: "Implement login with user credentials") - } - - vpnReachability.startTracking { [weak self] status in - guard status == .reachableViaWiFi else { return } - self?.ovpnAdapter?.reconnect(afterTimeInterval: 5) - } - - startHandler = completionHandler - ovpnAdapter?.connect(using: packetFlow) - } - - func handleOpenVPNStatusMessage(_ messageData: Data, completionHandler: ((Data?) -> Void)? = nil) { - guard let completionHandler = completionHandler else { return } - let bytesin = ovpnAdapter?.transportStatistics.bytesIn - let bytesout = ovpnAdapter?.transportStatistics.bytesOut - - guard let bytesin, let bytesout else { - completionHandler(nil) - return - } - - let response: [String: Any] = [ - "rx_bytes": bytesin, - "tx_bytes": bytesout - ] - - completionHandler(try? JSONSerialization.data(withJSONObject: response, options: [])) - } - - func stopOpenVPN(with reason: NEProviderStopReason, completionHandler: @escaping () -> Void) { - ovpnLog(.info, message: "Stopping tunnel: reason: \(reason.description)") - - stopHandler = completionHandler - if vpnReachability.isTracking { - vpnReachability.stopTracking() - } - ovpnAdapter?.disconnect() - } -} - -extension PacketTunnelProvider: OpenVPNAdapterDelegate { - // OpenVPNAdapter calls this delegate method to configure a VPN tunnel. - // `completionHandler` callback requires an object conforming to `OpenVPNAdapterPacketFlow` - // protocol if the tunnel is configured without errors. Otherwise send nil. - // `OpenVPNAdapterPacketFlow` method signatures are similar to `NEPacketTunnelFlow` so - // you can just extend that class to adopt `OpenVPNAdapterPacketFlow` protocol and - // send `self.packetFlow` to `completionHandler` callback. - func openVPNAdapter( - _ openVPNAdapter: OpenVPNAdapter, - configureTunnelWithNetworkSettings networkSettings: NEPacketTunnelNetworkSettings?, - completionHandler: @escaping (Error?) -> Void - ) { - // In order to direct all DNS queries first to the VPN DNS servers before the primary DNS servers - // send empty string to NEDNSSettings.matchDomains - networkSettings?.dnsSettings?.matchDomains = [""] - - if splitTunnelType == 1 { - var ipv4IncludedRoutes = [NEIPv4Route]() - - guard let splitTunnelSites else { - completionHandler(NSError(domain: "Split tunnel sited not setted up", code: 0)) - return - } - - for allowedIPString in splitTunnelSites { - if let allowedIP = IPAddressRange(from: allowedIPString) { - ipv4IncludedRoutes.append(NEIPv4Route( - destinationAddress: "\(allowedIP.address)", - subnetMask: "\(allowedIP.subnetMask())")) - } - } - - networkSettings?.ipv4Settings?.includedRoutes = ipv4IncludedRoutes - } else { - if splitTunnelType == 2 { - var ipv4ExcludedRoutes = [NEIPv4Route]() - var ipv4IncludedRoutes = [NEIPv4Route]() - var ipv6IncludedRoutes = [NEIPv6Route]() - - guard let splitTunnelSites else { - completionHandler(NSError(domain: "Split tunnel sited not setted up", code: 0)) - return - } - - for excludeIPString in splitTunnelSites { - if let excludeIP = IPAddressRange(from: excludeIPString) { - ipv4ExcludedRoutes.append(NEIPv4Route( - destinationAddress: "\(excludeIP.address)", - subnetMask: "\(excludeIP.subnetMask())")) - } - } - - if let allIPv4 = IPAddressRange(from: "0.0.0.0/0") { - ipv4IncludedRoutes.append(NEIPv4Route( - destinationAddress: "\(allIPv4.address)", - subnetMask: "\(allIPv4.subnetMask())")) - } - if let allIPv6 = IPAddressRange(from: "::/0") { - ipv6IncludedRoutes.append(NEIPv6Route( - destinationAddress: "\(allIPv6.address)", - networkPrefixLength: NSNumber(value: allIPv6.networkPrefixLength))) - } - networkSettings?.ipv4Settings?.includedRoutes = ipv4IncludedRoutes - networkSettings?.ipv6Settings?.includedRoutes = ipv6IncludedRoutes - networkSettings?.ipv4Settings?.excludedRoutes = ipv4ExcludedRoutes - } - } - - // Set the network settings for the current tunneling session. - setTunnelNetworkSettings(networkSettings, completionHandler: completionHandler) - } - - // Process events returned by the OpenVPN library - func openVPNAdapter( - _ openVPNAdapter: OpenVPNAdapter, - handleEvent event: OpenVPNAdapterEvent, - message: String?) { - switch event { - case .connected: - if reasserting { - reasserting = false - } - - guard let startHandler = startHandler else { return } - - startHandler(nil) - self.startHandler = nil - case .disconnected: - guard let stopHandler = stopHandler else { return } - - if vpnReachability.isTracking { - vpnReachability.stopTracking() - } - - stopHandler() - self.stopHandler = nil - case .reconnecting: - reasserting = true - default: - break - } - } - - // Handle errors thrown by the OpenVPN library - func openVPNAdapter(_ openVPNAdapter: OpenVPNAdapter, handleError error: Error) { - // Handle only fatal errors - guard let fatal = (error as NSError).userInfo[OpenVPNAdapterErrorFatalKey] as? Bool, - fatal == true else { return } - - if vpnReachability.isTracking { - vpnReachability.stopTracking() - } - - if let startHandler { - startHandler(error) - self.startHandler = nil - } else { - cancelTunnelWithError(error) - } - } - - // Use this method to process any log message returned by OpenVPN library. - func openVPNAdapter(_ openVPNAdapter: OpenVPNAdapter, handleLogMessage logMessage: String) { - // Handle log messages - ovpnLog(.info, message: logMessage) - } -} - -extension NEPacketTunnelFlow: OpenVPNAdapterPacketFlow {} diff --git a/client/platforms/macos_ne/PacketTunnelProvider+WireGuard.swift b/client/platforms/macos_ne/PacketTunnelProvider+WireGuard.swift deleted file mode 100644 index 18200c7f..00000000 --- a/client/platforms/macos_ne/PacketTunnelProvider+WireGuard.swift +++ /dev/null @@ -1,187 +0,0 @@ -import Foundation -import NetworkExtension - -extension PacketTunnelProvider { - func startWireguard(activationAttemptId: String?, - errorNotifier: ErrorNotifier, - completionHandler: @escaping (Error?) -> Void) { - guard let protocolConfiguration = self.protocolConfiguration as? NETunnelProviderProtocol, - let providerConfiguration = protocolConfiguration.providerConfiguration, - let wgConfigData: Data = providerConfiguration[Constants.wireGuardConfigKey] as? Data else { - wg_log(.error, message: "Can't start, config missing") - completionHandler(nil) - return - } - - do { - let wgConfig = try JSONDecoder().decode(WGConfig.self, from: wgConfigData) - let wgConfigStr = wgConfig.str - wg_log(.info, title: "config: ", message: wgConfig.redux) - - let tunnelConfiguration = try TunnelConfiguration(fromWgQuickConfig: wgConfigStr) - - if tunnelConfiguration.peers.first!.allowedIPs - .map({ $0.stringRepresentation }) - .joined(separator: ", ") == "0.0.0.0/0, ::/0" { - if wgConfig.splitTunnelType == 1 { - for index in tunnelConfiguration.peers.indices { - tunnelConfiguration.peers[index].allowedIPs.removeAll() - var allowedIPs = [IPAddressRange]() - - for allowedIPString in wgConfig.splitTunnelSites { - if let allowedIP = IPAddressRange(from: allowedIPString) { - allowedIPs.append(allowedIP) - } - } - - tunnelConfiguration.peers[index].allowedIPs = allowedIPs - } - } else if wgConfig.splitTunnelType == 2 { - for index in tunnelConfiguration.peers.indices { - var excludeIPs = [IPAddressRange]() - - for excludeIPString in wgConfig.splitTunnelSites { - if let excludeIP = IPAddressRange(from: excludeIPString) { - excludeIPs.append(excludeIP) - } - } - - tunnelConfiguration.peers[index].excludeIPs = excludeIPs - } - } - } - - wg_log(.info, message: "Starting tunnel from the " + - (activationAttemptId == nil ? "OS directly, rather than the app" : "app")) - - // Start the tunnel - wgAdapter = WireGuardAdapter(with: self) { logLevel, message in - wg_log(logLevel.osLogLevel, message: message) - } - - wgAdapter?.start(tunnelConfiguration: tunnelConfiguration) { [weak self] adapterError in - guard let adapterError else { - let interfaceName = self?.wgAdapter?.interfaceName ?? "unknown" - wg_log(.info, message: "Tunnel interface is \(interfaceName)") - completionHandler(nil) - return - } - - switch adapterError { - case .cannotLocateTunnelFileDescriptor: - wg_log(.error, staticMessage: "Starting tunnel failed: could not determine file descriptor") - errorNotifier.notify(PacketTunnelProviderError.couldNotDetermineFileDescriptor) - completionHandler(PacketTunnelProviderError.couldNotDetermineFileDescriptor) - case .dnsResolution(let dnsErrors): - let hostnamesWithDnsResolutionFailure = dnsErrors.map { $0.address } - .joined(separator: ", ") - wg_log(.error, message: - "DNS resolution failed for the following hostnames: \(hostnamesWithDnsResolutionFailure)") - errorNotifier.notify(PacketTunnelProviderError.dnsResolutionFailure) - completionHandler(PacketTunnelProviderError.dnsResolutionFailure) - case .setNetworkSettings(let error): - wg_log(.error, message: - "Starting tunnel failed with setTunnelNetworkSettings returning \(error.localizedDescription)") - errorNotifier.notify(PacketTunnelProviderError.couldNotSetNetworkSettings) - completionHandler(PacketTunnelProviderError.couldNotSetNetworkSettings) - case .startWireGuardBackend(let errorCode): - wg_log(.error, message: "Starting tunnel failed with wgTurnOn returning \(errorCode)") - errorNotifier.notify(PacketTunnelProviderError.couldNotStartBackend) - completionHandler(PacketTunnelProviderError.couldNotStartBackend) - case .invalidState: - fatalError() - } - } - } catch { - wg_log(.error, message: "Can't parse WG config: \(error.localizedDescription)") - completionHandler(nil) - return - } - } - - func handleWireguardStatusMessage(_ messageData: Data, completionHandler: ((Data?) -> Void)? = nil) { - guard let completionHandler = completionHandler else { return } - wgAdapter?.getRuntimeConfiguration { settings in - let components = settings!.components(separatedBy: "\n") - - var settingsDictionary: [String: String] = [:] - for component in components { - let pair = component.components(separatedBy: "=") - if pair.count == 2 { - settingsDictionary[pair[0]] = pair[1] - } - } - - let response: [String: Any] = [ - "rx_bytes": settingsDictionary["rx_bytes"] ?? "0", - "tx_bytes": settingsDictionary["tx_bytes"] ?? "0" - ] - - completionHandler(try? JSONSerialization.data(withJSONObject: response, options: [])) - } - } - - private func handleWireguardAppMessage(_ messageData: Data, completionHandler: ((Data?) -> Void)? = nil) { - guard let completionHandler = completionHandler else { return } - if messageData.count == 1 && messageData[0] == 0 { - wgAdapter?.getRuntimeConfiguration { settings in - var data: Data? - if let settings { - data = settings.data(using: .utf8)! - } - completionHandler(data) - } - } else if messageData.count >= 1 { - // Updates the tunnel configuration and responds with the active configuration - wg_log(.info, message: "Switching tunnel configuration") - guard let configString = String(data: messageData, encoding: .utf8) - else { - completionHandler(nil) - return - } - - do { - let tunnelConfiguration = try TunnelConfiguration(fromWgQuickConfig: configString) - wgAdapter?.update(tunnelConfiguration: tunnelConfiguration) { [weak self] error in - if let error { - wg_log(.error, message: "Failed to switch tunnel configuration: \(error.localizedDescription)") - completionHandler(nil) - return - } - - self?.wgAdapter?.getRuntimeConfiguration { settings in - var data: Data? - if let settings { - data = settings.data(using: .utf8)! - } - completionHandler(data) - } - } - } catch { - completionHandler(nil) - } - } else { - completionHandler(nil) - } - } - - func stopWireguard(with reason: NEProviderStopReason, completionHandler: @escaping () -> Void) { - wg_log(.info, message: "Stopping tunnel: reason: \(reason.description)") - - wgAdapter?.stop { error in - ErrorNotifier.removeLastErrorFile() - - if let error { - wg_log(.error, message: "Failed to stop WireGuard adapter: \(error.localizedDescription)") - } - completionHandler() - -#if os(macOS) - // HACK: This is a filthy hack to work around Apple bug 32073323 (dup'd by us as 47526107). - // Remove it when they finally fix this upstream and the fix has been rolled out to - // sufficient quantities of users. - exit(0) -#endif - } - } -} diff --git a/client/platforms/macos_ne/PacketTunnelProvider+Xray.swift b/client/platforms/macos_ne/PacketTunnelProvider+Xray.swift deleted file mode 100644 index 277980d6..00000000 --- a/client/platforms/macos_ne/PacketTunnelProvider+Xray.swift +++ /dev/null @@ -1,166 +0,0 @@ -import Foundation -import NetworkExtension -import WireGuardKitGo - -enum XrayErrors: Error { - case noXrayConfig - case cantSaveXrayConfig - case cantParseListenAndPort - case cantSaveHevSocksConfig -} - -extension Constants { - static let cachesDirectory: URL = { - if let cachesDirectoryURL = FileManager.default.urls(for: .cachesDirectory, - in: .userDomainMask).first { - return cachesDirectoryURL - } else { - fatalError("Unable to retrieve caches directory.") - } - }() -} - -extension PacketTunnelProvider { - func startXray(completionHandler: @escaping (Error?) -> Void) { - - // Xray configuration - guard let protocolConfiguration = self.protocolConfiguration as? NETunnelProviderProtocol, - let providerConfiguration = protocolConfiguration.providerConfiguration, - let xrayConfigData = providerConfiguration[Constants.xrayConfigKey] as? Data else { - xrayLog(.error, message: "Can't get xray configuration") - completionHandler(XrayErrors.noXrayConfig) - return - } - - // Tunnel settings - let ipv6Enabled = true - let hideVPNIcon = false - - let settings = NEPacketTunnelNetworkSettings(tunnelRemoteAddress: "254.1.1.1") - settings.mtu = 9000 - - settings.ipv4Settings = { - let settings = NEIPv4Settings(addresses: ["198.18.0.1"], subnetMasks: ["255.255.0.0"]) - settings.includedRoutes = [NEIPv4Route.default()] - return settings - }() - - settings.ipv6Settings = { - guard ipv6Enabled else { - return nil - } - let settings = NEIPv6Settings(addresses: ["fd6e:a81b:704f:1211::1"], networkPrefixLengths: [64]) - settings.includedRoutes = [NEIPv6Route.default()] - if hideVPNIcon { - settings.excludedRoutes = [NEIPv6Route(destinationAddress: "::", networkPrefixLength: 128)] - } - return settings - }() - - let dns = ["8.8.4.4","1.1.1.1"] - settings.dnsSettings = NEDNSSettings(servers: dns) - - do { - let port = 10808 - let address = "::1" - - let jsonDict = try JSONSerialization.jsonObject(with: xrayConfigData, - options: []) as? [String: Any] - - guard var jsonDict else { - xrayLog(.error, message: "Can't parse address and port for hevSocks") - completionHandler(XrayErrors.cantParseListenAndPort) - return - } - - if var inboundsArray = jsonDict["inbounds"] as? [[String: Any]], !inboundsArray.isEmpty { - inboundsArray[0]["port"] = port - inboundsArray[0]["listen"] = address - jsonDict["inbounds"] = inboundsArray - } - - let updatedData = try JSONSerialization.data(withJSONObject: jsonDict, options: []) - - setTunnelNetworkSettings(settings) { [weak self] error in - if let error { - completionHandler(error) - return - } - - // Launch xray - self?.setupAndStartXray(configData: updatedData) { xrayError in - if let xrayError { - completionHandler(xrayError) - return - } - - // Launch hevSocks - self?.setupAndRunTun2socks(configData: updatedData, - address: address, - port: port, - completionHandler: completionHandler) - } - } - } catch { - completionHandler(error) - return - } - } - - func stopXray(completionHandler: () -> Void) { - Socks5Tunnel.quit() - LibXrayStopXray() - completionHandler() - } - - private func setupAndStartXray(configData: Data, - completionHandler: @escaping (Error?) -> Void) { - let path = Constants.cachesDirectory.appendingPathComponent("config.json", isDirectory: false).path - guard FileManager.default.createFile(atPath: path, contents: configData) else { - xrayLog(.error, message: "Can't save xray configuration") - completionHandler(XrayErrors.cantSaveXrayConfig) - return - } - - LibXrayRunXray(nil, - path, - Int64.max) - - completionHandler(nil) - xrayLog(.info, message: "Xray started") - } - - private func setupAndRunTun2socks(configData: Data, - address: String, - port: Int, - completionHandler: @escaping (Error?) -> Void) { - let config = """ - tunnel: - mtu: 9000 - socks5: - port: \(port) - address: \(address) - udp: 'udp' - misc: - task-stack-size: 20480 - connect-timeout: 5000 - read-write-timeout: 60000 - log-file: stderr - log-level: error - limit-nofile: 65535 - """ - - let configurationFilePath = Constants.cachesDirectory.appendingPathComponent("config.yml", isDirectory: false).path - guard FileManager.default.createFile(atPath: configurationFilePath, contents: config.data(using: .utf8)!) else { - xrayLog(.info, message: "Cant save hevSocks configuration") - completionHandler(XrayErrors.cantSaveHevSocksConfig) - return - } - - DispatchQueue.global().async { - xrayLog(.info, message: "Hev socks started") - completionHandler(nil) - Socks5Tunnel.run(withConfig: configurationFilePath) - } - } -} diff --git a/client/platforms/macos_ne/PacketTunnelProvider.swift b/client/platforms/macos_ne/PacketTunnelProvider.swift deleted file mode 100644 index 9a5a5846..00000000 --- a/client/platforms/macos_ne/PacketTunnelProvider.swift +++ /dev/null @@ -1,234 +0,0 @@ -import Foundation -import NetworkExtension -import os -import Darwin -import OpenVPNAdapter - -enum TunnelProtoType: String { - case wireguard, openvpn, xray - -} - -struct Constants { - static let kDefaultPathKey = "defaultPath" - static let processQueueName = "org.amnezia.process-packets" - static let kActivationAttemptId = "activationAttemptId" - static let ovpnConfigKey = "ovpn" - static let xrayConfigKey = "xray" - static let wireGuardConfigKey = "wireguard" - static let loggerTag = "NET" - - static let kActionStart = "start" - static let kActionRestart = "restart" - static let kActionStop = "stop" - static let kActionGetTunnelId = "getTunnelId" - static let kActionStatus = "status" - static let kActionIsServerReachable = "isServerReachable" - static let kMessageKeyAction = "action" - static let kMessageKeyTunnelId = "tunnelId" - static let kMessageKeyConfig = "config" - static let kMessageKeyErrorCode = "errorCode" - static let kMessageKeyHost = "host" - static let kMessageKeyPort = "port" - static let kMessageKeyOnDemand = "is-on-demand" - static let kMessageKeySplitTunnelType = "SplitTunnelType" - static let kMessageKeySplitTunnelSites = "SplitTunnelSites" -} - -class PacketTunnelProvider: NEPacketTunnelProvider { - var wgAdapter: WireGuardAdapter? - var ovpnAdapter: OpenVPNAdapter? - - var splitTunnelType: Int? - var splitTunnelSites: [String]? - - let vpnReachability = OpenVPNReachability() - - var startHandler: ((Error?) -> Void)? - var stopHandler: (() -> Void)? - var protoType: TunnelProtoType? - - override func handleAppMessage(_ messageData: Data, completionHandler: ((Data?) -> Void)? = nil) { - guard let message = String(data: messageData, encoding: .utf8) else { - if let completionHandler { - completionHandler(nil) - } - return - } - - neLog(.info, title: "App said: ", message: message) - - guard let message = try? JSONSerialization.jsonObject(with: messageData, options: []) as? [String: Any] else { - neLog(.error, message: "Failed to serialize message from app") - return - } - - guard let completionHandler else { - neLog(.error, message: "Missing message completion handler") - return - } - - guard let action = message[Constants.kMessageKeyAction] as? String else { - neLog(.error, message: "Missing action key in app message") - completionHandler(nil) - return - } - - if action == Constants.kActionStatus { - handleStatusAppMessage(messageData, - completionHandler: completionHandler) - } - } - - override func startTunnel(options: [String : NSObject]? = nil, - completionHandler: @escaping ((any Error)?) -> Void) { - let activationAttemptId = options?[Constants.kActivationAttemptId] as? String - let errorNotifier = ErrorNotifier(activationAttemptId: activationAttemptId) - - neLog(.info, message: "Start tunnel") - - if let protocolConfiguration = protocolConfiguration as? NETunnelProviderProtocol { - let providerConfiguration = protocolConfiguration.providerConfiguration - if (providerConfiguration?[Constants.ovpnConfigKey] as? Data) != nil { - protoType = .openvpn - } else if (providerConfiguration?[Constants.wireGuardConfigKey] as? Data) != nil { - protoType = .wireguard - } else if (providerConfiguration?[Constants.xrayConfigKey] as? Data) != nil { - protoType = .xray - } - } - - guard let protoType else { - let error = NSError(domain: "Protocol is not selected", code: 0) - completionHandler(error) - return - } - - switch protoType { - case .wireguard: - startWireguard(activationAttemptId: activationAttemptId, - errorNotifier: errorNotifier, - completionHandler: completionHandler) - case .openvpn: - startOpenVPN(completionHandler: completionHandler) - case .xray: - startXray(completionHandler: completionHandler) - - } - } - - - override func stopTunnel(with reason: NEProviderStopReason, completionHandler: @escaping () -> Void) { - guard let protoType else { - completionHandler() - return - } - - switch protoType { - case .wireguard: - stopWireguard(with: reason, - completionHandler: completionHandler) - case .openvpn: - stopOpenVPN(with: reason, - completionHandler: completionHandler) - case .xray: - stopXray(completionHandler: completionHandler) - } - } - - func handleStatusAppMessage(_ messageData: Data, completionHandler: ((Data?) -> Void)? = nil) { - guard let protoType else { - completionHandler?(nil) - return - } - - switch protoType { - case .wireguard: - handleWireguardStatusMessage(messageData, completionHandler: completionHandler) - case .openvpn: - handleOpenVPNStatusMessage(messageData, completionHandler: completionHandler) - case .xray: - break; - } - } - - // MARK: Network observing methods - override func observeValue(forKeyPath keyPath: String?, - of object: Any?, - change: [NSKeyValueChangeKey: Any]?, - context: UnsafeMutableRawPointer?) { - guard Constants.kDefaultPathKey != keyPath else { return } - // Since iOS 11, we have observed that this KVO event fires repeatedly when connecting over Wifi, - // even though the underlying network has not changed (i.e. `isEqualToPath` returns false), - // leading to "wakeup crashes" due to excessive network activity. Guard against false positives by - // comparing the paths' string description, which includes properties not exposed by the class - guard let lastPath: NWPath = change?[.oldKey] as? NWPath, - let defPath = defaultPath, - lastPath != defPath || lastPath.description != defPath.description else { - return - } - DispatchQueue.main.async { [weak self] in - guard let self, self.defaultPath != nil else { return } - self.handle(networkChange: self.defaultPath!) { _ in } - } - } - - private func handle(networkChange changePath: NWPath, completion: @escaping (Error?) -> Void) { - wg_log(.info, message: "Tunnel restarted.") - startTunnel(options: nil, completionHandler: completion) - } -} - -extension WireGuardLogLevel { - var osLogLevel: OSLogType { - switch self { - case .verbose: - return .debug - case .error: - return .error - } - } -} - -extension NEProviderStopReason: CustomStringConvertible { - public var description: String { - switch self { - case .none: - return "No specific reason" - case .userInitiated: - return "The user stopped the NE" - case .providerFailed: - return "The NE failed to function correctly" - case .noNetworkAvailable: - return "No network connectivity is currently available" - case .unrecoverableNetworkChange: - return "The device’s network connectivity changed" - case .providerDisabled: - return "The NE was disabled" - case .authenticationCanceled: - return "The authentication process was canceled" - case .configurationFailed: - return "The VPNC is invalid" - case .idleTimeout: - return "The session timed out" - case .configurationDisabled: - return "The VPNC was disabled" - case .configurationRemoved: - return "The VPNC was removed" - case .superceded: - return "VPNC was superceded by a higher-priority VPNC" - case .userLogout: - return "The user logged out" - case .userSwitch: - return "The current console user changed" - case .connectionFailed: - return "The connection failed" - case .sleep: - return "A stop reason indicating the VPNC enabled disconnect on sleep and the device went to sleep" - case .appUpdate: - return "appUpdat" - @unknown default: - return "@unknown default" - } - } -} diff --git a/client/platforms/macos_ne/QRCodeReaderBase.cpp b/client/platforms/macos_ne/QRCodeReaderBase.cpp deleted file mode 100644 index c3148a85..00000000 --- a/client/platforms/macos_ne/QRCodeReaderBase.cpp +++ /dev/null @@ -1,14 +0,0 @@ -#include "QRCodeReaderBase.h" - -QRCodeReader::QRCodeReader() -{ - -} - -QRect QRCodeReader::cameraSize() { - return QRect(); -} - -void QRCodeReader::startReading() {} -void QRCodeReader::stopReading() {} -void QRCodeReader::setCameraSize(QRect) {} diff --git a/client/platforms/macos_ne/QRCodeReaderBase.h b/client/platforms/macos_ne/QRCodeReaderBase.h deleted file mode 100644 index 83a766d0..00000000 --- a/client/platforms/macos_ne/QRCodeReaderBase.h +++ /dev/null @@ -1,20 +0,0 @@ -#ifndef QRCODEREADERBASE_H -#define QRCODEREADERBASE_H - -#include -#include - -class QRCodeReader: public QObject { - Q_OBJECT - -public: - -signals: - void codeReaded(QString code); - -private: - void* m_qrCodeReader; - QRect m_cameraSize; -}; - -#endif // QRCODEREADERBASE_H diff --git a/client/platforms/macos_ne/QRCodeReaderBase.mm b/client/platforms/macos_ne/QRCodeReaderBase.mm deleted file mode 100644 index e08feb74..00000000 --- a/client/platforms/macos_ne/QRCodeReaderBase.mm +++ /dev/null @@ -1,110 +0,0 @@ -#include "QRCodeReaderBase.h" - -//#import -#import - -//@interface QRCodeReaderImpl : UIViewController -//@end - -/*@interface QRCodeReaderImpl () -@property (nonatomic) QRCodeReader* qrCodeReader; -@property (nonatomic, strong) AVCaptureSession *captureSession; -@property (nonatomic, strong) AVCaptureVideoPreviewLayer *videoPreviewPlayer; -@end - - -@implementation QRCodeReaderImpl - -//- (void)viewDidLoad { -// [super viewDidLoad]; - -// _captureSession = nil; -//} - -//- (void)setQrCodeReader: (QRCodeReader*)value { -// _qrCodeReader = value; -//} - -- (BOOL)startReading { - NSError *error; - - AVCaptureDevice *captureDevice = [AVCaptureDevice defaultDeviceWithMediaType: AVMediaTypeVideo]; - AVCaptureDeviceInput *deviceInput = [AVCaptureDeviceInput deviceInputWithDevice: captureDevice error: &error]; - - if(!deviceInput) { - NSLog(@"Error %@", error.localizedDescription); - return NO; - } - - _captureSession = [[AVCaptureSession alloc]init]; - [_captureSession addInput:deviceInput]; - - AVCaptureMetadataOutput *capturedMetadataOutput = [[AVCaptureMetadataOutput alloc] init]; - [_captureSession addOutput:capturedMetadataOutput]; - - dispatch_queue_t dispatchQueue; - dispatchQueue = dispatch_queue_create("myQueue", NULL); - [capturedMetadataOutput setMetadataObjectsDelegate: self queue: dispatchQueue]; - [capturedMetadataOutput setMetadataObjectTypes: [NSArray arrayWithObject:AVMetadataObjectTypeQRCode]]; - - _videoPreviewPlayer = [[AVCaptureVideoPreviewLayer alloc] initWithSession: _captureSession]; - - //CGFloat statusBarHeight = [UIApplication sharedApplication].statusBarFrame.size.height; - - QRect cameraRect = _qrCodeReader->cameraSize(); - CGRect cameraCGRect = CGRectMake(cameraRect.x(), - cameraRect.y() + statusBarHeight, - cameraRect.width(), - cameraRect.height()); - - [_videoPreviewPlayer setVideoGravity: AVLayerVideoGravityResizeAspectFill]; - [_videoPreviewPlayer setFrame: cameraCGRect]; - - // CALayer* layer = [UIApplication sharedApplication].keyWindow.layer; - [layer addSublayer: _videoPreviewPlayer]; - - [_captureSession startRunning]; - - return YES; -} - -- (void)stopReading { - [_captureSession stopRunning]; - _captureSession = nil; - - [_videoPreviewPlayer removeFromSuperlayer]; -} - -- (void)captureOutput:(AVCaptureOutput *)output didOutputMetadataObjects:(NSArray<__kindof AVMetadataObject *> *)metadataObjects fromConnection:(AVCaptureConnection *)connection { - - if (metadataObjects != nil && metadataObjects.count > 0) { - AVMetadataMachineReadableCodeObject *metadataObject = [metadataObjects objectAtIndex:0]; - - if ([[metadataObject type] isEqualToString: AVMetadataObjectTypeQRCode]) { - _qrCodeReader->emit codeReaded([metadataObject stringValue].UTF8String); - } - } -} - -@end - -QRCodeReader::QRCodeReader() { - m_qrCodeReader = [[QRCodeReaderImpl alloc] init]; - [m_qrCodeReader setQrCodeReader: this]; -} - -QRect QRCodeReader::cameraSize() { - return m_cameraSize; -} - -void QRCodeReader::setCameraSize(QRect value) { - m_cameraSize = value; -} - -void QRCodeReader::startReading() { - [m_qrCodeReader startReading]; -} - -void QRCodeReader::stopReading() { - [m_qrCodeReader stopReading]; -}*/ diff --git a/client/platforms/macos_ne/QtAppDelegate-C-Interface.h b/client/platforms/macos_ne/QtAppDelegate-C-Interface.h deleted file mode 100644 index dd358097..00000000 --- a/client/platforms/macos_ne/QtAppDelegate-C-Interface.h +++ /dev/null @@ -1,6 +0,0 @@ -#ifndef QTAPPDELEGATECINTERFACE_H -#define QTAPPDELEGATECINTERFACE_H - -void QtAppDelegateInitialize(); - -#endif // QTAPPDELEGATECINTERFACE_H diff --git a/client/platforms/macos_ne/QtAppDelegate.h b/client/platforms/macos_ne/QtAppDelegate.h deleted file mode 100644 index 19978965..00000000 --- a/client/platforms/macos_ne/QtAppDelegate.h +++ /dev/null @@ -1,7 +0,0 @@ -//#import - -@interface QIOSApplicationDelegate -@end - -@interface QIOSApplicationDelegate (AmneziaVPNDelegate) -@end diff --git a/client/platforms/macos_ne/QtAppDelegate.mm b/client/platforms/macos_ne/QtAppDelegate.mm deleted file mode 100644 index 2ac7e612..00000000 --- a/client/platforms/macos_ne/QtAppDelegate.mm +++ /dev/null @@ -1,61 +0,0 @@ -#import "QtAppDelegate.h" -#import "ios_controller.h" - -#include - - -@implementation QIOSApplicationDelegate (AmneziaVPNDelegate) - -/*- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions -{ - [application setMinimumBackgroundFetchInterval: UIApplicationBackgroundFetchIntervalMinimum]; - // Override point for customization after application launch. - NSLog(@"Application didFinishLaunchingWithOptions"); - return YES; -} - -- (void)applicationDidEnterBackground:(UIApplication *)application -{ - // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later. - // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits. - NSLog(@"In the background"); -} - -- (void)applicationWillEnterForeground:(UIApplication *)application -{ - // Called as part of the transition from the background to the inactive state; here you can undo many of the changes made on entering the background. - NSLog(@"In the foreground"); -} - --(void)application:(UIApplication *)application performFetchWithCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler { - // We will add content here soon. - NSLog(@"In the completionHandler"); -} - -- (BOOL)application:(UIApplication *)app - openURL:(NSURL *)url - options:(NSDictionary *)options { - if (url.fileURL) { - QString filePath(url.path.UTF8String); - if (filePath.isEmpty()) return NO; - - dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 1 * NSEC_PER_SEC), dispatch_get_main_queue(), ^{ - NSLog(@"Application openURL: %@", url); - - if (filePath.contains("backup")) { - IosController::Instance()->importBackupFromOutside(filePath); - } else { - QFile file(filePath); - bool isOpenFile = file.open(QIODevice::ReadOnly); - QByteArray data = file.readAll(); - - IosController::Instance()->importConfigFromOutside(QString(data)); - } - }); - - return YES; - } - return NO; -}*/ - -@end diff --git a/client/platforms/macos_ne/ScreenProtection.swift b/client/platforms/macos_ne/ScreenProtection.swift deleted file mode 100644 index 1e85479b..00000000 --- a/client/platforms/macos_ne/ScreenProtection.swift +++ /dev/null @@ -1,10 +0,0 @@ -//import UIKit - -public func toggleScreenshots(_ isEnabled: Bool) { - -} - -class ScreenProtection { - - -} diff --git a/client/platforms/macos_ne/VPNCController.swift b/client/platforms/macos_ne/VPNCController.swift deleted file mode 100644 index 3ad0cbbf..00000000 --- a/client/platforms/macos_ne/VPNCController.swift +++ /dev/null @@ -1,50 +0,0 @@ -import Foundation -import NetworkExtension - -public func removeVPNC(_ vpncName: std.string) { - let vpncName = String(describing: vpncName) - - Task { - await getManagers()?.first { manager in - if let name = manager.localizedDescription, name == vpncName { - Task { - await remove(manager) - } - - return true - } else { - return false - } - } - } -} - -public func clearSettings() { - Task { - await getManagers()?.forEach { manager in - Task { - await remove(manager) - } - } - } -} - -func getManagers() async -> [NETunnelProviderManager]? { - do { - return try await NETunnelProviderManager.loadAllFromPreferences() - } catch { - log(.error, title: "VPNC: ", message: "loadAllFromPreferences error: \(error.localizedDescription)") - return nil - } -} - -func remove(_ manager: NETunnelProviderManager) async { - let vpncName = manager.localizedDescription ?? "Unknown" - do { - try await manager.removeFromPreferences() - try await manager.loadFromPreferences() - log(.info, title: "VPNC: ", message: "Remove \(vpncName)") - } catch { - log(.error, title: "VPNC: ", message: "Failed to remove \(vpncName) (\(error.localizedDescription))") - } -} diff --git a/client/platforms/macos_ne/WGConfig.swift b/client/platforms/macos_ne/WGConfig.swift deleted file mode 100644 index e3b67efe..00000000 --- a/client/platforms/macos_ne/WGConfig.swift +++ /dev/null @@ -1,94 +0,0 @@ -import Foundation - -struct WGConfig: Decodable { - let initPacketMagicHeader, responsePacketMagicHeader: String? - let underloadPacketMagicHeader, transportPacketMagicHeader: String? - let junkPacketCount, junkPacketMinSize, junkPacketMaxSize: String? - let initPacketJunkSize, responsePacketJunkSize: String? - let dns1: String - let dns2: String - let mtu: String - let hostName: String - let port: Int - let clientIP: String - let clientPrivateKey: String - let serverPublicKey: String - let presharedKey: String? - var allowedIPs: [String] - var persistentKeepAlive: String - let splitTunnelType: Int - let splitTunnelSites: [String] - - enum CodingKeys: String, CodingKey { - case initPacketMagicHeader = "H1", responsePacketMagicHeader = "H2" - case underloadPacketMagicHeader = "H3", transportPacketMagicHeader = "H4" - case junkPacketCount = "Jc", junkPacketMinSize = "Jmin", junkPacketMaxSize = "Jmax" - case initPacketJunkSize = "S1", responsePacketJunkSize = "S2" - case dns1 - case dns2 - case mtu - case hostName - case port - case clientIP = "client_ip" - case clientPrivateKey = "client_priv_key" - case serverPublicKey = "server_pub_key" - case presharedKey = "psk_key" - case allowedIPs = "allowed_ips" - case persistentKeepAlive = "persistent_keep_alive" - case splitTunnelType - case splitTunnelSites - } - - var settings: String { - junkPacketCount == nil ? "" : - """ - Jc = \(junkPacketCount!) - Jmin = \(junkPacketMinSize!) - Jmax = \(junkPacketMaxSize!) - S1 = \(initPacketJunkSize!) - S2 = \(responsePacketJunkSize!) - H1 = \(initPacketMagicHeader!) - H2 = \(responsePacketMagicHeader!) - H3 = \(underloadPacketMagicHeader!) - H4 = \(transportPacketMagicHeader!) - - """ - } - - var str: String { - """ - [Interface] - Address = \(clientIP) - DNS = \(dns1), \(dns2) - MTU = \(mtu) - PrivateKey = \(clientPrivateKey) - \(settings) - [Peer] - PublicKey = \(serverPublicKey) - \(presharedKey == nil ? "" : "PresharedKey = \(presharedKey!)") - AllowedIPs = \(allowedIPs.joined(separator: ", ")) - Endpoint = \(hostName):\(port) - PersistentKeepalive = \(persistentKeepAlive) - """ - } - - var redux: String { - """ - [Interface] - Address = \(clientIP) - DNS = \(dns1), \(dns2) - MTU = \(mtu) - PrivateKey = *** - \(settings) - [Peer] - PublicKey = *** - PresharedKey = *** - AllowedIPs = \(allowedIPs.joined(separator: ", ")) - Endpoint = \(hostName):\(port) - PersistentKeepalive = \(persistentKeepAlive) - - SplitTunnelType = \(splitTunnelType) - SplitTunnelSites = \(splitTunnelSites.joined(separator: ", ")) - """ - } -} diff --git a/client/platforms/macos_ne/WireGuard-Bridging-Header.h b/client/platforms/macos_ne/WireGuard-Bridging-Header.h deleted file mode 100644 index 0183367b..00000000 --- a/client/platforms/macos_ne/WireGuard-Bridging-Header.h +++ /dev/null @@ -1,28 +0,0 @@ -/* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ - -#include "3rd/amneziawg-apple/Sources/WireGuardKitC/WireGuardKitC.h" - -#include -#include - -#define WG_KEY_LEN (32) -#define WG_KEY_LEN_BASE64 (45) -#define WG_KEY_LEN_HEX (65) - -void key_to_base64(char base64[WG_KEY_LEN_BASE64], - const uint8_t key[WG_KEY_LEN]); -bool key_from_base64(uint8_t key[WG_KEY_LEN], const char* base64); - -void key_to_hex(char hex[WG_KEY_LEN_HEX], const uint8_t key[WG_KEY_LEN]); -bool key_from_hex(uint8_t key[WG_KEY_LEN], const char* hex); - -bool key_eq(const uint8_t key1[WG_KEY_LEN], const uint8_t key2[WG_KEY_LEN]); - -void write_msg_to_log(const char* tag, const char* msg); - -#import "TargetConditionals.h" -#if TARGET_OS_OSX -# include -#endif diff --git a/client/platforms/macos_ne/ios_controller.h b/client/platforms/macos_ne/ios_controller.h deleted file mode 100644 index 8e13eaa9..00000000 --- a/client/platforms/macos_ne/ios_controller.h +++ /dev/null @@ -1,99 +0,0 @@ -#ifndef IOS_CONTROLLER_H -#define IOS_CONTROLLER_H - -#include "protocols/vpnprotocol.h" - -#ifdef __OBJC__ - #import -@class NETunnelProviderManager; -#endif - -using namespace amnezia; - -struct Action -{ - static const char *start; - static const char *restart; - static const char *stop; - static const char *getTunnelId; - static const char *getStatus; -}; - -struct MessageKey -{ - static const char *action; - static const char *tunnelId; - static const char *config; - static const char *errorCode; - static const char *host; - static const char *port; - static const char *isOnDemand; - static const char *SplitTunnelType; - static const char *SplitTunnelSites; -}; - -class IosController : public QObject -{ - Q_OBJECT - -public: - static IosController *Instance(); - - virtual ~IosController() override = default; - - bool initialize(); - bool connectVpn(amnezia::Proto proto, const QJsonObject &configuration); - void disconnectVpn(); - - void vpnStatusDidChange(void *pNotification); - void vpnConfigurationDidChange(void *pNotification); - - void getBackendLogs(std::function &&callback); - void checkStatus(); - - bool shareText(const QStringList &filesToSend); - QString openFile(); - - void requestInetAccess(); -signals: - void connectionStateChanged(Vpn::ConnectionState state); - void bytesChanged(quint64 receivedBytes, quint64 sentBytes); - void importConfigFromOutside(const QString); - void importBackupFromOutside(const QString); - - void finished(); - -protected slots: - -private: - explicit IosController(); - - bool setupOpenVPN(); - bool setupCloak(); - bool setupWireGuard(); - bool setupAwg(); - bool setupXray(); - - bool startOpenVPN(const QString &config); - bool startWireGuard(const QString &jsonConfig); - bool startXray(const QString &jsonConfig); - - void startTunnel(); - -private: - void *m_iosControllerWrapper {}; -#ifdef __OBJC__ - NETunnelProviderManager *m_currentTunnel {}; - NSString *m_serverAddress {}; - bool isOurManager(NETunnelProviderManager *manager); - void sendVpnExtensionMessage(NSDictionary *message, std::function callback = nullptr); -#endif - - amnezia::Proto m_proto; - QJsonObject m_rawConfig; - QString m_tunnelId; - uint64_t m_txBytes; - uint64_t m_rxBytes; -}; - -#endif // IOS_CONTROLLER_H diff --git a/client/platforms/macos_ne/ios_controller.mm b/client/platforms/macos_ne/ios_controller.mm deleted file mode 100644 index 7308b178..00000000 --- a/client/platforms/macos_ne/ios_controller.mm +++ /dev/null @@ -1,851 +0,0 @@ -#include "ios_controller.h" - -#include -#include -#include -#include -#include -#include -#include - -#include "../protocols/vpnprotocol.h" -#import "ios_controller_wrapper.h" - -#include - -const char* Action::start = "start"; -const char* Action::restart = "restart"; -const char* Action::stop = "stop"; -const char* Action::getTunnelId = "getTunnelId"; -const char* Action::getStatus = "status"; - -const char* MessageKey::action = "action"; -const char* MessageKey::tunnelId = "tunnelId"; -const char* MessageKey::config = "config"; -const char* MessageKey::errorCode = "errorCode"; -const char* MessageKey::host = "host"; -const char* MessageKey::port = "port"; -const char* MessageKey::isOnDemand = "is-on-demand"; -const char* MessageKey::SplitTunnelType = "SplitTunnelType"; -const char* MessageKey::SplitTunnelSites = "SplitTunnelSites"; - -//static UIViewController* getViewController() { -// NSArray *windows = [[UIApplication sharedApplication]windows]; -// for (UIWindow *window in windows) { -// if (window.isKeyWindow) { -// return window.rootViewController; -// } -// } -// return nil; -//} - -OSStatus requestAuthorization() { - AuthorizationRef authRef; - OSStatus status = AuthorizationCreate(NULL, kAuthorizationEmptyEnvironment, kAuthorizationFlagDefaults, &authRef); - if (status != errAuthorizationSuccess) { - qDebug() << "Authorization failed with status:" << status; - return status; - } - - AuthorizationItem authItem = {kAuthorizationRightExecute, 0, NULL, 0}; - AuthorizationRights authRights = {1, &authItem}; - AuthorizationFlags flags = kAuthorizationFlagDefaults | kAuthorizationFlagInteractionAllowed | kAuthorizationFlagExtendRights; - - status = AuthorizationCopyRights(authRef, &authRights, NULL, flags, NULL); - if (status != errAuthorizationSuccess) { - qDebug() << "Authorization rights copy failed with status:" << status; - } - - return status; -} - -Vpn::ConnectionState iosStatusToState(NEVPNStatus status) { - switch (status) { - case NEVPNStatusInvalid: - return Vpn::ConnectionState::Unknown; - case NEVPNStatusDisconnected: - return Vpn::ConnectionState::Disconnected; - case NEVPNStatusConnecting: - return Vpn::ConnectionState::Connecting; - case NEVPNStatusConnected: - return Vpn::ConnectionState::Connected; - case NEVPNStatusReasserting: - return Vpn::ConnectionState::Connecting; - case NEVPNStatusDisconnecting: - return Vpn::ConnectionState::Disconnecting; - default: - return Vpn::ConnectionState::Unknown; -} -} - -namespace { -IosController* s_instance = nullptr; -} - -IosController::IosController() : QObject() -{ - s_instance = this; - m_iosControllerWrapper = [[IosControllerWrapper alloc] initWithCppController:this]; - - [[NSNotificationCenter defaultCenter] - removeObserver: (__bridge NSObject *)m_iosControllerWrapper]; - [[NSNotificationCenter defaultCenter] - addObserver: (__bridge NSObject *)m_iosControllerWrapper selector:@selector(vpnStatusDidChange:) name:NEVPNStatusDidChangeNotification object:nil]; - [[NSNotificationCenter defaultCenter] - addObserver: (__bridge NSObject *)m_iosControllerWrapper selector:@selector(vpnConfigurationDidChange:) name:NEVPNConfigurationChangeNotification object:nil]; - -} - -IosController* IosController::Instance() { - if (!s_instance) { - s_instance = new IosController(); - } - - return s_instance; -} - -bool IosController::initialize() -{ - if (requestAuthorization() != errAuthorizationSuccess) { - emit connectionStateChanged(Vpn::ConnectionState::Error); - return false; - } - - __block bool ok = true; - [NETunnelProviderManager loadAllFromPreferencesWithCompletionHandler:^(NSArray * _Nullable managers, NSError * _Nullable error) { - @try { - if (error) { - qDebug() << "IosController::initialize : Error:" << [error.localizedDescription UTF8String]; - emit connectionStateChanged(Vpn::ConnectionState::Error); - ok = false; - return; - } - - NSInteger managerCount = managers.count; - qDebug() << "IosController::initialize : We have received managers:" << (long)managerCount; - - - for (NETunnelProviderManager *manager in managers) { - qDebug() << "IosController::initialize : VPNC: " << manager.localizedDescription; - - if (manager.connection.status == NEVPNStatusConnected) { - m_currentTunnel = manager; - qDebug() << "IosController::initialize : VPN already connected with" << manager.localizedDescription; - emit connectionStateChanged(Vpn::ConnectionState::Connected); - break; - - // TODO: show connected state - } - } - } - @catch (NSException *exception) { - qDebug() << "IosController::setTunnel : exception" << QString::fromNSString(exception.reason); - ok = false; - } - }]; - - return ok; -} - -bool IosController::connectVpn(amnezia::Proto proto, const QJsonObject& configuration) -{ - m_proto = proto; - m_rawConfig = configuration; - m_serverAddress = configuration.value(config_key::hostName).toString().toNSString(); - - QString tunnelName; - if (configuration.value(config_key::description).toString().isEmpty()) { - tunnelName = QString("%1 %2") - .arg(configuration.value(config_key::hostName).toString()) - .arg(ProtocolProps::protoToString(proto)); - } - else { - tunnelName = QString("%1 (%2) %3") - .arg(configuration.value(config_key::description).toString()) - .arg(configuration.value(config_key::hostName).toString()) - .arg(ProtocolProps::protoToString(proto)); - } - - qDebug() << "IosController::connectVpn" << tunnelName; - - m_currentTunnel = nullptr; - - dispatch_semaphore_t semaphore = dispatch_semaphore_create(0); - __block bool ok = true; - __block bool isNewTunnelCreated = false; - - [NETunnelProviderManager loadAllFromPreferencesWithCompletionHandler:^(NSArray * _Nullable managers, NSError * _Nullable error) { - @try { - if (error) { - qDebug() << "IosController::connectVpn : VPNC: loadAllFromPreferences error:" << [error.localizedDescription UTF8String]; - emit connectionStateChanged(Vpn::ConnectionState::Error); - ok = false; - return; - } - - NSInteger managerCount = managers.count; - qDebug() << "IosController::connectVpn : We have received managers:" << (long)managerCount; - - - for (NETunnelProviderManager *manager in managers) { - if ([manager.localizedDescription isEqualToString:tunnelName.toNSString()]) { - m_currentTunnel = manager; - qDebug() << "IosController::connectVpn : Using existing tunnel:" << manager.localizedDescription; - if (manager.connection.status == NEVPNStatusConnected) { - emit connectionStateChanged(Vpn::ConnectionState::Connected); - return; - } - - break; - } - } - - if (!m_currentTunnel) { - isNewTunnelCreated = true; - m_currentTunnel = [[NETunnelProviderManager alloc] init]; - m_currentTunnel.localizedDescription = [NSString stringWithUTF8String:tunnelName.toStdString().c_str()]; - qDebug() << "IosController::connectVpn : Creating new tunnel" << m_currentTunnel.localizedDescription; - } - - } - @catch (NSException *exception) { - qDebug() << "IosController::connectVpn : exception" << QString::fromNSString(exception.reason); - ok = false; - m_currentTunnel = nullptr; - } - @finally { - dispatch_semaphore_signal(semaphore); - } - }]; - - dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER); - if (!ok) return false; - - [[NSNotificationCenter defaultCenter] - removeObserver:(__bridge NSObject *)m_iosControllerWrapper]; - - [[NSNotificationCenter defaultCenter] - addObserver:(__bridge NSObject *)m_iosControllerWrapper - selector:@selector(vpnStatusDidChange:) - name:NEVPNStatusDidChangeNotification - object:m_currentTunnel.connection]; - - - if (proto == amnezia::Proto::OpenVpn) { - return setupOpenVPN(); - } - if (proto == amnezia::Proto::Cloak) { - return setupCloak(); - } - if (proto == amnezia::Proto::WireGuard) { - return setupWireGuard(); - } - if (proto == amnezia::Proto::Awg) { - return setupAwg(); - } - if (proto == amnezia::Proto::Xray) { - return setupXray(); - } - - return false; -} - -void IosController::disconnectVpn() -{ - if (!m_currentTunnel) { - return; - } - - if ([m_currentTunnel.connection isKindOfClass:[NETunnelProviderSession class]]) { - [(NETunnelProviderSession *)m_currentTunnel.connection stopTunnel]; - } -} - - -void IosController::checkStatus() -{ - NSString *actionKey = [NSString stringWithUTF8String:MessageKey::action]; - NSString *actionValue = [NSString stringWithUTF8String:Action::getStatus]; - NSString *tunnelIdKey = [NSString stringWithUTF8String:MessageKey::tunnelId]; - NSString *tunnelIdValue = !m_tunnelId.isEmpty() ? m_tunnelId.toNSString() : @""; - - NSDictionary* message = @{actionKey: actionValue, tunnelIdKey: tunnelIdValue}; - sendVpnExtensionMessage(message, [&](NSDictionary* response){ - uint64_t txBytes = [response[@"tx_bytes"] intValue]; - uint64_t rxBytes = [response[@"rx_bytes"] intValue]; - emit bytesChanged(rxBytes - m_rxBytes, txBytes - m_txBytes); - m_rxBytes = rxBytes; - m_txBytes = txBytes; - }); -} - -void IosController::vpnStatusDidChange(void *pNotification) -{ - NETunnelProviderSession *session = (NETunnelProviderSession *)pNotification; - - if (session /* && session == TunnelManager.session */ ) { - qDebug() << "IosController::vpnStatusDidChange" << iosStatusToState(session.status) << session; - - if (session.status == NEVPNStatusDisconnected) { - if (@available(iOS 16.0, *)) { - [session fetchLastDisconnectErrorWithCompletionHandler:^(NSError * _Nullable error) { - if (error != nil) { - qDebug() << "Disconnect error" << error.domain << error.code << error.localizedDescription; - - if ([error.domain isEqualToString:NEVPNConnectionErrorDomain]) { - switch (error.code) { - case NEVPNConnectionErrorOverslept: - qDebug() << "Disconnect error info" << "The VPN connection was terminated because the system slept for an extended period of time."; - break; - case NEVPNConnectionErrorNoNetworkAvailable: - qDebug() << "Disconnect error info" << "The VPN connection could not be established because the system is not connected to a network."; - break; - case NEVPNConnectionErrorUnrecoverableNetworkChange: - qDebug() << "Disconnect error info" << "The VPN connection was terminated because the network conditions changed in such a way that the VPN connection could not be maintained."; - break; - case NEVPNConnectionErrorConfigurationFailed: - qDebug() << "Disconnect error info" << "The VPN connection could not be established because the configuration is invalid. "; - break; - case NEVPNConnectionErrorServerAddressResolutionFailed: - qDebug() << "Disconnect error info" << "The address of the VPN server could not be determined."; - break; - case NEVPNConnectionErrorServerNotResponding: - qDebug() << "Disconnect error info" << "Network communication with the VPN server has failed."; - break; - case NEVPNConnectionErrorServerDead: - qDebug() << "Disconnect error info" << "The VPN server is no longer functioning."; - break; - case NEVPNConnectionErrorAuthenticationFailed: - qDebug() << "Disconnect error info" << "The user credentials were rejected by the VPN server."; - break; - case NEVPNConnectionErrorClientCertificateInvalid: - qDebug() << "Disconnect error info" << "The client certificate is invalid."; - break; - case NEVPNConnectionErrorClientCertificateNotYetValid: - qDebug() << "Disconnect error info" << "The client certificate will not be valid until some future point in time."; - break; - case NEVPNConnectionErrorClientCertificateExpired: - qDebug() << "Disconnect error info" << "The validity period of the client certificate has passed."; - break; - case NEVPNConnectionErrorPluginFailed: - qDebug() << "Disconnect error info" << "The VPN plugin died unexpectedly."; - break; - case NEVPNConnectionErrorConfigurationNotFound: - qDebug() << "Disconnect error info" << "The VPN configuration could not be found."; - break; - case NEVPNConnectionErrorPluginDisabled: - qDebug() << "Disconnect error info" << "The VPN plugin could not be found or needed to be updated."; - break; - case NEVPNConnectionErrorNegotiationFailed: - qDebug() << "Disconnect error info" << "The VPN protocol negotiation failed."; - break; - case NEVPNConnectionErrorServerDisconnected: - qDebug() << "Disconnect error info" << "The VPN server terminated the connection."; - break; - case NEVPNConnectionErrorServerCertificateInvalid: - qDebug() << "Disconnect error info" << "The server certificate is invalid."; - break; - case NEVPNConnectionErrorServerCertificateNotYetValid: - qDebug() << "Disconnect error info" << "The server certificate will not be valid until some future point in time."; - break; - case NEVPNConnectionErrorServerCertificateExpired: - qDebug() << "Disconnect error info" << "The validity period of the server certificate has passed."; - break; - default: - qDebug() << "Disconnect error info" << "Unknown code."; - break; - } - } - - NSError *underlyingError = error.userInfo[@"NSUnderlyingError"]; - if (underlyingError != nil) { - qDebug() << "Disconnect underlying error" << underlyingError.domain << underlyingError.code << underlyingError.localizedDescription; - - if ([underlyingError.domain isEqualToString:@"NEAgentErrorDomain"]) { - switch (underlyingError.code) { - case 1: - qDebug() << "Disconnect underlying error" << "General. Use sysdiagnose."; - break; - case 2: - qDebug() << "Disconnect underlying error" << "Plug-in unavailable. Use sysdiagnose."; - break; - default: - qDebug() << "Disconnect underlying error" << "Unknown code. Use sysdiagnose."; - break; - } - } - } - } else { - qDebug() << "Disconnect error is absent"; - } - }]; - } else { - qDebug() << "Disconnect error is unavailable on iOS < 16.0"; - } - } - - emit connectionStateChanged(iosStatusToState(session.status)); - } -} - -void IosController::vpnConfigurationDidChange(void *pNotification) -{ - qDebug() << "IosController::vpnConfigurationDidChange" << pNotification; -} - -bool IosController::setupOpenVPN() -{ - QJsonObject ovpn = m_rawConfig[ProtocolProps::key_proto_config_data(amnezia::Proto::OpenVpn)].toObject(); - QString ovpnConfig = ovpn[config_key::config].toString(); - - QJsonObject openVPNConfig {}; - openVPNConfig.insert(config_key::config, ovpnConfig); - - if (ovpn.contains(config_key::mtu)) { - openVPNConfig.insert(config_key::mtu, ovpn[config_key::mtu]); - } else { - openVPNConfig.insert(config_key::mtu, protocols::openvpn::defaultMtu); - } - - openVPNConfig.insert(config_key::splitTunnelType, m_rawConfig[config_key::splitTunnelType]); - - QJsonArray splitTunnelSites = m_rawConfig[config_key::splitTunnelSites].toArray(); - - for(int index = 0; index < splitTunnelSites.count(); index++) { - splitTunnelSites[index] = splitTunnelSites[index].toString().remove(" "); - } - - openVPNConfig.insert(config_key::splitTunnelSites, splitTunnelSites); - - QJsonDocument openVPNConfigDoc(openVPNConfig); - QString openVPNConfigStr(openVPNConfigDoc.toJson(QJsonDocument::Compact)); - - return startOpenVPN(openVPNConfigStr); -} - -bool IosController::setupCloak() -{ - m_serverAddress = @"127.0.0.1"; - QJsonObject ovpn = m_rawConfig[ProtocolProps::key_proto_config_data(amnezia::Proto::OpenVpn)].toObject(); - QString ovpnConfig = ovpn[config_key::config].toString(); - - QJsonObject cloak = m_rawConfig[ProtocolProps::key_proto_config_data(amnezia::Proto::Cloak)].toObject(); - - cloak["NumConn"] = 1; - if (cloak.contains("remote")) { - cloak["RemoteHost"] = cloak["remote"].toString(); - } - if (cloak.contains("port")) { - cloak["RemotePort"] = cloak["port"].toString(); - } - cloak.remove("remote"); - cloak.remove("port"); - cloak.remove("transport_proto"); - - QJsonObject jsonObject {}; - foreach(const QString& key, cloak.keys()) { - if(key == "NumConn" or key == "StreamTimeout"){ - jsonObject.insert(key, cloak.value(key).toInt()); - }else{ - jsonObject.insert(key, cloak.value(key).toString()); - } - } - QJsonDocument doc(jsonObject); - QString strJson(doc.toJson(QJsonDocument::Compact)); - QString cloakBase64 = strJson.toUtf8().toBase64(); - ovpnConfig.append("\n\n"); - ovpnConfig.append(cloakBase64); - ovpnConfig.append("\n\n"); - - QJsonObject openVPNConfig {}; - openVPNConfig.insert(config_key::config, ovpnConfig); - - if (ovpn.contains(config_key::mtu)) { - openVPNConfig.insert(config_key::mtu, ovpn[config_key::mtu]); - } else { - openVPNConfig.insert(config_key::mtu, protocols::openvpn::defaultMtu); - } - - openVPNConfig.insert(config_key::splitTunnelType, m_rawConfig[config_key::splitTunnelType]); - - QJsonArray splitTunnelSites = m_rawConfig[config_key::splitTunnelSites].toArray(); - - for(int index = 0; index < splitTunnelSites.count(); index++) { - splitTunnelSites[index] = splitTunnelSites[index].toString().remove(" "); - } - - openVPNConfig.insert(config_key::splitTunnelSites, splitTunnelSites); - - QJsonDocument openVPNConfigDoc(openVPNConfig); - QString openVPNConfigStr(openVPNConfigDoc.toJson(QJsonDocument::Compact)); - - return startOpenVPN(openVPNConfigStr); -} - -bool IosController::setupWireGuard() -{ - QJsonObject config = m_rawConfig[ProtocolProps::key_proto_config_data(amnezia::Proto::WireGuard)].toObject(); - - QJsonObject wgConfig {}; - wgConfig.insert(config_key::dns1, m_rawConfig[config_key::dns1]); - wgConfig.insert(config_key::dns2, m_rawConfig[config_key::dns2]); - - if (config.contains(config_key::mtu)) { - wgConfig.insert(config_key::mtu, config[config_key::mtu]); - } else { - wgConfig.insert(config_key::mtu, protocols::wireguard::defaultMtu); - } - - wgConfig.insert(config_key::hostName, config[config_key::hostName]); - wgConfig.insert(config_key::port, config[config_key::port]); - wgConfig.insert(config_key::client_ip, config[config_key::client_ip]); - wgConfig.insert(config_key::client_priv_key, config[config_key::client_priv_key]); - wgConfig.insert(config_key::server_pub_key, config[config_key::server_pub_key]); - wgConfig.insert(config_key::psk_key, config[config_key::psk_key]); - wgConfig.insert(config_key::splitTunnelType, m_rawConfig[config_key::splitTunnelType]); - - QJsonArray splitTunnelSites = m_rawConfig[config_key::splitTunnelSites].toArray(); - - for(int index = 0; index < splitTunnelSites.count(); index++) { - splitTunnelSites[index] = splitTunnelSites[index].toString().remove(" "); - } - - wgConfig.insert(config_key::splitTunnelSites, splitTunnelSites); - - if (config.contains(config_key::allowed_ips) && config[config_key::allowed_ips].isArray()) { - wgConfig.insert(config_key::allowed_ips, config[config_key::allowed_ips]); - } else { - QJsonArray allowed_ips { "0.0.0.0/0", "::/0" }; - wgConfig.insert(config_key::allowed_ips, allowed_ips); - } - - if (config.contains(config_key::persistent_keep_alive)) { - wgConfig.insert(config_key::persistent_keep_alive, config[config_key::persistent_keep_alive]); - } else { - wgConfig.insert(config_key::persistent_keep_alive, "25"); - } - - QJsonDocument wgConfigDoc(wgConfig); - QString wgConfigDocStr(wgConfigDoc.toJson(QJsonDocument::Compact)); - - return startWireGuard(wgConfigDocStr); -} - -bool IosController::setupXray() -{ - QJsonObject config = m_rawConfig[ProtocolProps::key_proto_config_data(amnezia::Proto::Xray)].toObject(); - QJsonDocument xrayConfigDoc(config); - QString xrayConfigStr(xrayConfigDoc.toJson(QJsonDocument::Compact)); - - return startXray(xrayConfigStr); -} - -bool IosController::setupAwg() -{ - QJsonObject config = m_rawConfig[ProtocolProps::key_proto_config_data(amnezia::Proto::Awg)].toObject(); - - QJsonObject wgConfig {}; - wgConfig.insert(config_key::dns1, m_rawConfig[config_key::dns1]); - wgConfig.insert(config_key::dns2, m_rawConfig[config_key::dns2]); - - if (config.contains(config_key::mtu)) { - wgConfig.insert(config_key::mtu, config[config_key::mtu]); - } else { - wgConfig.insert(config_key::mtu, protocols::awg::defaultMtu); - } - - wgConfig.insert(config_key::hostName, config[config_key::hostName]); - wgConfig.insert(config_key::port, config[config_key::port]); - wgConfig.insert(config_key::client_ip, config[config_key::client_ip]); - wgConfig.insert(config_key::client_priv_key, config[config_key::client_priv_key]); - wgConfig.insert(config_key::server_pub_key, config[config_key::server_pub_key]); - wgConfig.insert(config_key::psk_key, config[config_key::psk_key]); - wgConfig.insert(config_key::splitTunnelType, m_rawConfig[config_key::splitTunnelType]); - - QJsonArray splitTunnelSites = m_rawConfig[config_key::splitTunnelSites].toArray(); - - for(int index = 0; index < splitTunnelSites.count(); index++) { - splitTunnelSites[index] = splitTunnelSites[index].toString().remove(" "); - } - - wgConfig.insert(config_key::splitTunnelSites, splitTunnelSites); - - if (config.contains(config_key::allowed_ips) && config[config_key::allowed_ips].isArray()) { - wgConfig.insert(config_key::allowed_ips, config[config_key::allowed_ips]); - } else { - QJsonArray allowed_ips { "0.0.0.0/0", "::/0" }; - wgConfig.insert(config_key::allowed_ips, allowed_ips); - } - - if (config.contains(config_key::persistent_keep_alive)) { - wgConfig.insert(config_key::persistent_keep_alive, config[config_key::persistent_keep_alive]); - } else { - wgConfig.insert(config_key::persistent_keep_alive, "25"); - } - - wgConfig.insert(config_key::initPacketMagicHeader, config[config_key::initPacketMagicHeader]); - wgConfig.insert(config_key::responsePacketMagicHeader, config[config_key::responsePacketMagicHeader]); - wgConfig.insert(config_key::underloadPacketMagicHeader, config[config_key::underloadPacketMagicHeader]); - wgConfig.insert(config_key::transportPacketMagicHeader, config[config_key::transportPacketMagicHeader]); - - wgConfig.insert(config_key::initPacketJunkSize, config[config_key::initPacketJunkSize]); - wgConfig.insert(config_key::responsePacketJunkSize, config[config_key::responsePacketJunkSize]); - - wgConfig.insert(config_key::junkPacketCount, config[config_key::junkPacketCount]); - wgConfig.insert(config_key::junkPacketMinSize, config[config_key::junkPacketMinSize]); - wgConfig.insert(config_key::junkPacketMaxSize, config[config_key::junkPacketMaxSize]); - - QJsonDocument wgConfigDoc(wgConfig); - QString wgConfigDocStr(wgConfigDoc.toJson(QJsonDocument::Compact)); - - return startWireGuard(wgConfigDocStr); -} - -bool IosController::startOpenVPN(const QString &config) -{ - qDebug() << "IosController::startOpenVPN"; - - NETunnelProviderProtocol *tunnelProtocol = [[NETunnelProviderProtocol alloc] init]; - tunnelProtocol.providerBundleIdentifier = [NSString stringWithUTF8String:VPN_NE_BUNDLEID]; - tunnelProtocol.providerConfiguration = @{@"ovpn": [[NSString stringWithUTF8String:config.toStdString().c_str()] dataUsingEncoding:NSUTF8StringEncoding]}; - tunnelProtocol.serverAddress = m_serverAddress; - - m_currentTunnel.protocolConfiguration = tunnelProtocol; - - startTunnel(); -} - -bool IosController::startWireGuard(const QString &config) -{ - qDebug() << "IosController::startWireGuard"; - - NETunnelProviderProtocol *tunnelProtocol = [[NETunnelProviderProtocol alloc] init]; - tunnelProtocol.providerBundleIdentifier = [NSString stringWithUTF8String:VPN_NE_BUNDLEID]; - tunnelProtocol.providerConfiguration = @{@"wireguard": [[NSString stringWithUTF8String:config.toStdString().c_str()] dataUsingEncoding:NSUTF8StringEncoding]}; - tunnelProtocol.serverAddress = m_serverAddress; - - m_currentTunnel.protocolConfiguration = tunnelProtocol; - - startTunnel(); -} - -bool IosController::startXray(const QString &config) -{ - qDebug() << "IosController::startXray"; - - NETunnelProviderProtocol *tunnelProtocol = [[NETunnelProviderProtocol alloc] init]; - tunnelProtocol.providerBundleIdentifier = [NSString stringWithUTF8String:VPN_NE_BUNDLEID]; - tunnelProtocol.providerConfiguration = @{@"xray": [[NSString stringWithUTF8String:config.toStdString().c_str()] dataUsingEncoding:NSUTF8StringEncoding]}; - tunnelProtocol.serverAddress = m_serverAddress; - - m_currentTunnel.protocolConfiguration = tunnelProtocol; - - startTunnel(); -} - -void IosController::startTunnel() -{ - NSString *protocolName = @"Unknown"; - - NETunnelProviderProtocol *tunnelProtocol = (NETunnelProviderProtocol *)m_currentTunnel.protocolConfiguration; - if (tunnelProtocol.providerConfiguration[@"wireguard"] != nil) { - protocolName = @"WireGuard"; - } else if (tunnelProtocol.providerConfiguration[@"ovpn"] != nil) { - protocolName = @"OpenVPN"; - } - - m_rxBytes = 0; - m_txBytes = 0; - - [m_currentTunnel setEnabled:YES]; - - [m_currentTunnel saveToPreferencesWithCompletionHandler:^(NSError *saveError) { - dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ - - if (saveError) { - qDebug().nospace() << "IosController::startTunnel" << protocolName << ": Connect " << protocolName << " Tunnel Save Error" << saveError.localizedDescription.UTF8String; - emit connectionStateChanged(Vpn::ConnectionState::Error); - return; - } - - [m_currentTunnel loadFromPreferencesWithCompletionHandler:^(NSError *loadError) { - if (loadError) { - qDebug().nospace() << "IosController::startTunnel :" << m_currentTunnel.localizedDescription << protocolName << ": Connect " << protocolName << " Tunnel Load Error" << loadError.localizedDescription.UTF8String; - emit connectionStateChanged(Vpn::ConnectionState::Error); - return; - } - - NSError *startError = nil; - qDebug() << iosStatusToState(m_currentTunnel.connection.status); - - BOOL started = [m_currentTunnel.connection startVPNTunnelWithOptions:nil andReturnError:&startError]; - - if (!started || startError) { - qDebug().nospace() << "IosController::startTunnel :" << m_currentTunnel.localizedDescription << protocolName << " : Connect " << protocolName << " Tunnel Start Error" - << (startError ? startError.localizedDescription.UTF8String : ""); - emit connectionStateChanged(Vpn::ConnectionState::Error); - } else { - qDebug().nospace() << "IosController::startTunnel :" << m_currentTunnel.localizedDescription << protocolName << " : Starting the tunnel succeeded"; - } - }]; - }); - }]; -} - -bool IosController::isOurManager(NETunnelProviderManager* manager) { - NETunnelProviderProtocol* tunnelProto = (NETunnelProviderProtocol*)manager.protocolConfiguration; - - if (!tunnelProto) { - qDebug() << "Ignoring manager because the proto is invalid"; - return false; - } - - if (!tunnelProto.providerBundleIdentifier) { - qDebug() << "Ignoring manager because the bundle identifier is null"; - return false; - } - - if (![tunnelProto.providerBundleIdentifier isEqualToString:[NSString stringWithUTF8String:VPN_NE_BUNDLEID]]) { - qDebug() << "Ignoring manager because the bundle identifier doesn't match"; - return false; - } - - qDebug() << "Found the manager with the correct bundle identifier:" << QString::fromNSString(tunnelProto.providerBundleIdentifier); - - return true; -} - -void IosController::sendVpnExtensionMessage(NSDictionary* message, std::function callback) -{ - if (!m_currentTunnel) { - qDebug() << "Cannot set an extension callback without a tunnel manager"; - return; - } - - NSError *error = nil; - NSData *data = [NSJSONSerialization dataWithJSONObject:message options:0 error:&error]; - - if (!data || error) { - qDebug() << "Failed to serialize message to VpnExtension as JSON. Error:" - << [error.localizedDescription UTF8String]; - return; - } - - void (^completionHandler)(NSData *) = ^(NSData *responseData) { - if (!responseData) { - if (callback) callback(nil); - return; - } - - NSError *deserializeError = nil; - NSDictionary *response = [NSJSONSerialization JSONObjectWithData:responseData options:0 error:&deserializeError]; - - if (response && [response isKindOfClass:[NSDictionary class]]) { - if (callback) callback(response); - return; - } else if (deserializeError) { - qDebug() << "Failed to deserialize the VpnExtension response"; - } - - if (callback) callback(nil); - }; - - NETunnelProviderSession *session = (NETunnelProviderSession *)m_currentTunnel.connection; - - NSError *sendError = nil; - - if ([session respondsToSelector:@selector(sendProviderMessage:returnError:responseHandler:)]) { - [session sendProviderMessage:data returnError:&sendError responseHandler:completionHandler]; - } else { - qDebug() << "Method sendProviderMessage:responseHandler:error: does not exist"; - } - - if (sendError) { - qDebug() << "Failed to send message to VpnExtension. Error:" - << [sendError.localizedDescription UTF8String]; - } - -} - -bool IosController::shareText(const QStringList& filesToSend) { - NSMutableArray *sharingItems = [NSMutableArray new]; - - for (int i = 0; i < filesToSend.size(); i++) { - NSURL *logFileUrl = [[NSURL alloc] initFileURLWithPath:filesToSend[i].toNSString()]; - [sharingItems addObject:logFileUrl]; - } - - // UIViewController *qtController = getViewController(); - // if (!qtController) return; - - // UIActivityViewController *activityController = [[UIActivityViewController alloc] initWithActivityItems:sharingItems applicationActivities:nil]; - - __block bool isAccepted = false; - - // [activityController setCompletionWithItemsHandler:^(NSString *activityType, BOOL completed, NSArray *returnedItems, NSError *activityError) { - // isAccepted = completed; - // emit finished(); - // }]; - -// [qtController presentViewController:activityController animated:YES completion:nil]; -// UIPopoverPresentationController *popController = activityController.popoverPresentationController; -// if (popController) { -// popController.sourceView = qtController.view; -// popController.sourceRect = CGRectMake(100, 100, 100, 100); -// } - - QEventLoop wait; - QObject::connect(this, &IosController::finished, &wait, &QEventLoop::quit); - wait.exec(); - - return isAccepted; -} - -QString IosController::openFile() { - // UIDocumentPickerViewController *documentPicker = [[UIDocumentPickerViewController alloc] initWithDocumentTypes:@[@"public.item"] inMode:UIDocumentPickerModeOpen]; - - // DocumentPickerDelegate *documentPickerDelegate = [[DocumentPickerDelegate alloc] init]; - // documentPicker.delegate = documentPickerDelegate; - - // UIViewController *qtController = getViewController(); - // if (!qtController) return; - - // [qtController presentViewController:documentPicker animated:YES completion:nil]; - - __block QString filePath; - - // documentPickerDelegate.documentPickerClosedCallback = ^(NSString *path) { - // if (path) { - // filePath = QString::fromUtf8(path.UTF8String); - // } else { - // filePath = QString(); - // } - // emit finished(); - // }; - - QEventLoop wait; - QObject::connect(this, &IosController::finished, &wait, &QEventLoop::quit); - wait.exec(); - - return filePath; -} - -void IosController::requestInetAccess() { - NSURL *url = [NSURL URLWithString:@"http://captive.apple.com/generate_204"]; - if (url) { - qDebug() << "IosController::requestInetAccess URL error"; - return; - } - - NSURLSession *session = [NSURLSession sharedSession]; - NSURLSessionDataTask *task = [session dataTaskWithURL:url completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) { - if (error) { - qDebug() << "IosController::requestInetAccess error:" << error.localizedDescription; - } else { - NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *)response; - QString responseBody = QString::fromUtf8((const char*)data.bytes, data.length); - qDebug() << "IosController::requestInetAccess server response:" << httpResponse.statusCode << "\n\n" < -#import -#import -//#include -#include - -class IosController; - -@interface IosControllerWrapper : NSObject { - IosController *cppController; -} - -- (instancetype)initWithCppController:(IosController *)controller; -- (void)vpnStatusDidChange:(NSNotification *)notification; -- (void)vpnConfigurationDidChange:(NSNotification *)notification; - -@end - -typedef void (^DocumentPickerClosedCallback)(NSString *path); - -//@interface DocumentPickerDelegate : NSObject - -//@property (nonatomic, copy) DocumentPickerClosedCallback documentPickerClosedCallback; - -//@end diff --git a/client/platforms/macos_ne/ios_controller_wrapper.mm b/client/platforms/macos_ne/ios_controller_wrapper.mm deleted file mode 100644 index f5aa3e4f..00000000 --- a/client/platforms/macos_ne/ios_controller_wrapper.mm +++ /dev/null @@ -1,45 +0,0 @@ -#import "ios_controller_wrapper.h" -#include "ios_controller.h" - -@implementation IosControllerWrapper - -- (instancetype)initWithCppController:(IosController *)controller { - self = [super init]; - if (self) { - cppController = controller; - } - return self; -} - -- (void)vpnStatusDidChange:(NSNotification *)notification { - - NETunnelProviderSession *session = (NETunnelProviderSession *)notification.object; - - if (session ) { - cppController->vpnStatusDidChange(session); - } -} - -- (void) vpnConfigurationDidChange:(NSNotification *)notification { -// cppController->vpnStatusDidChange(notification); -} - -@end - -//@implementation DocumentPickerDelegate - -//- (void)documentPicker:(UIDocumentPickerViewController *)controller didPickDocumentsAtURLs:(NSArray *)urls { -// for (NSURL *url in urls) { -// if (self.documentPickerClosedCallback) { -// self.documentPickerClosedCallback([url path]); -// } -// } -//} - -//- (void)documentPickerWasCancelled:(UIDocumentPickerViewController *)controller { -// if (self.documentPickerClosedCallback) { -// self.documentPickerClosedCallback(nil); -// } -//} - -//@end diff --git a/client/platforms/macos_ne/iosglue.mm b/client/platforms/macos_ne/iosglue.mm deleted file mode 100644 index 1f3283e8..00000000 --- a/client/platforms/macos_ne/iosglue.mm +++ /dev/null @@ -1,244 +0,0 @@ -/* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ - -// This file contains all the C functions needed by the Wireguard swift code. - -#include -#include - -#ifndef NETWORK_EXTENSION -//# include "logger.h" -#else -# import -# import -#endif - -#define MAX_LOG_FILE_SIZE 204800 - -// Key base64/hex functions -// ------------------------ - -#define WG_KEY_LEN (32) -#define WG_KEY_LEN_BASE64 (45) -#define WG_KEY_LEN_HEX (65) - -#define EXPORT __attribute__((visibility("default"))) - -extern "C" { -EXPORT void key_to_base64(char base64[WG_KEY_LEN_BASE64], const uint8_t key[WG_KEY_LEN]); -EXPORT bool key_from_base64(uint8_t key[WG_KEY_LEN], const char* base64); - -EXPORT void key_to_hex(char hex[WG_KEY_LEN_HEX], const uint8_t key[WG_KEY_LEN]); -EXPORT bool key_from_hex(uint8_t key[WG_KEY_LEN], const char* hex); - -EXPORT bool key_eq(const uint8_t key1[WG_KEY_LEN], const uint8_t key2[WG_KEY_LEN]); - -EXPORT void write_msg_to_log(const char* tag, const char* msg); -} - -EXPORT void key_to_base64(char base64[WG_KEY_LEN_BASE64], const uint8_t key[WG_KEY_LEN]) { - const char range[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; - const char padchar = '='; - int padlen = 0; - - char* out = base64; - const uint8_t* in = key; - - for (int i = 0; i < WG_KEY_LEN;) { - int chunk = 0; - chunk |= int(in[i++]) << 16; - if (i == WG_KEY_LEN) { - padlen = 2; - } else { - chunk |= int(in[i++]) << 8; - if (i == WG_KEY_LEN) { - padlen = 1; - } else { - chunk |= int(in[i++]); - } - } - - int j = (chunk & 0x00fc0000) >> 18; - int k = (chunk & 0x0003f000) >> 12; - int l = (chunk & 0x00000fc0) >> 6; - int m = (chunk & 0x0000003f); - - *out++ = range[j]; - *out++ = range[k]; - - if (padlen > 1) { - *out++ = padchar; - } else { - *out++ = range[l]; - } - if (padlen > 0) { - *out++ = padchar; - } else { - *out++ = range[m]; - } - } - - base64[WG_KEY_LEN_BASE64 - 1] = 0; -} - -EXPORT bool key_from_base64(uint8_t key[WG_KEY_LEN], const char* base64) { - if (strlen(base64) != WG_KEY_LEN_BASE64 - 1 || base64[WG_KEY_LEN_BASE64 - 2] != '=') { - return false; - } - - unsigned int buf = 0; - int nbits = 0; - uint8_t* out = key; - int offset = 0; - for (int i = 0; i < WG_KEY_LEN_BASE64; ++i) { - int ch = base64[i]; - int d; - - if (ch >= 'A' && ch <= 'Z') { - d = ch - 'A'; - } else if (ch >= 'a' && ch <= 'z') { - d = ch - 'a' + 26; - } else if (ch >= '0' && ch <= '9') { - d = ch - '0' + 52; - } else if (ch == '+') { - d = 62; - } else if (ch == '/') { - d = 63; - } else { - d = -1; - } - - if (d != -1) { - buf = (buf << 6) | d; - nbits += 6; - if (nbits >= 8) { - nbits -= 8; - out[offset++] = buf >> nbits; - buf &= (1 << nbits) - 1; - } - } - } - - return true; -} - -inline char toHex(uint8_t value) { return "0123456789abcdef"[value & 0xF]; } - -inline int fromHex(uint8_t c) { - return ((c >= '0') && (c <= '9')) - ? int(c - '0') - : ((c >= 'A') && (c <= 'F')) ? int(c - 'A' + 10) - : ((c >= 'a') && (c <= 'f')) ? int(c - 'a' + 10) : -1; -} - -EXPORT void key_to_hex(char hex[WG_KEY_LEN_HEX], const uint8_t key[WG_KEY_LEN]) { - char* hexData = hex; - const unsigned char* data = (const unsigned char*)key; - for (int i = 0, o = 0; i < WG_KEY_LEN; ++i) { - hexData[o++] = toHex(data[i] >> 4); - hexData[o++] = toHex(data[i] & 0xf); - } - - hex[WG_KEY_LEN_HEX - 1] = 0; -} - -EXPORT bool key_from_hex(uint8_t key[WG_KEY_LEN], const char* hex) { - if (strlen(hex) != WG_KEY_LEN_HEX - 1) { - return false; - } - - bool odd_digit = true; - unsigned char* result = (unsigned char*)key + WG_KEY_LEN; - for (int i = WG_KEY_LEN_HEX - 1; i >= 0; --i) { - int tmp = fromHex((unsigned char)(hex[i])); - if (tmp == -1) { - continue; - } - - if (odd_digit) { - --result; - *result = tmp; - odd_digit = false; - } else { - *result |= tmp << 4; - odd_digit = true; - } - } - - return true; -} - -EXPORT bool key_eq(const uint8_t key1[WG_KEY_LEN], const uint8_t key2[WG_KEY_LEN]) { - for (int i = 0; i < WG_KEY_LEN; i++) { - if (key1[i] != key2[i]) { - return false; - } - } - return true; -} - -// Logging functions -// ----------------- - - -EXPORT void write_msg_to_log(const char* tag, const char* msg) { -#ifndef NETWORK_EXTENSION -// logger.debug() << "Swift log - tag:" << tag << "msg: " << msg; -#else - os_log_with_type(OS_LOG_DEFAULT, OS_LOG_TYPE_DEBUG, "tag: %s - msg: %s", tag, msg); - - @autoreleasepool { - NSString* groupId = [NSString stringWithUTF8String:GROUP_ID]; - NSURL* groupPath = - [[NSFileManager defaultManager] containerURLForSecurityApplicationGroupIdentifier:groupId]; - - NSURL* pathUrl = [groupPath URLByAppendingPathComponent:@"networkextension.log"]; - NSString* path = [pathUrl path]; - - if (![[NSFileManager defaultManager] fileExistsAtPath:path]) { - [[NSFileManager defaultManager] createFileAtPath:path contents:nil attributes:nil]; - } else { - NSError* error = nil; - - NSDictionary* fileAttributes = [[NSFileManager defaultManager] attributesOfItemAtPath:path - error:&error]; - - if (error) { - return; - } - - NSNumber* fileSizeNumber = [fileAttributes objectForKey:NSFileSize]; - long long fileSize = [fileSizeNumber longLongValue]; - - if (fileSize > MAX_LOG_FILE_SIZE) { - [[NSFileManager defaultManager] removeItemAtPath:path error:&error]; - [[NSFileManager defaultManager] createFileAtPath:path contents:nil attributes:nil]; - } - } - - NSError* error = nil; - NSFileHandle* fh = [NSFileHandle fileHandleForWritingToURL:pathUrl error:&error]; - if (!fh) { - return; - } - - NSString* dateString = [NSDateFormatter localizedStringFromDate:[NSDate date] - dateStyle:NSDateFormatterShortStyle - timeStyle:NSDateFormatterFullStyle]; - - NSString* str = [NSString stringWithFormat:@" - %s\n", msg]; - NSData* data = - [[dateString stringByAppendingString:str] dataUsingEncoding:NSUTF8StringEncoding]; - - @try { - [fh seekToEndOfFile]; - [fh writeData:data]; - } @catch (NSException* exception) { - } - - [fh closeFile]; - } - -#endif -} diff --git a/client/platforms/macos_ne/iosnetworkwatcher.h b/client/platforms/macos_ne/iosnetworkwatcher.h deleted file mode 100644 index 70609e1f..00000000 --- a/client/platforms/macos_ne/iosnetworkwatcher.h +++ /dev/null @@ -1,31 +0,0 @@ -/* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ - -#ifndef IOSNETWORKWATCHER_H -#define IOSNETWORKWATCHER_H - -#include - -#include "networkwatcherimpl.h" - -class IOSNetworkWatcher : public NetworkWatcherImpl { - public: - explicit IOSNetworkWatcher(QObject* parent); - ~IOSNetworkWatcher(); - - void initialize() override; - - private: - NetworkWatcherImpl::TransportType toTransportType(nw_path_t path); - void controllerStateChanged(); - - NetworkWatcherImpl::TransportType m_currentDefaultTransport = - NetworkWatcherImpl::TransportType_Unknown; - NetworkWatcherImpl::TransportType m_currentVPNTransport = - NetworkWatcherImpl::TransportType_Unknown; - nw_path_monitor_t m_networkMonitor = nil; - nw_connection_t m_observableConnection = nil; -}; - -#endif // IOSNETWORKWATCHER_H diff --git a/client/platforms/macos_ne/iosnetworkwatcher.mm b/client/platforms/macos_ne/iosnetworkwatcher.mm deleted file mode 100644 index 720b303b..00000000 --- a/client/platforms/macos_ne/iosnetworkwatcher.mm +++ /dev/null @@ -1,69 +0,0 @@ -/* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ - -#include "iosnetworkwatcher.h" - -#include "leakdetector.h" -#include "logger.h" - -#import - -namespace { -Logger logger("IOSNetworkWatcher"); -dispatch_queue_t s_queue = dispatch_queue_create("VPNNetwork.queue", DISPATCH_QUEUE_SERIAL); -} - -IOSNetworkWatcher::IOSNetworkWatcher(QObject* parent) : NetworkWatcherImpl(parent) { - MZ_COUNT_CTOR(IOSNetworkWatcher); -} - -IOSNetworkWatcher::~IOSNetworkWatcher() { - MZ_COUNT_DTOR(IOSNetworkWatcher); - if (m_networkMonitor != nil) { - nw_path_monitor_cancel(m_networkMonitor); - nw_release(m_networkMonitor); - } -} - -void IOSNetworkWatcher::initialize() { - m_networkMonitor = nw_path_monitor_create(); - nw_path_monitor_set_queue(m_networkMonitor, s_queue); - nw_path_monitor_set_update_handler(m_networkMonitor, ^(nw_path_t _Nonnull path) { - m_currentDefaultTransport = toTransportType(path); - }); - nw_path_monitor_start(m_networkMonitor); - - //TODO IMPL FOR AMNEZIA -} - -NetworkWatcherImpl::TransportType IOSNetworkWatcher::toTransportType(nw_path_t path) { - if (path == nil) { - return NetworkWatcherImpl::TransportType_Unknown; - } - auto status = nw_path_get_status(path); - if (status != nw_path_status_satisfied && status != nw_path_status_satisfiable) { - // We're offline. - return NetworkWatcherImpl::TransportType_None; - } - if (nw_path_uses_interface_type(path, nw_interface_type_wifi)) { - return NetworkWatcherImpl::TransportType_WiFi; - } - if (nw_path_uses_interface_type(path, nw_interface_type_wired)) { - return NetworkWatcherImpl::TransportType_Ethernet; - } - if (nw_path_uses_interface_type(path, nw_interface_type_cellular)) { - return NetworkWatcherImpl::TransportType_Cellular; - } - if (nw_path_uses_interface_type(path, nw_interface_type_other)) { - return NetworkWatcherImpl::TransportType_Other; - } - if (nw_path_uses_interface_type(path, nw_interface_type_loopback)) { - return NetworkWatcherImpl::TransportType_Other; - } - return NetworkWatcherImpl::TransportType_Unknown; -} - -void IOSNetworkWatcher::controllerStateChanged() { - //TODO IMPL FOR AMNEZIA -} diff --git a/client/platforms/macos_ne/iosnotificationhandler.h b/client/platforms/macos_ne/iosnotificationhandler.h deleted file mode 100644 index 2845016a..00000000 --- a/client/platforms/macos_ne/iosnotificationhandler.h +++ /dev/null @@ -1,28 +0,0 @@ -/* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ - -#ifndef IOSNOTIFICATIONHANDLER_H -#define IOSNOTIFICATIONHANDLER_H - -#include "ui/notificationhandler.h" - -#include - -class IOSNotificationHandler final : public NotificationHandler { - Q_DISABLE_COPY_MOVE(IOSNotificationHandler) - - public: - IOSNotificationHandler(QObject* parent); - ~IOSNotificationHandler(); - - protected: - void notify(Message type, const QString& title, const QString& message, - int timerMsec) override; - - private: - void* m_delegate = nullptr; -}; - - -#endif // IOSNOTIFICATIONHANDLER_H diff --git a/client/platforms/macos_ne/iosnotificationhandler.mm b/client/platforms/macos_ne/iosnotificationhandler.mm deleted file mode 100644 index a1aa3d8d..00000000 --- a/client/platforms/macos_ne/iosnotificationhandler.mm +++ /dev/null @@ -1,89 +0,0 @@ -/* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ - -#include "platforms/macos_ne/iosnotificationhandler.h" - -#import -#import - -// Removed the UIResponder and UIApplicationDelegate references as these are not available in macOS -@interface IOSNotificationDelegate - : NSObject { - IOSNotificationHandler* m_iosNotificationHandler; -} -@end - -@implementation IOSNotificationDelegate - -- (id)initWithObject:(IOSNotificationHandler*)notification { - self = [super init]; // Removed `super init` as it refers to UIResponder, which is iOS specific - if (self) { - m_iosNotificationHandler = notification; - } - return self; -} - -- (void)userNotificationCenter:(UNUserNotificationCenter*)center - willPresentNotification:(UNNotification*)notification - withCompletionHandler: - (void (^)(UNNotificationPresentationOptions options))completionHandler { - Q_UNUSED(center) - completionHandler(UNNotificationPresentationOptionList | UNNotificationPresentationOptionBanner); -} - -- (void)userNotificationCenter:(UNUserNotificationCenter*)center - didReceiveNotificationResponse:(UNNotificationResponse*)response - withCompletionHandler:(void (^)())completionHandler { - Q_UNUSED(center) - Q_UNUSED(response) - completionHandler(); -} -@end - -IOSNotificationHandler::IOSNotificationHandler(QObject* parent) : NotificationHandler(parent) { - - UNUserNotificationCenter* center = [UNUserNotificationCenter currentNotificationCenter]; - [center requestAuthorizationWithOptions:(UNAuthorizationOptionSound | UNAuthorizationOptionAlert | - UNAuthorizationOptionBadge) - completionHandler:^(BOOL granted, NSError* _Nullable error) { - Q_UNUSED(granted); - if (!error) { - m_delegate = [[IOSNotificationDelegate alloc] initWithObject:this]; - } - }]; -} - -IOSNotificationHandler::~IOSNotificationHandler() { } - -void IOSNotificationHandler::notify(NotificationHandler::Message type, const QString& title, - const QString& message, int timerMsec) { - Q_UNUSED(type); - - if (!m_delegate) { - return; - } - - UNMutableNotificationContent* content = [[UNMutableNotificationContent alloc] init]; - content.title = title.toNSString(); - content.body = message.toNSString(); - content.sound = [UNNotificationSound defaultSound]; - - int timerSec = timerMsec / 1000; - UNTimeIntervalNotificationTrigger* trigger = - [UNTimeIntervalNotificationTrigger triggerWithTimeInterval:timerSec repeats:NO]; - - UNNotificationRequest* request = [UNNotificationRequest requestWithIdentifier:@"amneziavpn" - content:content - trigger:trigger]; - - UNUserNotificationCenter* center = [UNUserNotificationCenter currentNotificationCenter]; - center.delegate = (id)m_delegate; - - [center addNotificationRequest:request - withCompletionHandler:^(NSError* _Nullable error) { - if (error) { - NSLog(@"Local Notification failed"); - } - }]; -} diff --git a/client/ui/notificationhandler.cpp b/client/ui/notificationhandler.cpp index ae588600..b8ad8957 100644 --- a/client/ui/notificationhandler.cpp +++ b/client/ui/notificationhandler.cpp @@ -5,10 +5,10 @@ #include #include "notificationhandler.h" -#if defined(Q_OS_IOS) && !defined(MACOS_NE) +#if defined(Q_OS_IOS) || defined(MACOS_NE) # include "platforms/ios/iosnotificationhandler.h" -#elif defined(MACOS_NE) -# include "platforms/macos_ne/iosnotificationhandler.h" +// #elif defined(MACOS_NE) +// # include "platforms/ios/iosnotificationhandler.h" #else # include "systemtray_notificationhandler.h" #endif diff --git a/client/ui/systemtray_notificationhandler.h b/client/ui/systemtray_notificationhandler.h index 60bf0b35..a3fb84cc 100644 --- a/client/ui/systemtray_notificationhandler.h +++ b/client/ui/systemtray_notificationhandler.h @@ -8,7 +8,7 @@ #include "notificationhandler.h" #include -#include +#include 'QMenu' file not found class SystemTrayNotificationHandler : public NotificationHandler { Q_OBJECT From 5569524efa661e494d4f5fa4d701b593af22c7af Mon Sep 17 00:00:00 2001 From: Macbook Date: Wed, 9 Oct 2024 14:58:53 +0700 Subject: [PATCH 08/38] update all lib --- .gitmodules | 2 ++ client/3rd-prebuilt | 2 +- client/macos/scripts/openvpn.sh | 14 +++++++------- 3 files changed, 10 insertions(+), 8 deletions(-) diff --git a/.gitmodules b/.gitmodules index 3ceaa56e..e9e25286 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,6 +1,7 @@ [submodule "client/3rd/OpenVPNAdapter"] path = client/3rd/OpenVPNAdapter url = https://github.com/amnezia-vpn/OpenVPNAdapter.git + branch = macos-dirty-build [submodule "client/3rd/qtkeychain"] path = client/3rd/qtkeychain url = https://github.com/frankosterfeld/qtkeychain.git @@ -10,6 +11,7 @@ [submodule "client/3rd-prebuilt"] path = client/3rd-prebuilt url = https://github.com/amnezia-vpn/3rd-prebuilt + branch = fixbug/mac-network-extension [submodule "client/3rd/amneziawg-apple"] path = client/3rd/amneziawg-apple url = https://github.com/amnezia-vpn/amneziawg-apple diff --git a/client/3rd-prebuilt b/client/3rd-prebuilt index ba580dc5..435aaa79 160000 --- a/client/3rd-prebuilt +++ b/client/3rd-prebuilt @@ -1 +1 @@ -Subproject commit ba580dc5bd7784f7b1e110ff0365f3286e549a61 +Subproject commit 435aaa793d8ce455ef4a3b2f5ff5e38f187d8efb diff --git a/client/macos/scripts/openvpn.sh b/client/macos/scripts/openvpn.sh index 1a0bba47..8c371618 100644 --- a/client/macos/scripts/openvpn.sh +++ b/client/macos/scripts/openvpn.sh @@ -4,10 +4,10 @@ XCODEBUILD="/usr/bin/xcodebuild" WORKINGDIR=`pwd` PATCH="/usr/bin/patch" -echo "Building OpenVPNAdapter for macOS ..." +echo "Building OpenVPNAdapter for macOS Network Extension (MacNE)..." -# Copy the Project.xcconfig settings to amnezia.xcconfig -cat $WORKINGDIR/3rd/OpenVPNAdapter/Configuration/Project.xcconfig > $WORKINGDIR/3rd/OpenVPNAdapter/Configuration/amnezia.xcconfig +# Copy the Project-MacNE.xcconfig settings to amnezia.xcconfig +cat $WORKINGDIR/3rd/OpenVPNAdapter/Configuration/Project-MacNE.xcconfig > $WORKINGDIR/3rd/OpenVPNAdapter/Configuration/amnezia.xcconfig # Append macOS-specific build directory configurations to amnezia.xcconfig cat << EOF >> $WORKINGDIR/3rd/OpenVPNAdapter/Configuration/amnezia.xcconfig @@ -16,8 +16,8 @@ CONFIGURATION_BUILD_DIR = $WORKINGDIR/3rd/OpenVPNAdapter/build/Release-macos BUILT_PRODUCTS_DIR = $WORKINGDIR/3rd/OpenVPNAdapter/build/Release-macos EOF -# Add LDFLAGS for macOS, exclude UIKit which is for iOS only -echo "OTHER_LDFLAGS = -framework Cocoa" >> $WORKINGDIR/3rd/OpenVPNAdapter/Configuration/amnezia.xcconfig +# Exclude UIKit, include Cocoa for macOS +# echo "OTHER_LDFLAGS = -framework Cocoa" >> $WORKINGDIR/3rd/OpenVPNAdapter/Configuration/amnezia.xcconfig # Fetch the current macOS SDK version dynamically MACOSX_SDK=$(xcrun --sdk macosx --show-sdk-path | sed -E 's/.*MacOSX([0-9]+\.[0-9]+)\.sdk/\1/') @@ -28,9 +28,9 @@ cd 3rd/OpenVPNAdapter # Build for macOS using the correct SDK and destination if $XCODEBUILD -scheme OpenVPNAdapter -configuration Release -xcconfig Configuration/amnezia.xcconfig -sdk macosx$MACOSX_SDK -destination 'generic/platform=macOS' -project OpenVPNAdapter.xcodeproj ; then - echo "OpenVPNAdapter built successfully for macOS" + echo "OpenVPNAdapter built successfully for macOS Network Extension (MacNE)" else - echo "OpenVPNAdapter macOS build failed ..." + echo "OpenVPNAdapter macOS Network Extension (MacNE) build failed..." fi # Remove CodeSignature if needed for macOS From ae16b1951532c90c7473a9d62e7040bdb8cb6891 Mon Sep 17 00:00:00 2001 From: Macbook Date: Wed, 9 Oct 2024 20:44:00 +0700 Subject: [PATCH 09/38] fix build on github --- client/CMakeLists.txt | 49 ++++++++++++++++++++++--------------------- 1 file changed, 25 insertions(+), 24 deletions(-) diff --git a/client/CMakeLists.txt b/client/CMakeLists.txt index fdb1f085..acdb6403 100644 --- a/client/CMakeLists.txt +++ b/client/CMakeLists.txt @@ -424,33 +424,34 @@ if(NOT IOS AND NOT ANDROID AND NOT MACOS_NE) endif() target_sources(${PROJECT} PRIVATE ${SOURCES} ${HEADERS} ${RESOURCES} ${QRC} ${I18NQRC}) -# Sao chép QtConcurrent.framework vào thư mục Frameworks -add_custom_command(TARGET ${PROJECT} POST_BUILD - COMMAND ${CMAKE_COMMAND} -E make_directory - "$/Contents/Frameworks" - - COMMAND ${CMAKE_COMMAND} -E copy_directory - "/Users/macbook/Qt/6.8.0/macos/lib/QtConcurrent.framework" - "$/Contents/Frameworks/QtConcurrent.framework" - - COMMENT "Copying QtConcurrent.framework to the bundle's Frameworks directory" -) +# if(APPLE AND NOT ANDROID) +# # MacOS specific bundle operations +# add_custom_command(TARGET ${PROJECT} POST_BUILD +# COMMAND ${CMAKE_COMMAND} -E make_directory +# "$/Contents/Frameworks" +# COMMAND ${CMAKE_COMMAND} -E copy_directory +# "/Users/macbook/Qt/6.8.0/macos/lib/QtConcurrent.framework" +# "$/Contents/Frameworks/QtConcurrent.framework" -# Triển khai ứng dụng với macdeployqt và ký mã (nếu cần) -add_custom_command(TARGET ${PROJECT} POST_BUILD - COMMAND ${QT_BIN_DIR_DETECTED}/macdeployqt $ -appstore-compliant -qmldir=${CMAKE_CURRENT_SOURCE_DIR} -) +# COMMENT "Copying QtConcurrent.framework to the bundle's Frameworks directory" +# ) -# Nếu ở chế độ Release, ký mã gói ứng dụng -if(CMAKE_BUILD_TYPE STREQUAL "Release") - SET(SIGN_CMD codesign --deep --force --sign 'Apple Distribution: Privacy Technologies OU \(X7UJ388FXK\)' --timestamp --options runtime $) - message("Manual signing bundle...") - message(${SIGN_CMD}) +# # MacOS specific application deployment +# add_custom_command(TARGET ${PROJECT} POST_BUILD +# COMMAND ${QT_BIN_DIR_DETECTED}/macdeployqt $ -appstore-compliant -qmldir=${CMAKE_CURRENT_SOURCE_DIR} +# ) - add_custom_command(TARGET ${PROJECT} POST_BUILD - COMMAND ${SIGN_CMD} - ) -endif() +# # MacOS specific code signing for Release +# if(CMAKE_BUILD_TYPE STREQUAL "Release") +# SET(SIGN_CMD codesign --deep --force --sign 'Apple Distribution: Privacy Technologies OU \(X7UJ388FXK\)' --timestamp --options runtime $) +# message("Manual signing bundle...") +# message(${SIGN_CMD}) + +# add_custom_command(TARGET ${PROJECT} POST_BUILD +# COMMAND ${SIGN_CMD} +# ) +# endif() +# endif() qt_finalize_target(${PROJECT}) From 226f9b9316385f07f1ae7240ce6035a887bb4fc2 Mon Sep 17 00:00:00 2001 From: Macbook Date: Wed, 9 Oct 2024 21:04:35 +0700 Subject: [PATCH 10/38] add build ci/cd for macos ne --- .github/workflows/deploy.yml | 68 ++++++++++++++++++++++++++++++++++++ 1 file changed, 68 insertions(+) diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index d9138516..02f6efe1 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -293,6 +293,74 @@ jobs: name: AmneziaVPN_MacOS_unpacked path: deploy/build/client/AmneziaVPN.app retention-days: 7 +# ------------------------------------------------------ + Build-MacOS-NE: + runs-on: macos-latest + + env: + QT_VERSION: 6.8.0 + QT_MIRROR: https://mirrors.ocf.berkeley.edu/qt/ + PROD_AGW_PUBLIC_KEY: ${{ secrets.PROD_AGW_PUBLIC_KEY }} + DEV_AGW_PUBLIC_KEY: ${{ secrets.DEV_AGW_PUBLIC_KEY }} + + steps: + - name: 'Setup Xcode' + uses: maxim-lobanov/setup-xcode@v1 + with: + xcode-version: '14.3.1' + + - name: 'Install Desktop Qt' + uses: jurplel/install-qt-action@v3 + with: + version: ${{ env.QT_VERSION }} + host: 'mac' + target: 'desktop' + arch: 'clang_64' + modules: 'qtremoteobjects qt5compat qtshadertools' + dir: ${{ runner.temp }} + set-env: 'true' + extra: '--external 7z --base ${{ env.QT_MIRROR }}' + + - name: 'Install Go' + uses: actions/setup-go@v5 + with: + go-version: '1.22.1' + cache: false + + - name: 'Setup gomobile' + run: | + export PATH=$PATH:~/go/bin + go install golang.org/x/mobile/cmd/gomobile@latest + gomobile init + + - name: 'Get sources' + uses: actions/checkout@v4 + with: + submodules: 'true' + fetch-depth: 10 + + - name: 'Setup ccache' + uses: hendrikmuhs/ccache-action@v1.2 + + - name: 'Install dependencies' + run: pip install jsonschema jinja2 + + - name: 'Build macOS NE' + run: | + git submodule update --init --recursive + export QT_BIN_DIR="${{ runner.temp }}/Qt/${{ env.QT_VERSION }}/macos/bin" + export QT_MACOS_ROOT_DIR="${{ runner.temp }}/Qt/${{ env.QT_VERSION }}/macos" + export PATH=$PATH:~/go/bin + mkdir build-macos + $QT_BIN_DIR/qt-cmake . -B build-macos -GXcode -DQT_HOST_PATH=$QT_MACOS_ROOT_DIR -DMACOS_NE=TRUE + xcodebuild -project build-macos/MyApp.xcodeproj -configuration Release + + - name: 'Upload installer artifact' + uses: actions/upload-artifact@v4 + with: + name: AmneziaVPN_MacOS_NE_installer + path: build-macos/Release/AmneziaVPN.dmg + retention-days: 7 # ------------------------------------------------------ From 0500f1887c3e1d888536d4f0544acbc040b81d75 Mon Sep 17 00:00:00 2001 From: Macbook Date: Wed, 9 Oct 2024 21:16:57 +0700 Subject: [PATCH 11/38] add qtmultimedia --- .github/workflows/deploy.yml | 2 +- client/CMakeLists.txt | 48 ++++++++++++++++++------------------ 2 files changed, 25 insertions(+), 25 deletions(-) diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index 02f6efe1..f7828537 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -316,7 +316,7 @@ jobs: host: 'mac' target: 'desktop' arch: 'clang_64' - modules: 'qtremoteobjects qt5compat qtshadertools' + modules: 'qtremoteobjects qt5compat qtshadertools qtmultimedia' dir: ${{ runner.temp }} set-env: 'true' extra: '--external 7z --base ${{ env.QT_MIRROR }}' diff --git a/client/CMakeLists.txt b/client/CMakeLists.txt index acdb6403..f3a87357 100644 --- a/client/CMakeLists.txt +++ b/client/CMakeLists.txt @@ -424,34 +424,34 @@ if(NOT IOS AND NOT ANDROID AND NOT MACOS_NE) endif() target_sources(${PROJECT} PRIVATE ${SOURCES} ${HEADERS} ${RESOURCES} ${QRC} ${I18NQRC}) -# if(APPLE AND NOT ANDROID) -# # MacOS specific bundle operations -# add_custom_command(TARGET ${PROJECT} POST_BUILD -# COMMAND ${CMAKE_COMMAND} -E make_directory -# "$/Contents/Frameworks" +if(MACOS_NE) + # MacOS specific bundle operations + add_custom_command(TARGET ${PROJECT} POST_BUILD + COMMAND ${CMAKE_COMMAND} -E make_directory + "$/Contents/Frameworks" -# COMMAND ${CMAKE_COMMAND} -E copy_directory -# "/Users/macbook/Qt/6.8.0/macos/lib/QtConcurrent.framework" -# "$/Contents/Frameworks/QtConcurrent.framework" + COMMAND ${CMAKE_COMMAND} -E copy_directory + "/Users/macbook/Qt/6.8.0/macos/lib/QtConcurrent.framework" + "$/Contents/Frameworks/QtConcurrent.framework" -# COMMENT "Copying QtConcurrent.framework to the bundle's Frameworks directory" -# ) + COMMENT "Copying QtConcurrent.framework to the bundle's Frameworks directory" + ) -# # MacOS specific application deployment -# add_custom_command(TARGET ${PROJECT} POST_BUILD -# COMMAND ${QT_BIN_DIR_DETECTED}/macdeployqt $ -appstore-compliant -qmldir=${CMAKE_CURRENT_SOURCE_DIR} -# ) + # MacOS specific application deployment + add_custom_command(TARGET ${PROJECT} POST_BUILD + COMMAND ${QT_BIN_DIR_DETECTED}/macdeployqt $ -appstore-compliant -qmldir=${CMAKE_CURRENT_SOURCE_DIR} + ) -# # MacOS specific code signing for Release -# if(CMAKE_BUILD_TYPE STREQUAL "Release") -# SET(SIGN_CMD codesign --deep --force --sign 'Apple Distribution: Privacy Technologies OU \(X7UJ388FXK\)' --timestamp --options runtime $) -# message("Manual signing bundle...") -# message(${SIGN_CMD}) + # MacOS specific code signing for Release + if(CMAKE_BUILD_TYPE STREQUAL "Release") + SET(SIGN_CMD codesign --deep --force --sign 'Apple Distribution: Privacy Technologies OU \(X7UJ388FXK\)' --timestamp --options runtime $) + message("Manual signing bundle...") + message(${SIGN_CMD}) -# add_custom_command(TARGET ${PROJECT} POST_BUILD -# COMMAND ${SIGN_CMD} -# ) -# endif() -# endif() + add_custom_command(TARGET ${PROJECT} POST_BUILD + COMMAND ${SIGN_CMD} + ) + endif() +endif() qt_finalize_target(${PROJECT}) From b338a4fb79ef859e73fc8ea99e3bfb38ec3c984b Mon Sep 17 00:00:00 2001 From: Macbook Date: Wed, 9 Oct 2024 21:53:33 +0700 Subject: [PATCH 12/38] update build.sh --- .github/workflows/deploy.yml | 34 ++----- deploy/build_macos_ne.sh | 175 +++++++++++++++++++++++++++++++++++ 2 files changed, 185 insertions(+), 24 deletions(-) create mode 100755 deploy/build_macos_ne.sh diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index f7828537..62c18b4a 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -327,40 +327,26 @@ jobs: go-version: '1.22.1' cache: false - - name: 'Setup gomobile' - run: | - export PATH=$PATH:~/go/bin - go install golang.org/x/mobile/cmd/gomobile@latest - gomobile init - - name: 'Get sources' uses: actions/checkout@v4 with: submodules: 'true' fetch-depth: 10 - - name: 'Setup ccache' - uses: hendrikmuhs/ccache-action@v1.2 - - name: 'Install dependencies' run: pip install jsonschema jinja2 - - name: 'Build macOS NE' - run: | - git submodule update --init --recursive - export QT_BIN_DIR="${{ runner.temp }}/Qt/${{ env.QT_VERSION }}/macos/bin" - export QT_MACOS_ROOT_DIR="${{ runner.temp }}/Qt/${{ env.QT_VERSION }}/macos" - export PATH=$PATH:~/go/bin - mkdir build-macos - $QT_BIN_DIR/qt-cmake . -B build-macos -GXcode -DQT_HOST_PATH=$QT_MACOS_ROOT_DIR -DMACOS_NE=TRUE - xcodebuild -project build-macos/MyApp.xcodeproj -configuration Release + - name: 'Set execute permissions for deploy script' + run: chmod +x deploy/deploy_macos_ne.sh - - name: 'Upload installer artifact' - uses: actions/upload-artifact@v4 - with: - name: AmneziaVPN_MacOS_NE_installer - path: build-macos/Release/AmneziaVPN.dmg - retention-days: 7 + - name: 'Build and deploy macOS NE' + run: bash deploy/deploy_macos_ne.sh + env: + MAC_CERT_PW: ${{ secrets.MAC_CERT_PW }} + MAC_SIGNER_ID: ${{ secrets.MAC_SIGNER_ID }} + APPLE_DEV_EMAIL: ${{ secrets.APPLE_DEV_EMAIL }} + MAC_TEAM_ID: ${{ secrets.MAC_TEAM_ID }} + APPLE_DEV_PASSWORD: ${{ secrets.APPLE_DEV_PASSWORD }} # ------------------------------------------------------ diff --git a/deploy/build_macos_ne.sh b/deploy/build_macos_ne.sh new file mode 100755 index 00000000..12b1572d --- /dev/null +++ b/deploy/build_macos_ne.sh @@ -0,0 +1,175 @@ +#!/bin/bash +echo "Build script started ..." + +set -o errexit -o nounset + +while getopts n flag +do + case "${flag}" in + n) NOTARIZE_APP=1;; + esac +done + +# Hold on to current directory +PROJECT_DIR=$(pwd) +DEPLOY_DIR=$PROJECT_DIR/deploy + +mkdir -p $DEPLOY_DIR/build +BUILD_DIR=$DEPLOY_DIR/build + +echo "Project dir: ${PROJECT_DIR}" +echo "Build dir: ${BUILD_DIR}" + +APP_NAME=AmneziaVPN +APP_FILENAME=$APP_NAME.app +APP_DOMAIN=org.amneziavpn.package +PLIST_NAME=$APP_NAME.plist + +OUT_APP_DIR=$BUILD_DIR/client +BUNDLE_DIR=$OUT_APP_DIR/$APP_FILENAME + +PREBUILT_DEPLOY_DATA_DIR=$PROJECT_DIR/deploy/data/deploy-prebuilt/macos +DEPLOY_DATA_DIR=$PROJECT_DIR/deploy/data/macos + +INSTALLER_DATA_DIR=$BUILD_DIR/installer/packages/$APP_DOMAIN/data +INSTALLER_BUNDLE_DIR=$BUILD_DIR/installer/$APP_FILENAME +DMG_FILENAME=$PROJECT_DIR/${APP_NAME}.dmg + +# Search Qt +if [ -z "${QT_VERSION+x}" ]; then +QT_VERSION=6.8.0; +QIF_VERSION=4.7 +QT_BIN_DIR=$HOME/Qt/$QT_VERSION/macos/bin +QIF_BIN_DIR=$QT_BIN_DIR/../../../Tools/QtInstallerFramework/$QIF_VERSION/bin +fi + +echo "Using Qt in $QT_BIN_DIR" +echo "Using QIF in $QIF_BIN_DIR" + +# Setup environment paths +export QT_BIN_DIR=$HOME/Qt/$QT_VERSION/macos/bin +export QT_MACOS_ROOT_DIR=$HOME/Qt/$QT_VERSION/macos +export QT_MACOS_BIN=$QT_BIN_DIR +export PATH=$PATH:~/go/bin + +# Checking env +$QT_BIN_DIR/qt-cmake --version +cmake --version +clang -v + +# Build App +echo "Building App..." +mkdir -p build-macos +cd build-macos + +$QT_MACOS_BIN/qt-cmake .. -GXcode -DQT_HOST_PATH=$QT_MACOS_ROOT_DIR -DMACOS_NE=TRUE +cmake --build . --config release --target all + +# Build and run tests here + +echo "____________________________________" +echo "............Deploy.................." +echo "____________________________________" + +# Package +echo "Packaging ..." + +cp -Rv $PREBUILT_DEPLOY_DATA_DIR/* $BUNDLE_DIR/Contents/macOS +$QT_BIN_DIR/macdeployqt $OUT_APP_DIR/$APP_FILENAME -always-overwrite -qmldir=$PROJECT_DIR +cp -av $BUILD_DIR/service/server/$APP_NAME-service $BUNDLE_DIR/Contents/macOS +cp -Rv $PROJECT_DIR/deploy/data/macos/* $BUNDLE_DIR/Contents/macOS +rm -f $BUNDLE_DIR/Contents/macOS/post_install.sh $BUNDLE_DIR/Contents/macOS/post_uninstall.sh + +if [ "${MAC_CERT_PW+x}" ]; then + + CERTIFICATE_P12=$DEPLOY_DIR/PrivacyTechAppleCertDeveloperId.p12 + WWDRCA=$DEPLOY_DIR/WWDRCA.cer + KEYCHAIN=amnezia.build.macos.keychain + TEMP_PASS=tmp_pass + + security create-keychain -p $TEMP_PASS $KEYCHAIN || true + security default-keychain -s $KEYCHAIN + security unlock-keychain -p $TEMP_PASS $KEYCHAIN + + security default-keychain + security list-keychains + + security import $WWDRCA -k $KEYCHAIN -T /usr/bin/codesign || true + security import $CERTIFICATE_P12 -k $KEYCHAIN -P $MAC_CERT_PW -T /usr/bin/codesign || true + + security set-key-partition-list -S apple-tool:,apple: -k $TEMP_PASS $KEYCHAIN + security find-identity -p codesigning + + echo "Signing App bundle..." + /usr/bin/codesign --deep --force --verbose --timestamp -o runtime --sign "$MAC_SIGNER_ID" $BUNDLE_DIR + /usr/bin/codesign --verify -vvvv $BUNDLE_DIR || true + spctl -a -vvvv $BUNDLE_DIR || true + + if [ "${NOTARIZE_APP+x}" ]; then + echo "Notarizing App bundle..." + /usr/bin/ditto -c -k --keepParent $BUNDLE_DIR $PROJECT_DIR/Bundle_to_notarize.zip + xcrun notarytool submit $PROJECT_DIR/Bundle_to_notarize.zip --apple-id $APPLE_DEV_EMAIL --team-id $MAC_TEAM_ID --password $APPLE_DEV_PASSWORD + rm $PROJECT_DIR/Bundle_to_notarize.zip + sleep 300 + xcrun stapler staple $BUNDLE_DIR + xcrun stapler validate $BUNDLE_DIR + spctl -a -vvvv $BUNDLE_DIR || true + fi +fi + +echo "Packaging installer..." +mkdir -p $INSTALLER_DATA_DIR +cp -av $PROJECT_DIR/deploy/installer $BUILD_DIR +cp -av $DEPLOY_DATA_DIR/post_install.sh $INSTALLER_DATA_DIR/post_install.sh +cp -av $DEPLOY_DATA_DIR/post_uninstall.sh $INSTALLER_DATA_DIR/post_uninstall.sh +cp -av $DEPLOY_DATA_DIR/$PLIST_NAME $INSTALLER_DATA_DIR/$PLIST_NAME + +chmod a+x $INSTALLER_DATA_DIR/post_install.sh $INSTALLER_DATA_DIR/post_uninstall.sh + +cd $BUNDLE_DIR +tar czf $INSTALLER_DATA_DIR/$APP_NAME.tar.gz ./ + +echo "Building installer..." +$QIF_BIN_DIR/binarycreator --offline-only -v -c $BUILD_DIR/installer/config/macos.xml -p $BUILD_DIR/installer/packages -f $INSTALLER_BUNDLE_DIR + +if [ "${MAC_CERT_PW+x}" ]; then + echo "Signing installer bundle..." + security unlock-keychain -p $TEMP_PASS $KEYCHAIN + /usr/bin/codesign --deep --force --verbose --timestamp -o runtime --sign "$MAC_SIGNER_ID" $INSTALLER_BUNDLE_DIR + /usr/bin/codesign --verify -vvvv $INSTALLER_BUNDLE_DIR || true + + if [ "${NOTARIZE_APP+x}" ]; then + echo "Notarizing installer bundle..." + /usr/bin/ditto -c -k --keepParent $INSTALLER_BUNDLE_DIR $PROJECT_DIR/Installer_bundle_to_notarize.zip + xcrun notarytool submit $PROJECT_DIR/Installer_bundle_to_notarize.zip --apple-id $APPLE_DEV_EMAIL --team-id $MAC_TEAM_ID --password $APPLE_DEV_PASSWORD + rm $PROJECT_DIR/Installer_bundle_to_notarize.zip + sleep 300 + xcrun stapler staple $INSTALLER_BUNDLE_DIR + xcrun stapler validate $INSTALLER_BUNDLE_DIR + spctl -a -vvvv $INSTALLER_BUNDLE_DIR || true + fi +fi + +echo "Building DMG installer..." +# Allow Terminal to make changes in Privacy & Security > App Management +hdiutil create -size 256mb -volname AmneziaVPN -srcfolder $BUILD_DIR/installer/$APP_NAME.app -ov -format UDZO $DMG_FILENAME + +if [ "${MAC_CERT_PW+x}" ]; then + echo "Signing DMG installer..." + security unlock-keychain -p $TEMP_PASS $KEYCHAIN + /usr/bin/codesign --deep --force --verbose --timestamp -o runtime --sign "$MAC_SIGNER_ID" $DMG_FILENAME + /usr/bin/codesign --verify -vvvv $DMG_FILENAME || true + + if [ "${NOTARIZE_APP+x}" ]; then + echo "Notarizing DMG installer..." + xcrun notarytool submit $DMG_FILENAME --apple-id $APPLE_DEV_EMAIL --team-id $MAC_TEAM_ID --password $APPLE_DEV_PASSWORD + sleep 300 + xcrun stapler staple $DMG_FILENAME + xcrun stapler validate $DMG_FILENAME + fi +fi + +echo "Finished, artifact is $DMG_FILENAME" + +# restore keychain +security default-keychain -s login.keychain From 31938899a28861ee1c7ffa4d00270625b31f01b6 Mon Sep 17 00:00:00 2001 From: Macbook Date: Wed, 9 Oct 2024 21:59:25 +0700 Subject: [PATCH 13/38] update build.sh --- .github/workflows/deploy.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index 62c18b4a..f5fa3a0f 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -337,10 +337,10 @@ jobs: run: pip install jsonschema jinja2 - name: 'Set execute permissions for deploy script' - run: chmod +x deploy/deploy_macos_ne.sh + run: chmod +x deploy/build_macos_ne.sh - name: 'Build and deploy macOS NE' - run: bash deploy/deploy_macos_ne.sh + run: bash deploy/build_macos_ne.sh env: MAC_CERT_PW: ${{ secrets.MAC_CERT_PW }} MAC_SIGNER_ID: ${{ secrets.MAC_SIGNER_ID }} From 7d186c3c84454fec2d6f79fa38ac110f551b3921 Mon Sep 17 00:00:00 2001 From: Macbook Date: Wed, 9 Oct 2024 22:13:52 +0700 Subject: [PATCH 14/38] fix bug QT_BIN_DIR --- deploy/build_macos_ne.sh | 21 ++++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/deploy/build_macos_ne.sh b/deploy/build_macos_ne.sh index 12b1572d..381e424f 100755 --- a/deploy/build_macos_ne.sh +++ b/deploy/build_macos_ne.sh @@ -37,25 +37,33 @@ DMG_FILENAME=$PROJECT_DIR/${APP_NAME}.dmg # Search Qt if [ -z "${QT_VERSION+x}" ]; then -QT_VERSION=6.8.0; -QIF_VERSION=4.7 + echo "QT_VERSION is not set, using default 6.8.0" + QT_VERSION=6.8.0 + QIF_VERSION=4.7 +fi + QT_BIN_DIR=$HOME/Qt/$QT_VERSION/macos/bin QIF_BIN_DIR=$QT_BIN_DIR/../../../Tools/QtInstallerFramework/$QIF_VERSION/bin + +# Check if QT_BIN_DIR is properly set +if [ -z "${QT_BIN_DIR+x}" ]; then + echo "Error: QT_BIN_DIR is not set." + exit 1 fi echo "Using Qt in $QT_BIN_DIR" echo "Using QIF in $QIF_BIN_DIR" # Setup environment paths -export QT_BIN_DIR=$HOME/Qt/$QT_VERSION/macos/bin +export QT_BIN_DIR export QT_MACOS_ROOT_DIR=$HOME/Qt/$QT_VERSION/macos export QT_MACOS_BIN=$QT_BIN_DIR export PATH=$PATH:~/go/bin # Checking env -$QT_BIN_DIR/qt-cmake --version -cmake --version -clang -v +$QT_BIN_DIR/qt-cmake --version || { echo "Error: qt-cmake not found in $QT_BIN_DIR"; exit 1; } +cmake --version || { echo "Error: cmake not found"; exit 1; } +clang -v || { echo "Error: clang not found"; exit 1; } # Build App echo "Building App..." @@ -151,7 +159,6 @@ if [ "${MAC_CERT_PW+x}" ]; then fi echo "Building DMG installer..." -# Allow Terminal to make changes in Privacy & Security > App Management hdiutil create -size 256mb -volname AmneziaVPN -srcfolder $BUILD_DIR/installer/$APP_NAME.app -ov -format UDZO $DMG_FILENAME if [ "${MAC_CERT_PW+x}" ]; then From 1e893c22609decbb0150ca7552924571a0124a54 Mon Sep 17 00:00:00 2001 From: Macbook Date: Wed, 9 Oct 2024 22:25:06 +0700 Subject: [PATCH 15/38] fix bug QT_BIN_DIR --- .github/workflows/deploy.yml | 6 +++++- deploy/build_macos_ne.sh | 4 ++++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index f5fa3a0f..6a62e52e 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -320,7 +320,11 @@ jobs: dir: ${{ runner.temp }} set-env: 'true' extra: '--external 7z --base ${{ env.QT_MIRROR }}' - + - name: 'Install Qt Installer Framework ${{ env.QIF_VERSION }}' + run: | + mkdir -pv ${{ runner.temp }}/Qt/Tools/QtInstallerFramework + wget https://qt.amzsvc.com/tools/ifw/${{ env.QIF_VERSION }}.zip + unzip ${{ env.QIF_VERSION }}.zip -d ${{ runner.temp }}/Qt/Tools/QtInstallerFramework/ - name: 'Install Go' uses: actions/setup-go@v5 with: diff --git a/deploy/build_macos_ne.sh b/deploy/build_macos_ne.sh index 381e424f..b5ad378b 100755 --- a/deploy/build_macos_ne.sh +++ b/deploy/build_macos_ne.sh @@ -39,6 +39,10 @@ DMG_FILENAME=$PROJECT_DIR/${APP_NAME}.dmg if [ -z "${QT_VERSION+x}" ]; then echo "QT_VERSION is not set, using default 6.8.0" QT_VERSION=6.8.0 +fi + +if [ -z "${QIF_VERSION+x}" ]; then + echo "QIF_VERSION is not set, using default 4.7" QIF_VERSION=4.7 fi From 9ddfa543521eeade5c71732ddb4880fd50efea18 Mon Sep 17 00:00:00 2001 From: Macbook Date: Wed, 9 Oct 2024 22:31:53 +0700 Subject: [PATCH 16/38] fix bug QIF_VERSION --- .github/workflows/deploy.yml | 3 ++- deploy/build_macos_ne.sh | 5 ++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index 6a62e52e..b4fcb91a 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -298,7 +298,8 @@ jobs: runs-on: macos-latest env: - QT_VERSION: 6.8.0 + QT_VERSION: 6.4.3 + QIF_VERSION: 4.6 QT_MIRROR: https://mirrors.ocf.berkeley.edu/qt/ PROD_AGW_PUBLIC_KEY: ${{ secrets.PROD_AGW_PUBLIC_KEY }} DEV_AGW_PUBLIC_KEY: ${{ secrets.DEV_AGW_PUBLIC_KEY }} diff --git a/deploy/build_macos_ne.sh b/deploy/build_macos_ne.sh index b5ad378b..ba4ee11b 100755 --- a/deploy/build_macos_ne.sh +++ b/deploy/build_macos_ne.sh @@ -34,16 +34,15 @@ DEPLOY_DATA_DIR=$PROJECT_DIR/deploy/data/macos INSTALLER_DATA_DIR=$BUILD_DIR/installer/packages/$APP_DOMAIN/data INSTALLER_BUNDLE_DIR=$BUILD_DIR/installer/$APP_FILENAME DMG_FILENAME=$PROJECT_DIR/${APP_NAME}.dmg - # Search Qt if [ -z "${QT_VERSION+x}" ]; then echo "QT_VERSION is not set, using default 6.8.0" - QT_VERSION=6.8.0 + QT_VERSION=6.4.3 fi if [ -z "${QIF_VERSION+x}" ]; then echo "QIF_VERSION is not set, using default 4.7" - QIF_VERSION=4.7 + QIF_VERSION=4.6 fi QT_BIN_DIR=$HOME/Qt/$QT_VERSION/macos/bin From b93c5f3e5700b0a621327f141807cc3adbe2808a Mon Sep 17 00:00:00 2001 From: Macbook Date: Wed, 9 Oct 2024 22:41:32 +0700 Subject: [PATCH 17/38] fix bug qt-cmake --- .github/workflows/deploy.yml | 4 ++-- deploy/build_macos_ne.sh | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index b4fcb91a..5c59ff96 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -298,8 +298,8 @@ jobs: runs-on: macos-latest env: - QT_VERSION: 6.4.3 - QIF_VERSION: 4.6 + QT_VERSION: 6.8.0 + QIF_VERSION: 4.7 QT_MIRROR: https://mirrors.ocf.berkeley.edu/qt/ PROD_AGW_PUBLIC_KEY: ${{ secrets.PROD_AGW_PUBLIC_KEY }} DEV_AGW_PUBLIC_KEY: ${{ secrets.DEV_AGW_PUBLIC_KEY }} diff --git a/deploy/build_macos_ne.sh b/deploy/build_macos_ne.sh index ba4ee11b..14762be9 100755 --- a/deploy/build_macos_ne.sh +++ b/deploy/build_macos_ne.sh @@ -37,12 +37,12 @@ DMG_FILENAME=$PROJECT_DIR/${APP_NAME}.dmg # Search Qt if [ -z "${QT_VERSION+x}" ]; then echo "QT_VERSION is not set, using default 6.8.0" - QT_VERSION=6.4.3 + QT_VERSION=6.8.0 fi if [ -z "${QIF_VERSION+x}" ]; then echo "QIF_VERSION is not set, using default 4.7" - QIF_VERSION=4.6 + QIF_VERSION=4.7 fi QT_BIN_DIR=$HOME/Qt/$QT_VERSION/macos/bin From 56d6ab2dd56ee097dc930489442e2a47ad6ad32b Mon Sep 17 00:00:00 2001 From: Macbook Date: Wed, 9 Oct 2024 22:45:15 +0700 Subject: [PATCH 18/38] fix bug qt-cmake --- .github/workflows/deploy.yml | 2 +- deploy/build_macos_ne.sh | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index 5c59ff96..cdde76da 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -299,7 +299,7 @@ jobs: env: QT_VERSION: 6.8.0 - QIF_VERSION: 4.7 + QIF_VERSION: 4.6 QT_MIRROR: https://mirrors.ocf.berkeley.edu/qt/ PROD_AGW_PUBLIC_KEY: ${{ secrets.PROD_AGW_PUBLIC_KEY }} DEV_AGW_PUBLIC_KEY: ${{ secrets.DEV_AGW_PUBLIC_KEY }} diff --git a/deploy/build_macos_ne.sh b/deploy/build_macos_ne.sh index 14762be9..b9b2e0d1 100755 --- a/deploy/build_macos_ne.sh +++ b/deploy/build_macos_ne.sh @@ -41,8 +41,8 @@ if [ -z "${QT_VERSION+x}" ]; then fi if [ -z "${QIF_VERSION+x}" ]; then - echo "QIF_VERSION is not set, using default 4.7" - QIF_VERSION=4.7 + echo "QIF_VERSION is not set, using default 4.6" + QIF_VERSION=4.6 fi QT_BIN_DIR=$HOME/Qt/$QT_VERSION/macos/bin From 3c3d4252f25f522cd48cafabdc5751294764479b Mon Sep 17 00:00:00 2001 From: Macbook Date: Wed, 9 Oct 2024 23:04:00 +0700 Subject: [PATCH 19/38] fix bug qt-cmake --- .github/workflows/deploy.yml | 6 +++--- deploy/build_macos_ne.sh | 4 ++++ 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index cdde76da..34ea8a8b 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -310,17 +310,17 @@ jobs: with: xcode-version: '14.3.1' - - name: 'Install Desktop Qt' + - name: 'Install desktop Qt' uses: jurplel/install-qt-action@v3 with: version: ${{ env.QT_VERSION }} host: 'mac' target: 'desktop' - arch: 'clang_64' modules: 'qtremoteobjects qt5compat qtshadertools qtmultimedia' + arch: 'clang_64' dir: ${{ runner.temp }} set-env: 'true' - extra: '--external 7z --base ${{ env.QT_MIRROR }}' + extra: '--base ${{ env.QT_MIRROR }}' - name: 'Install Qt Installer Framework ${{ env.QIF_VERSION }}' run: | mkdir -pv ${{ runner.temp }}/Qt/Tools/QtInstallerFramework diff --git a/deploy/build_macos_ne.sh b/deploy/build_macos_ne.sh index b9b2e0d1..c9bae161 100755 --- a/deploy/build_macos_ne.sh +++ b/deploy/build_macos_ne.sh @@ -63,6 +63,10 @@ export QT_MACOS_ROOT_DIR=$HOME/Qt/$QT_VERSION/macos export QT_MACOS_BIN=$QT_BIN_DIR export PATH=$PATH:~/go/bin +# Show the content of QT_BIN_DIR +echo "Listing contents of QT_BIN_DIR:" +ls -la $QT_BIN_DIR || { echo "Error: Cannot access $QT_BIN_DIR"; exit 1; } + # Checking env $QT_BIN_DIR/qt-cmake --version || { echo "Error: qt-cmake not found in $QT_BIN_DIR"; exit 1; } cmake --version || { echo "Error: cmake not found"; exit 1; } From aaa803034843a3258374609bd954f847a570c733 Mon Sep 17 00:00:00 2001 From: Macbook Date: Wed, 9 Oct 2024 23:15:55 +0700 Subject: [PATCH 20/38] fix bug qt-cmake --- .github/workflows/deploy.yml | 24 +++++------ deploy/build_macos_ne.sh | 84 ++++++++++-------------------------- 2 files changed, 34 insertions(+), 74 deletions(-) diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index 34ea8a8b..5c6f97d9 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -299,7 +299,7 @@ jobs: env: QT_VERSION: 6.8.0 - QIF_VERSION: 4.6 + QIF_VERSION: 4.7 QT_MIRROR: https://mirrors.ocf.berkeley.edu/qt/ PROD_AGW_PUBLIC_KEY: ${{ secrets.PROD_AGW_PUBLIC_KEY }} DEV_AGW_PUBLIC_KEY: ${{ secrets.DEV_AGW_PUBLIC_KEY }} @@ -310,17 +310,17 @@ jobs: with: xcode-version: '14.3.1' - - name: 'Install desktop Qt' - uses: jurplel/install-qt-action@v3 - with: - version: ${{ env.QT_VERSION }} - host: 'mac' - target: 'desktop' - modules: 'qtremoteobjects qt5compat qtshadertools qtmultimedia' - arch: 'clang_64' - dir: ${{ runner.temp }} - set-env: 'true' - extra: '--base ${{ env.QT_MIRROR }}' + - name: 'Install Qt' + uses: jurplel/install-qt-action@v3 + with: + version: ${{ env.QT_VERSION }} + host: 'mac' + target: 'desktop' + arch: 'clang_64' + dir: ${{ runner.temp }} + setup-python: 'true' + set-env: 'true' # This will set QT_PATH + extra: '--external 7z --base https://mirrors.ocf.berkeley.edu/qt/' - name: 'Install Qt Installer Framework ${{ env.QIF_VERSION }}' run: | mkdir -pv ${{ runner.temp }}/Qt/Tools/QtInstallerFramework diff --git a/deploy/build_macos_ne.sh b/deploy/build_macos_ne.sh index c9bae161..283e4474 100755 --- a/deploy/build_macos_ne.sh +++ b/deploy/build_macos_ne.sh @@ -34,50 +34,45 @@ DEPLOY_DATA_DIR=$PROJECT_DIR/deploy/data/macos INSTALLER_DATA_DIR=$BUILD_DIR/installer/packages/$APP_DOMAIN/data INSTALLER_BUNDLE_DIR=$BUILD_DIR/installer/$APP_FILENAME DMG_FILENAME=$PROJECT_DIR/${APP_NAME}.dmg -# Search Qt -if [ -z "${QT_VERSION+x}" ]; then - echo "QT_VERSION is not set, using default 6.8.0" - QT_VERSION=6.8.0 -fi -if [ -z "${QIF_VERSION+x}" ]; then - echo "QIF_VERSION is not set, using default 4.6" - QIF_VERSION=4.6 -fi - -QT_BIN_DIR=$HOME/Qt/$QT_VERSION/macos/bin -QIF_BIN_DIR=$QT_BIN_DIR/../../../Tools/QtInstallerFramework/$QIF_VERSION/bin - -# Check if QT_BIN_DIR is properly set -if [ -z "${QT_BIN_DIR+x}" ]; then - echo "Error: QT_BIN_DIR is not set." +# Check if QT_PATH is properly set +if [ -z "${QT_PATH+x}" ]; then + echo "Error: QT_PATH is not set." exit 1 fi -echo "Using Qt in $QT_BIN_DIR" -echo "Using QIF in $QIF_BIN_DIR" +# Set QT_BIN_DIR to the bin folder of the Qt installation +QT_BIN_DIR="$QT_PATH/bin" -# Setup environment paths -export QT_BIN_DIR -export QT_MACOS_ROOT_DIR=$HOME/Qt/$QT_VERSION/macos -export QT_MACOS_BIN=$QT_BIN_DIR -export PATH=$PATH:~/go/bin +# Check if QT_BIN_DIR exists +if [ ! -d "$QT_BIN_DIR" ]; then + echo "Error: QT_BIN_DIR does not exist at $QT_BIN_DIR" + exit 1 +fi # Show the content of QT_BIN_DIR echo "Listing contents of QT_BIN_DIR:" ls -la $QT_BIN_DIR || { echo "Error: Cannot access $QT_BIN_DIR"; exit 1; } -# Checking env +# Check if QIF_VERSION is properly set, otherwise set a default +if [ -z "${QIF_VERSION+x}" ]; then + echo "QIF_VERSION is not set, using default 4.7" + QIF_VERSION=4.7 +fi + +QIF_BIN_DIR="$QT_BIN_DIR/../../../Tools/QtInstallerFramework/$QIF_VERSION/bin" + +# Checking environment $QT_BIN_DIR/qt-cmake --version || { echo "Error: qt-cmake not found in $QT_BIN_DIR"; exit 1; } cmake --version || { echo "Error: cmake not found"; exit 1; } clang -v || { echo "Error: clang not found"; exit 1; } -# Build App +# Build the app echo "Building App..." mkdir -p build-macos cd build-macos -$QT_MACOS_BIN/qt-cmake .. -GXcode -DQT_HOST_PATH=$QT_MACOS_ROOT_DIR -DMACOS_NE=TRUE +$QT_BIN_DIR/qt-cmake .. -GXcode -DQT_HOST_PATH=$QT_PATH -DMACOS_NE=TRUE cmake --build . --config release --target all # Build and run tests here @@ -95,6 +90,7 @@ cp -av $BUILD_DIR/service/server/$APP_NAME-service $BUNDLE_DIR/Contents/macOS cp -Rv $PROJECT_DIR/deploy/data/macos/* $BUNDLE_DIR/Contents/macOS rm -f $BUNDLE_DIR/Contents/macOS/post_install.sh $BUNDLE_DIR/Contents/macOS/post_uninstall.sh +# Signing and notarizing the app if [ "${MAC_CERT_PW+x}" ]; then CERTIFICATE_P12=$DEPLOY_DIR/PrivacyTechAppleCertDeveloperId.p12 @@ -151,39 +147,3 @@ if [ "${MAC_CERT_PW+x}" ]; then echo "Signing installer bundle..." security unlock-keychain -p $TEMP_PASS $KEYCHAIN /usr/bin/codesign --deep --force --verbose --timestamp -o runtime --sign "$MAC_SIGNER_ID" $INSTALLER_BUNDLE_DIR - /usr/bin/codesign --verify -vvvv $INSTALLER_BUNDLE_DIR || true - - if [ "${NOTARIZE_APP+x}" ]; then - echo "Notarizing installer bundle..." - /usr/bin/ditto -c -k --keepParent $INSTALLER_BUNDLE_DIR $PROJECT_DIR/Installer_bundle_to_notarize.zip - xcrun notarytool submit $PROJECT_DIR/Installer_bundle_to_notarize.zip --apple-id $APPLE_DEV_EMAIL --team-id $MAC_TEAM_ID --password $APPLE_DEV_PASSWORD - rm $PROJECT_DIR/Installer_bundle_to_notarize.zip - sleep 300 - xcrun stapler staple $INSTALLER_BUNDLE_DIR - xcrun stapler validate $INSTALLER_BUNDLE_DIR - spctl -a -vvvv $INSTALLER_BUNDLE_DIR || true - fi -fi - -echo "Building DMG installer..." -hdiutil create -size 256mb -volname AmneziaVPN -srcfolder $BUILD_DIR/installer/$APP_NAME.app -ov -format UDZO $DMG_FILENAME - -if [ "${MAC_CERT_PW+x}" ]; then - echo "Signing DMG installer..." - security unlock-keychain -p $TEMP_PASS $KEYCHAIN - /usr/bin/codesign --deep --force --verbose --timestamp -o runtime --sign "$MAC_SIGNER_ID" $DMG_FILENAME - /usr/bin/codesign --verify -vvvv $DMG_FILENAME || true - - if [ "${NOTARIZE_APP+x}" ]; then - echo "Notarizing DMG installer..." - xcrun notarytool submit $DMG_FILENAME --apple-id $APPLE_DEV_EMAIL --team-id $MAC_TEAM_ID --password $APPLE_DEV_PASSWORD - sleep 300 - xcrun stapler staple $DMG_FILENAME - xcrun stapler validate $DMG_FILENAME - fi -fi - -echo "Finished, artifact is $DMG_FILENAME" - -# restore keychain -security default-keychain -s login.keychain From d0db1293b5d6c742e937ecd4bda712f7f8d8a9f9 Mon Sep 17 00:00:00 2001 From: Macbook Date: Wed, 9 Oct 2024 23:17:33 +0700 Subject: [PATCH 21/38] fix bug qt-cmake --- .github/workflows/deploy.yml | 22 +++++++++++----------- deploy/build_macos_ne.sh | 36 ++++++++++++++++++++++++++++++++++++ 2 files changed, 47 insertions(+), 11 deletions(-) diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index 5c6f97d9..a1002a53 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -310,17 +310,17 @@ jobs: with: xcode-version: '14.3.1' - - name: 'Install Qt' - uses: jurplel/install-qt-action@v3 - with: - version: ${{ env.QT_VERSION }} - host: 'mac' - target: 'desktop' - arch: 'clang_64' - dir: ${{ runner.temp }} - setup-python: 'true' - set-env: 'true' # This will set QT_PATH - extra: '--external 7z --base https://mirrors.ocf.berkeley.edu/qt/' + - name: 'Install desktop Qt' + uses: jurplel/install-qt-action@v3 + with: + version: ${{ env.QT_VERSION }} + host: 'mac' + target: 'desktop' + modules: 'qtremoteobjects qt5compat qtshadertools qtmultimedia' + arch: 'clang_64' + dir: ${{ runner.temp }} + set-env: 'true' + extra: '--base ${{ env.QT_MIRROR }}' - name: 'Install Qt Installer Framework ${{ env.QIF_VERSION }}' run: | mkdir -pv ${{ runner.temp }}/Qt/Tools/QtInstallerFramework diff --git a/deploy/build_macos_ne.sh b/deploy/build_macos_ne.sh index 283e4474..8ea93b5e 100755 --- a/deploy/build_macos_ne.sh +++ b/deploy/build_macos_ne.sh @@ -147,3 +147,39 @@ if [ "${MAC_CERT_PW+x}" ]; then echo "Signing installer bundle..." security unlock-keychain -p $TEMP_PASS $KEYCHAIN /usr/bin/codesign --deep --force --verbose --timestamp -o runtime --sign "$MAC_SIGNER_ID" $INSTALLER_BUNDLE_DIR + /usr/bin/codesign --verify -vvvv $INSTALLER_BUNDLE_DIR || true + + if [ "${NOTARIZE_APP+x}" ]; then + echo "Notarizing installer bundle..." + /usr/bin/ditto -c -k --keepParent $INSTALLER_BUNDLE_DIR $PROJECT_DIR/Installer_bundle_to_notarize.zip + xcrun notarytool submit $PROJECT_DIR/Installer_bundle_to_notarize.zip --apple-id $APPLE_DEV_EMAIL --team-id $MAC_TEAM_ID --password $APPLE_DEV_PASSWORD + rm $PROJECT_DIR/Installer_bundle_to_notarize.zip + sleep 300 + xcrun stapler staple $INSTALLER_BUNDLE_DIR + xcrun stapler validate $INSTALLER_BUNDLE_DIR + spctl -a -vvvv $INSTALLER_BUNDLE_DIR || true + fi +fi + +echo "Building DMG installer..." +hdiutil create -size 256mb -volname AmneziaVPN -srcfolder $BUILD_DIR/installer/$APP_NAME.app -ov -format UDZO $DMG_FILENAME + +if [ "${MAC_CERT_PW+x}" ]; then + echo "Signing DMG installer..." + security unlock-keychain -p $TEMP_PASS $KEYCHAIN + /usr/bin/codesign --deep --force --verbose --timestamp -o runtime --sign "$MAC_SIGNER_ID" $DMG_FILENAME + /usr/bin/codesign --verify -vvvv $DMG_FILENAME || true + + if [ "${NOTARIZE_APP+x}" ]; then + echo "Notarizing DMG installer..." + xcrun notarytool submit $DMG_FILENAME --apple-id $APPLE_DEV_EMAIL --team-id $MAC_TEAM_ID --password $APPLE_DEV_PASSWORD + sleep 300 + xcrun stapler staple $DMG_FILENAME + xcrun stapler validate $DMG_FILENAME + fi +fi + +echo "Finished, artifact is $DMG_FILENAME" + +# restore keychain +security default-keychain -s login.keychain From 4c9a249695818a2626d7fb3a480d1dd35574f348 Mon Sep 17 00:00:00 2001 From: Macbook Date: Thu, 10 Oct 2024 16:59:29 +0700 Subject: [PATCH 22/38] chaneg version QT --- .github/workflows/deploy.yml | 4 ++-- deploy/build_macos_ne.sh | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index a1002a53..1a821952 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -298,8 +298,8 @@ jobs: runs-on: macos-latest env: - QT_VERSION: 6.8.0 - QIF_VERSION: 4.7 + QT_VERSION: 6.4.3 + QIF_VERSION: 4.6 QT_MIRROR: https://mirrors.ocf.berkeley.edu/qt/ PROD_AGW_PUBLIC_KEY: ${{ secrets.PROD_AGW_PUBLIC_KEY }} DEV_AGW_PUBLIC_KEY: ${{ secrets.DEV_AGW_PUBLIC_KEY }} diff --git a/deploy/build_macos_ne.sh b/deploy/build_macos_ne.sh index 8ea93b5e..ac85001e 100755 --- a/deploy/build_macos_ne.sh +++ b/deploy/build_macos_ne.sh @@ -56,8 +56,8 @@ ls -la $QT_BIN_DIR || { echo "Error: Cannot access $QT_BIN_DIR"; exit 1; } # Check if QIF_VERSION is properly set, otherwise set a default if [ -z "${QIF_VERSION+x}" ]; then - echo "QIF_VERSION is not set, using default 4.7" - QIF_VERSION=4.7 + echo "QIF_VERSION is not set, using default 4.6" + QIF_VERSION=4.6 fi QIF_BIN_DIR="$QT_BIN_DIR/../../../Tools/QtInstallerFramework/$QIF_VERSION/bin" From c9b61f48cf65107bffebdbe0b646bdd7dc63fd56 Mon Sep 17 00:00:00 2001 From: Macbook Date: Thu, 10 Oct 2024 17:07:13 +0700 Subject: [PATCH 23/38] input QT_BIN_DIR --- .github/workflows/deploy.yml | 5 ++++- deploy/build_macos_ne.sh | 30 +++++++++++++++--------------- 2 files changed, 19 insertions(+), 16 deletions(-) diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index 1a821952..a1217af2 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -345,7 +345,10 @@ jobs: run: chmod +x deploy/build_macos_ne.sh - name: 'Build and deploy macOS NE' - run: bash deploy/build_macos_ne.sh + run: | + export QT_BIN_DIR="${{ runner.temp }}/Qt/${{ env.QT_VERSION }}/macos/bin" + export QIF_BIN_DIR="${{ runner.temp }}/Qt/Tools/QtInstallerFramework/${{ env.QIF_VERSION }}/bin" + bash deploy/build_macos_ne.sh env: MAC_CERT_PW: ${{ secrets.MAC_CERT_PW }} MAC_SIGNER_ID: ${{ secrets.MAC_SIGNER_ID }} diff --git a/deploy/build_macos_ne.sh b/deploy/build_macos_ne.sh index ac85001e..f0b66810 100755 --- a/deploy/build_macos_ne.sh +++ b/deploy/build_macos_ne.sh @@ -35,24 +35,24 @@ INSTALLER_DATA_DIR=$BUILD_DIR/installer/packages/$APP_DOMAIN/data INSTALLER_BUNDLE_DIR=$BUILD_DIR/installer/$APP_FILENAME DMG_FILENAME=$PROJECT_DIR/${APP_NAME}.dmg -# Check if QT_PATH is properly set -if [ -z "${QT_PATH+x}" ]; then - echo "Error: QT_PATH is not set." - exit 1 -fi +# # Check if QT_PATH is properly set +# if [ -z "${QT_PATH+x}" ]; then +# echo "Error: QT_PATH is not set." +# exit 1 +# fi -# Set QT_BIN_DIR to the bin folder of the Qt installation -QT_BIN_DIR="$QT_PATH/bin" +# # Set QT_BIN_DIR to the bin folder of the Qt installation +# QT_BIN_DIR="$QT_PATH/bin" -# Check if QT_BIN_DIR exists -if [ ! -d "$QT_BIN_DIR" ]; then - echo "Error: QT_BIN_DIR does not exist at $QT_BIN_DIR" - exit 1 -fi +# # Check if QT_BIN_DIR exists +# if [ ! -d "$QT_BIN_DIR" ]; then +# echo "Error: QT_BIN_DIR does not exist at $QT_BIN_DIR" +# exit 1 +# fi -# Show the content of QT_BIN_DIR -echo "Listing contents of QT_BIN_DIR:" -ls -la $QT_BIN_DIR || { echo "Error: Cannot access $QT_BIN_DIR"; exit 1; } +# # Show the content of QT_BIN_DIR +# echo "Listing contents of QT_BIN_DIR:" +# ls -la $QT_BIN_DIR || { echo "Error: Cannot access $QT_BIN_DIR"; exit 1; } # Check if QIF_VERSION is properly set, otherwise set a default if [ -z "${QIF_VERSION+x}" ]; then From 4287e5aa763ac5cd5f9a5f53e80e568f68277a2a Mon Sep 17 00:00:00 2001 From: Macbook Date: Thu, 10 Oct 2024 17:08:22 +0700 Subject: [PATCH 24/38] input QT_BIN_DIR --- deploy/build_macos_ne.sh | 19 ------------------- 1 file changed, 19 deletions(-) diff --git a/deploy/build_macos_ne.sh b/deploy/build_macos_ne.sh index f0b66810..5b162d8d 100755 --- a/deploy/build_macos_ne.sh +++ b/deploy/build_macos_ne.sh @@ -35,25 +35,6 @@ INSTALLER_DATA_DIR=$BUILD_DIR/installer/packages/$APP_DOMAIN/data INSTALLER_BUNDLE_DIR=$BUILD_DIR/installer/$APP_FILENAME DMG_FILENAME=$PROJECT_DIR/${APP_NAME}.dmg -# # Check if QT_PATH is properly set -# if [ -z "${QT_PATH+x}" ]; then -# echo "Error: QT_PATH is not set." -# exit 1 -# fi - -# # Set QT_BIN_DIR to the bin folder of the Qt installation -# QT_BIN_DIR="$QT_PATH/bin" - -# # Check if QT_BIN_DIR exists -# if [ ! -d "$QT_BIN_DIR" ]; then -# echo "Error: QT_BIN_DIR does not exist at $QT_BIN_DIR" -# exit 1 -# fi - -# # Show the content of QT_BIN_DIR -# echo "Listing contents of QT_BIN_DIR:" -# ls -la $QT_BIN_DIR || { echo "Error: Cannot access $QT_BIN_DIR"; exit 1; } - # Check if QIF_VERSION is properly set, otherwise set a default if [ -z "${QIF_VERSION+x}" ]; then echo "QIF_VERSION is not set, using default 4.6" From 336850624f3b54145c99055e4ab6bb998480a9bc Mon Sep 17 00:00:00 2001 From: Macbook Date: Thu, 10 Oct 2024 17:14:36 +0700 Subject: [PATCH 25/38] input QT_PATH --- .github/workflows/deploy.yml | 1 + deploy/build_macos_ne.sh | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index a1217af2..338b8876 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -348,6 +348,7 @@ jobs: run: | export QT_BIN_DIR="${{ runner.temp }}/Qt/${{ env.QT_VERSION }}/macos/bin" export QIF_BIN_DIR="${{ runner.temp }}/Qt/Tools/QtInstallerFramework/${{ env.QIF_VERSION }}/bin" + export QT_MACOS_ROOT_DIR="${{ runner.temp }}/Qt/${{ env.QT_VERSION }}/macos" bash deploy/build_macos_ne.sh env: MAC_CERT_PW: ${{ secrets.MAC_CERT_PW }} diff --git a/deploy/build_macos_ne.sh b/deploy/build_macos_ne.sh index 5b162d8d..36000e07 100755 --- a/deploy/build_macos_ne.sh +++ b/deploy/build_macos_ne.sh @@ -53,7 +53,7 @@ echo "Building App..." mkdir -p build-macos cd build-macos -$QT_BIN_DIR/qt-cmake .. -GXcode -DQT_HOST_PATH=$QT_PATH -DMACOS_NE=TRUE +$QT_BIN_DIR/qt-cmake .. -GXcode -DQT_HOST_PATH=$QT_MACOS_ROOT_DIR -DMACOS_NE=TRUE cmake --build . --config release --target all # Build and run tests here From 9fc1df38cce79374a08ce45a4b61cd8a74ac0911 Mon Sep 17 00:00:00 2001 From: Macbook Date: Thu, 10 Oct 2024 17:33:27 +0700 Subject: [PATCH 26/38] add target --- deploy/build_macos_ne.sh | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/deploy/build_macos_ne.sh b/deploy/build_macos_ne.sh index 36000e07..24090d37 100755 --- a/deploy/build_macos_ne.sh +++ b/deploy/build_macos_ne.sh @@ -54,7 +54,9 @@ mkdir -p build-macos cd build-macos $QT_BIN_DIR/qt-cmake .. -GXcode -DQT_HOST_PATH=$QT_MACOS_ROOT_DIR -DMACOS_NE=TRUE -cmake --build . --config release --target all +# Xác định target hợp lệ và build +cmake --build . --config release --target AmneziaVPN # Hoặc target chính xác của bạn + # Build and run tests here From bfc2ac6c32198bc8db164b1099abb440d2e9a331 Mon Sep 17 00:00:00 2001 From: Macbook Date: Thu, 10 Oct 2024 20:49:45 +0700 Subject: [PATCH 27/38] error: No profiles for NE --- .github/workflows/deploy.yml | 721 ++++++++++++++++++----------------- deploy/build_macos_ne.sh | 16 +- 2 files changed, 376 insertions(+), 361 deletions(-) diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index 338b8876..0e6ba09c 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -9,215 +9,215 @@ env: QT_MIRROR: https://mirrors.ocf.berkeley.edu/qt/ # https://download.qt.io/static/mirrorlist/ jobs: - Build-Linux-Ubuntu: - runs-on: ubuntu-20.04 + # Build-Linux-Ubuntu: + # runs-on: ubuntu-20.04 - env: - QT_VERSION: 6.6.2 - QIF_VERSION: 4.7 - PROD_AGW_PUBLIC_KEY: ${{ secrets.PROD_AGW_PUBLIC_KEY }} - DEV_AGW_PUBLIC_KEY: ${{ secrets.DEV_AGW_PUBLIC_KEY }} + # env: + # QT_VERSION: 6.6.2 + # QIF_VERSION: 4.7 + # PROD_AGW_PUBLIC_KEY: ${{ secrets.PROD_AGW_PUBLIC_KEY }} + # DEV_AGW_PUBLIC_KEY: ${{ secrets.DEV_AGW_PUBLIC_KEY }} - steps: - - name: 'Install Qt' - uses: jurplel/install-qt-action@v3 - with: - version: ${{ env.QT_VERSION }} - host: 'linux' - target: 'desktop' - arch: 'gcc_64' - modules: 'qtremoteobjects qt5compat qtshadertools' - dir: ${{ runner.temp }} - setup-python: 'true' - tools: 'tools_ifw' - set-env: 'true' - extra: '--external 7z --base ${{ env.QT_MIRROR }}' + # steps: + # - name: 'Install Qt' + # uses: jurplel/install-qt-action@v3 + # with: + # version: ${{ env.QT_VERSION }} + # host: 'linux' + # target: 'desktop' + # arch: 'gcc_64' + # modules: 'qtremoteobjects qt5compat qtshadertools' + # dir: ${{ runner.temp }} + # setup-python: 'true' + # tools: 'tools_ifw' + # set-env: 'true' + # extra: '--external 7z --base ${{ env.QT_MIRROR }}' - - name: 'Get sources' - uses: actions/checkout@v4 - with: - submodules: 'true' - fetch-depth: 10 + # - name: 'Get sources' + # uses: actions/checkout@v4 + # with: + # submodules: 'true' + # fetch-depth: 10 - - name: 'Setup ccache' - uses: hendrikmuhs/ccache-action@v1.2 + # - name: 'Setup ccache' + # uses: hendrikmuhs/ccache-action@v1.2 - - name: 'Build project' - run: | - sudo apt-get install libxkbcommon-x11-0 - export QT_BIN_DIR=${{ runner.temp }}/Qt/${{ env.QT_VERSION }}/gcc_64/bin - export QIF_BIN_DIR=${{ runner.temp }}/Qt/Tools/QtInstallerFramework/${{ env.QIF_VERSION }}/bin - bash deploy/build_linux.sh + # - name: 'Build project' + # run: | + # sudo apt-get install libxkbcommon-x11-0 + # export QT_BIN_DIR=${{ runner.temp }}/Qt/${{ env.QT_VERSION }}/gcc_64/bin + # export QIF_BIN_DIR=${{ runner.temp }}/Qt/Tools/QtInstallerFramework/${{ env.QIF_VERSION }}/bin + # bash deploy/build_linux.sh - - name: 'Pack installer' - run: cd deploy && tar -cf AmneziaVPN_Linux_Installer.tar AmneziaVPN_Linux_Installer.bin + # - name: 'Pack installer' + # run: cd deploy && tar -cf AmneziaVPN_Linux_Installer.tar AmneziaVPN_Linux_Installer.bin - - name: 'Upload installer artifact' - uses: actions/upload-artifact@v4 - with: - name: AmneziaVPN_Linux_installer.tar - path: deploy/AmneziaVPN_Linux_Installer.tar - retention-days: 7 + # - name: 'Upload installer artifact' + # uses: actions/upload-artifact@v4 + # with: + # name: AmneziaVPN_Linux_installer.tar + # path: deploy/AmneziaVPN_Linux_Installer.tar + # retention-days: 7 - - name: 'Upload unpacked artifact' - uses: actions/upload-artifact@v4 - with: - name: AmneziaVPN_Linux_unpacked - path: deploy/AppDir - retention-days: 7 + # - name: 'Upload unpacked artifact' + # uses: actions/upload-artifact@v4 + # with: + # name: AmneziaVPN_Linux_unpacked + # path: deploy/AppDir + # retention-days: 7 - - name: 'Upload translations artifact' - uses: actions/upload-artifact@v4 - with: - name: AmneziaVPN_translations - path: client/translations - retention-days: 7 + # - name: 'Upload translations artifact' + # uses: actions/upload-artifact@v4 + # with: + # name: AmneziaVPN_translations + # path: client/translations + # retention-days: 7 # ------------------------------------------------------ - Build-Windows: - runs-on: windows-latest + # Build-Windows: + # runs-on: windows-latest - env: - QT_VERSION: 6.6.2 - QIF_VERSION: 4.7 - BUILD_ARCH: 64 - PROD_AGW_PUBLIC_KEY: ${{ secrets.PROD_AGW_PUBLIC_KEY }} - DEV_AGW_PUBLIC_KEY: ${{ secrets.DEV_AGW_PUBLIC_KEY }} + # env: + # QT_VERSION: 6.6.2 + # QIF_VERSION: 4.7 + # BUILD_ARCH: 64 + # PROD_AGW_PUBLIC_KEY: ${{ secrets.PROD_AGW_PUBLIC_KEY }} + # DEV_AGW_PUBLIC_KEY: ${{ secrets.DEV_AGW_PUBLIC_KEY }} - steps: - - name: 'Get sources' - uses: actions/checkout@v4 - with: - submodules: 'true' - fetch-depth: 10 + # steps: + # - name: 'Get sources' + # uses: actions/checkout@v4 + # with: + # submodules: 'true' + # fetch-depth: 10 - - name: 'Setup ccache' - uses: hendrikmuhs/ccache-action@v1.2 + # - name: 'Setup ccache' + # uses: hendrikmuhs/ccache-action@v1.2 - - name: 'Install Qt' - uses: jurplel/install-qt-action@v3 - with: - version: ${{ env.QT_VERSION }} - host: 'windows' - target: 'desktop' - arch: 'win64_msvc2019_64' - modules: 'qtremoteobjects qt5compat qtshadertools' - dir: ${{ runner.temp }} - setup-python: 'true' - tools: 'tools_ifw' - set-env: 'true' - extra: '--external 7z --base ${{ env.QT_MIRROR }}' + # - name: 'Install Qt' + # uses: jurplel/install-qt-action@v3 + # with: + # version: ${{ env.QT_VERSION }} + # host: 'windows' + # target: 'desktop' + # arch: 'win64_msvc2019_64' + # modules: 'qtremoteobjects qt5compat qtshadertools' + # dir: ${{ runner.temp }} + # setup-python: 'true' + # tools: 'tools_ifw' + # set-env: 'true' + # extra: '--external 7z --base ${{ env.QT_MIRROR }}' - - name: 'Setup mvsc' - uses: ilammy/msvc-dev-cmd@v1 - with: - arch: 'x64' + # - name: 'Setup mvsc' + # uses: ilammy/msvc-dev-cmd@v1 + # with: + # arch: 'x64' - - name: 'Build project' - shell: cmd - run: | - set BUILD_ARCH=${{ env.BUILD_ARCH }} - set QT_BIN_DIR="${{ runner.temp }}\\Qt\\${{ env.QT_VERSION }}\\msvc2019_64\\bin" - set QIF_BIN_DIR="${{ runner.temp }}\\Qt\\Tools\\QtInstallerFramework\\${{ env.QIF_VERSION }}\\bin" - call deploy\\build_windows.bat + # - name: 'Build project' + # shell: cmd + # run: | + # set BUILD_ARCH=${{ env.BUILD_ARCH }} + # set QT_BIN_DIR="${{ runner.temp }}\\Qt\\${{ env.QT_VERSION }}\\msvc2019_64\\bin" + # set QIF_BIN_DIR="${{ runner.temp }}\\Qt\\Tools\\QtInstallerFramework\\${{ env.QIF_VERSION }}\\bin" + # call deploy\\build_windows.bat - - name: 'Upload installer artifact' - uses: actions/upload-artifact@v4 - with: - name: AmneziaVPN_Windows_installer - path: AmneziaVPN_x${{ env.BUILD_ARCH }}.exe - retention-days: 7 + # - name: 'Upload installer artifact' + # uses: actions/upload-artifact@v4 + # with: + # name: AmneziaVPN_Windows_installer + # path: AmneziaVPN_x${{ env.BUILD_ARCH }}.exe + # retention-days: 7 - - name: 'Upload unpacked artifact' - uses: actions/upload-artifact@v4 - with: - name: AmneziaVPN_Windows_unpacked - path: deploy\\build_${{ env.BUILD_ARCH }}\\client\\Release - retention-days: 7 + # - name: 'Upload unpacked artifact' + # uses: actions/upload-artifact@v4 + # with: + # name: AmneziaVPN_Windows_unpacked + # path: deploy\\build_${{ env.BUILD_ARCH }}\\client\\Release + # retention-days: 7 # ------------------------------------------------------ - Build-iOS: - runs-on: macos-13 + # Build-iOS: + # runs-on: macos-13 - env: - QT_VERSION: 6.6.2 - CC: cc - CXX: c++ - PROD_AGW_PUBLIC_KEY: ${{ secrets.PROD_AGW_PUBLIC_KEY }} - DEV_AGW_PUBLIC_KEY: ${{ secrets.DEV_AGW_PUBLIC_KEY }} + # env: + # QT_VERSION: 6.6.2 + # CC: cc + # CXX: c++ + # PROD_AGW_PUBLIC_KEY: ${{ secrets.PROD_AGW_PUBLIC_KEY }} + # DEV_AGW_PUBLIC_KEY: ${{ secrets.DEV_AGW_PUBLIC_KEY }} - steps: - - name: 'Setup xcode' - uses: maxim-lobanov/setup-xcode@v1 - with: - xcode-version: '15.2' + # steps: + # - name: 'Setup xcode' + # uses: maxim-lobanov/setup-xcode@v1 + # with: + # xcode-version: '15.2' - - name: 'Install desktop Qt' - uses: jurplel/install-qt-action@v3 - with: - version: ${{ env.QT_VERSION }} - host: 'mac' - target: 'desktop' - modules: 'qtremoteobjects qt5compat qtshadertools qtmultimedia' - arch: 'clang_64' - dir: ${{ runner.temp }} - set-env: 'true' - extra: '--base ${{ env.QT_MIRROR }}' + # - name: 'Install desktop Qt' + # uses: jurplel/install-qt-action@v3 + # with: + # version: ${{ env.QT_VERSION }} + # host: 'mac' + # target: 'desktop' + # modules: 'qtremoteobjects qt5compat qtshadertools qtmultimedia' + # arch: 'clang_64' + # dir: ${{ runner.temp }} + # set-env: 'true' + # extra: '--base ${{ env.QT_MIRROR }}' - - name: 'Install iOS Qt' - uses: jurplel/install-qt-action@v3 - with: - version: ${{ env.QT_VERSION }} - host: 'mac' - target: 'ios' - modules: 'qtremoteobjects qt5compat qtshadertools qtmultimedia' - dir: ${{ runner.temp }} - setup-python: 'true' - set-env: 'true' - extra: '--external 7z --base ${{ env.QT_MIRROR }}' + # - name: 'Install iOS Qt' + # uses: jurplel/install-qt-action@v3 + # with: + # version: ${{ env.QT_VERSION }} + # host: 'mac' + # target: 'ios' + # modules: 'qtremoteobjects qt5compat qtshadertools qtmultimedia' + # dir: ${{ runner.temp }} + # setup-python: 'true' + # set-env: 'true' + # extra: '--external 7z --base ${{ env.QT_MIRROR }}' - - name: 'Install go' - uses: actions/setup-go@v5 - with: - go-version: '1.22.1' - cache: false + # - name: 'Install go' + # uses: actions/setup-go@v5 + # with: + # go-version: '1.22.1' + # cache: false - - name: 'Setup gomobile' - run: | - export PATH=$PATH:~/go/bin - go install golang.org/x/mobile/cmd/gomobile@latest - gomobile init + # - name: 'Setup gomobile' + # run: | + # export PATH=$PATH:~/go/bin + # go install golang.org/x/mobile/cmd/gomobile@latest + # gomobile init - - name: 'Get sources' - uses: actions/checkout@v4 - with: - submodules: 'true' - fetch-depth: 10 + # - name: 'Get sources' + # uses: actions/checkout@v4 + # with: + # submodules: 'true' + # fetch-depth: 10 - - name: 'Setup ccache' - uses: hendrikmuhs/ccache-action@v1.2 + # - name: 'Setup ccache' + # uses: hendrikmuhs/ccache-action@v1.2 - - name: 'Install dependencies' - run: pip install jsonschema jinja2 + # - name: 'Install dependencies' + # run: pip install jsonschema jinja2 - - name: 'Build project' - run: | - git submodule update --init --recursive - export QT_BIN_DIR="${{ runner.temp }}/Qt/${{ env.QT_VERSION }}/ios/bin" - export QT_MACOS_ROOT_DIR="${{ runner.temp }}/Qt/${{ env.QT_VERSION }}/macos" - export PATH=$PATH:~/go/bin - sh deploy/build_ios.sh - env: - IOS_TRUST_CERT_BASE64: ${{ secrets.IOS_TRUST_CERT_BASE64 }} - IOS_SIGNING_CERT_BASE64: ${{ secrets.IOS_SIGNING_CERT_BASE64 }} - IOS_SIGNING_CERT_PASSWORD: ${{ secrets.IOS_SIGNING_CERT_PASSWORD }} - APPSTORE_CONNECT_KEY_ID: ${{ secrets.APPSTORE_CONNECT_KEY_ID }} - APPSTORE_CONNECT_ISSUER_ID: ${{ secrets.APPSTORE_CONNECT_ISSUER_ID }} - APPSTORE_CONNECT_PRIVATE_KEY: ${{ secrets.APPSTORE_CONNECT_PRIVATE_KEY }} - IOS_APP_PROVISIONING_PROFILE: ${{ secrets.IOS_APP_PROVISIONING_PROFILE }} - IOS_NE_PROVISIONING_PROFILE: ${{ secrets.IOS_NE_PROVISIONING_PROFILE }} + # - name: 'Build project' + # run: | + # git submodule update --init --recursive + # export QT_BIN_DIR="${{ runner.temp }}/Qt/${{ env.QT_VERSION }}/ios/bin" + # export QT_MACOS_ROOT_DIR="${{ runner.temp }}/Qt/${{ env.QT_VERSION }}/macos" + # export PATH=$PATH:~/go/bin + # sh deploy/build_ios.sh + # env: + # IOS_TRUST_CERT_BASE64: ${{ secrets.IOS_TRUST_CERT_BASE64 }} + # IOS_SIGNING_CERT_BASE64: ${{ secrets.IOS_SIGNING_CERT_BASE64 }} + # IOS_SIGNING_CERT_PASSWORD: ${{ secrets.IOS_SIGNING_CERT_PASSWORD }} + # APPSTORE_CONNECT_KEY_ID: ${{ secrets.APPSTORE_CONNECT_KEY_ID }} + # APPSTORE_CONNECT_ISSUER_ID: ${{ secrets.APPSTORE_CONNECT_ISSUER_ID }} + # APPSTORE_CONNECT_PRIVATE_KEY: ${{ secrets.APPSTORE_CONNECT_PRIVATE_KEY }} + # IOS_APP_PROVISIONING_PROFILE: ${{ secrets.IOS_APP_PROVISIONING_PROFILE }} + # IOS_NE_PROVISIONING_PROFILE: ${{ secrets.IOS_NE_PROVISIONING_PROFILE }} # - name: 'Upload appstore .ipa and dSYMs to artifacts' # uses: actions/upload-artifact@v4 @@ -230,69 +230,70 @@ jobs: # ------------------------------------------------------ - Build-MacOS: - runs-on: macos-latest + # Build-MacOS: + # runs-on: macos-latest - env: - # Keep compat with MacOS 10.15 aka Catalina by Qt 6.4 - QT_VERSION: 6.4.3 - QIF_VERSION: 4.6 - PROD_AGW_PUBLIC_KEY: ${{ secrets.PROD_AGW_PUBLIC_KEY }} - DEV_AGW_PUBLIC_KEY: ${{ secrets.DEV_AGW_PUBLIC_KEY }} + # env: + # # Keep compat with MacOS 10.15 aka Catalina by Qt 6.4 + # QT_VERSION: 6.4.3 + # QIF_VERSION: 4.6 + # PROD_AGW_PUBLIC_KEY: ${{ secrets.PROD_AGW_PUBLIC_KEY }} + # DEV_AGW_PUBLIC_KEY: ${{ secrets.DEV_AGW_PUBLIC_KEY }} - steps: - - name: 'Setup xcode' - uses: maxim-lobanov/setup-xcode@v1 - with: - xcode-version: '14.3.1' + # steps: + # - name: 'Setup xcode' + # uses: maxim-lobanov/setup-xcode@v1 + # with: + # xcode-version: '14.3.1' - - name: 'Install Qt' - uses: jurplel/install-qt-action@v3 - with: - version: ${{ env.QT_VERSION }} - host: 'mac' - target: 'desktop' - arch: 'clang_64' - modules: 'qtremoteobjects qt5compat qtshadertools' - dir: ${{ runner.temp }} - setup-python: 'true' - set-env: 'true' - extra: '--external 7z --base ${{ env.QT_MIRROR }}' + # - name: 'Install Qt' + # uses: jurplel/install-qt-action@v3 + # with: + # version: ${{ env.QT_VERSION }} + # host: 'mac' + # target: 'desktop' + # arch: 'clang_64' + # modules: 'qtremoteobjects qt5compat qtshadertools' + # dir: ${{ runner.temp }} + # setup-python: 'true' + # set-env: 'true' + # extra: '--external 7z --base ${{ env.QT_MIRROR }}' - - name: 'Install Qt Installer Framework ${{ env.QIF_VERSION }}' - run: | - mkdir -pv ${{ runner.temp }}/Qt/Tools/QtInstallerFramework - wget https://qt.amzsvc.com/tools/ifw/${{ env.QIF_VERSION }}.zip - unzip ${{ env.QIF_VERSION }}.zip -d ${{ runner.temp }}/Qt/Tools/QtInstallerFramework/ + # - name: 'Install Qt Installer Framework ${{ env.QIF_VERSION }}' + # run: | + # mkdir -pv ${{ runner.temp }}/Qt/Tools/QtInstallerFramework + # wget https://qt.amzsvc.com/tools/ifw/${{ env.QIF_VERSION }}.zip + # unzip ${{ env.QIF_VERSION }}.zip -d ${{ runner.temp }}/Qt/Tools/QtInstallerFramework/ - - name: 'Get sources' - uses: actions/checkout@v4 - with: - submodules: 'true' - fetch-depth: 10 + # - name: 'Get sources' + # uses: actions/checkout@v4 + # with: + # submodules: 'true' + # fetch-depth: 10 - - name: 'Setup ccache' - uses: hendrikmuhs/ccache-action@v1.2 + # - name: 'Setup ccache' + # uses: hendrikmuhs/ccache-action@v1.2 - - name: 'Build project' - run: | - export QT_BIN_DIR="${{ runner.temp }}/Qt/${{ env.QT_VERSION }}/macos/bin" - export QIF_BIN_DIR="${{ runner.temp }}/Qt/Tools/QtInstallerFramework/${{ env.QIF_VERSION }}/bin" - bash deploy/build_macos.sh + # - name: 'Build project' + # run: | + # export QT_BIN_DIR="${{ runner.temp }}/Qt/${{ env.QT_VERSION }}/macos/bin" + # export QIF_BIN_DIR="${{ runner.temp }}/Qt/Tools/QtInstallerFramework/${{ env.QIF_VERSION }}/bin" + # bash deploy/build_macos.sh - - name: 'Upload installer artifact' - uses: actions/upload-artifact@v4 - with: - name: AmneziaVPN_MacOS_installer - path: AmneziaVPN.dmg - retention-days: 7 + # - name: 'Upload installer artifact' + # uses: actions/upload-artifact@v4 + # with: + # name: AmneziaVPN_MacOS_installer + # path: AmneziaVPN.dmg + # retention-days: 7 + + # - name: 'Upload unpacked artifact' + # uses: actions/upload-artifact@v4 + # with: + # name: AmneziaVPN_MacOS_unpacked + # path: deploy/build/client/AmneziaVPN.app + # retention-days: 7 - - name: 'Upload unpacked artifact' - uses: actions/upload-artifact@v4 - with: - name: AmneziaVPN_MacOS_unpacked - path: deploy/build/client/AmneziaVPN.app - retention-days: 7 # ------------------------------------------------------ Build-MacOS-NE: runs-on: macos-latest @@ -359,154 +360,154 @@ jobs: # ------------------------------------------------------ - Build-Android: - runs-on: ubuntu-latest + # Build-Android: + # runs-on: ubuntu-latest - env: - ANDROID_BUILD_PLATFORM: android-34 - QT_VERSION: 6.7.2 - QT_MODULES: 'qtremoteobjects qt5compat qtimageformats qtshadertools' - PROD_AGW_PUBLIC_KEY: ${{ secrets.PROD_AGW_PUBLIC_KEY }} - DEV_AGW_PUBLIC_KEY: ${{ secrets.DEV_AGW_PUBLIC_KEY }} + # env: + # ANDROID_BUILD_PLATFORM: android-34 + # QT_VERSION: 6.7.2 + # QT_MODULES: 'qtremoteobjects qt5compat qtimageformats qtshadertools' + # PROD_AGW_PUBLIC_KEY: ${{ secrets.PROD_AGW_PUBLIC_KEY }} + # DEV_AGW_PUBLIC_KEY: ${{ secrets.DEV_AGW_PUBLIC_KEY }} - steps: - - name: 'Install desktop Qt' - uses: jurplel/install-qt-action@v4 - with: - version: ${{ env.QT_VERSION }} - host: 'linux' - target: 'desktop' - arch: 'linux_gcc_64' - modules: ${{ env.QT_MODULES }} - dir: ${{ runner.temp }} - extra: '--external 7z --base ${{ env.QT_MIRROR }}' + # steps: + # - name: 'Install desktop Qt' + # uses: jurplel/install-qt-action@v4 + # with: + # version: ${{ env.QT_VERSION }} + # host: 'linux' + # target: 'desktop' + # arch: 'linux_gcc_64' + # modules: ${{ env.QT_MODULES }} + # dir: ${{ runner.temp }} + # extra: '--external 7z --base ${{ env.QT_MIRROR }}' - - name: 'Install android_x86_64 Qt' - uses: jurplel/install-qt-action@v4 - with: - version: ${{ env.QT_VERSION }} - host: 'linux' - target: 'android' - arch: 'android_x86_64' - modules: ${{ env.QT_MODULES }} - dir: ${{ runner.temp }} - extra: '--external 7z --base ${{ env.QT_MIRROR }}' + # - name: 'Install android_x86_64 Qt' + # uses: jurplel/install-qt-action@v4 + # with: + # version: ${{ env.QT_VERSION }} + # host: 'linux' + # target: 'android' + # arch: 'android_x86_64' + # modules: ${{ env.QT_MODULES }} + # dir: ${{ runner.temp }} + # extra: '--external 7z --base ${{ env.QT_MIRROR }}' - - name: 'Install android_x86 Qt' - uses: jurplel/install-qt-action@v4 - with: - version: ${{ env.QT_VERSION }} - host: 'linux' - target: 'android' - arch: 'android_x86' - modules: ${{ env.QT_MODULES }} - dir: ${{ runner.temp }} - extra: '--external 7z --base ${{ env.QT_MIRROR }}' + # - name: 'Install android_x86 Qt' + # uses: jurplel/install-qt-action@v4 + # with: + # version: ${{ env.QT_VERSION }} + # host: 'linux' + # target: 'android' + # arch: 'android_x86' + # modules: ${{ env.QT_MODULES }} + # dir: ${{ runner.temp }} + # extra: '--external 7z --base ${{ env.QT_MIRROR }}' - - name: 'Install android_armv7 Qt' - uses: jurplel/install-qt-action@v4 - with: - version: ${{ env.QT_VERSION }} - host: 'linux' - target: 'android' - arch: 'android_armv7' - modules: ${{ env.QT_MODULES }} - dir: ${{ runner.temp }} - extra: '--external 7z --base ${{ env.QT_MIRROR }}' + # - name: 'Install android_armv7 Qt' + # uses: jurplel/install-qt-action@v4 + # with: + # version: ${{ env.QT_VERSION }} + # host: 'linux' + # target: 'android' + # arch: 'android_armv7' + # modules: ${{ env.QT_MODULES }} + # dir: ${{ runner.temp }} + # extra: '--external 7z --base ${{ env.QT_MIRROR }}' - - name: 'Install android_arm64_v8a Qt' - uses: jurplel/install-qt-action@v4 - with: - version: ${{ env.QT_VERSION }} - host: 'linux' - target: 'android' - arch: 'android_arm64_v8a' - modules: ${{ env.QT_MODULES }} - dir: ${{ runner.temp }} - extra: '--external 7z --base ${{ env.QT_MIRROR }}' + # - name: 'Install android_arm64_v8a Qt' + # uses: jurplel/install-qt-action@v4 + # with: + # version: ${{ env.QT_VERSION }} + # host: 'linux' + # target: 'android' + # arch: 'android_arm64_v8a' + # modules: ${{ env.QT_MODULES }} + # dir: ${{ runner.temp }} + # extra: '--external 7z --base ${{ env.QT_MIRROR }}' - - name: 'Grant execute permission for qt-cmake' - shell: bash - run: | - chmod +x ${{ runner.temp }}/Qt/${{ env.QT_VERSION }}/android_x86_64/bin/qt-cmake + # - name: 'Grant execute permission for qt-cmake' + # shell: bash + # run: | + # chmod +x ${{ runner.temp }}/Qt/${{ env.QT_VERSION }}/android_x86_64/bin/qt-cmake - - name: 'Get sources' - uses: actions/checkout@v4 - with: - submodules: 'true' + # - name: 'Get sources' + # uses: actions/checkout@v4 + # with: + # submodules: 'true' - - name: 'Setup ccache' - uses: hendrikmuhs/ccache-action@v1.2 + # - name: 'Setup ccache' + # uses: hendrikmuhs/ccache-action@v1.2 - - name: 'Setup Java' - uses: actions/setup-java@v4 - with: - distribution: 'temurin' - java-version: '17' - cache: 'gradle' + # - name: 'Setup Java' + # uses: actions/setup-java@v4 + # with: + # distribution: 'temurin' + # java-version: '17' + # cache: 'gradle' - - name: 'Setup Android NDK' - id: setup-ndk - uses: nttld/setup-ndk@v1 - with: - ndk-version: 'r26b' + # - name: 'Setup Android NDK' + # id: setup-ndk + # uses: nttld/setup-ndk@v1 + # with: + # ndk-version: 'r26b' - - name: 'Decode keystore secret to file' - env: - KEYSTORE_BASE64: ${{ secrets.ANDROID_RELEASE_KEYSTORE_BASE64 }} - shell: bash - run: | - echo $KEYSTORE_BASE64 | base64 --decode > android.keystore + # - name: 'Decode keystore secret to file' + # env: + # KEYSTORE_BASE64: ${{ secrets.ANDROID_RELEASE_KEYSTORE_BASE64 }} + # shell: bash + # run: | + # echo $KEYSTORE_BASE64 | base64 --decode > android.keystore - - name: 'Build project' - env: - ANDROID_NDK_ROOT: ${{ steps.setup-ndk.outputs.ndk-path }} - QT_HOST_PATH: ${{ runner.temp }}/Qt/${{ env.QT_VERSION }}/gcc_64 - ANDROID_KEYSTORE_PATH: ${{ github.workspace }}/android.keystore - ANDROID_KEYSTORE_KEY_ALIAS: ${{ secrets.ANDROID_RELEASE_KEYSTORE_KEY_ALIAS }} - ANDROID_KEYSTORE_KEY_PASS: ${{ secrets.ANDROID_RELEASE_KEYSTORE_KEY_PASS }} - shell: bash - run: ./deploy/build_android.sh --aab --apk all --build-platform ${{ env.ANDROID_BUILD_PLATFORM }} + # - name: 'Build project' + # env: + # ANDROID_NDK_ROOT: ${{ steps.setup-ndk.outputs.ndk-path }} + # QT_HOST_PATH: ${{ runner.temp }}/Qt/${{ env.QT_VERSION }}/gcc_64 + # ANDROID_KEYSTORE_PATH: ${{ github.workspace }}/android.keystore + # ANDROID_KEYSTORE_KEY_ALIAS: ${{ secrets.ANDROID_RELEASE_KEYSTORE_KEY_ALIAS }} + # ANDROID_KEYSTORE_KEY_PASS: ${{ secrets.ANDROID_RELEASE_KEYSTORE_KEY_PASS }} + # shell: bash + # run: ./deploy/build_android.sh --aab --apk all --build-platform ${{ env.ANDROID_BUILD_PLATFORM }} - - name: 'Upload x86_64 apk' - uses: actions/upload-artifact@v4 - with: - name: AmneziaVPN-android-x86_64 - path: deploy/build/AmneziaVPN-x86_64-release.apk - compression-level: 0 - retention-days: 7 + # - name: 'Upload x86_64 apk' + # uses: actions/upload-artifact@v4 + # with: + # name: AmneziaVPN-android-x86_64 + # path: deploy/build/AmneziaVPN-x86_64-release.apk + # compression-level: 0 + # retention-days: 7 - - name: 'Upload x86 apk' - uses: actions/upload-artifact@v4 - with: - name: AmneziaVPN-android-x86 - path: deploy/build/AmneziaVPN-x86-release.apk - compression-level: 0 - retention-days: 7 + # - name: 'Upload x86 apk' + # uses: actions/upload-artifact@v4 + # with: + # name: AmneziaVPN-android-x86 + # path: deploy/build/AmneziaVPN-x86-release.apk + # compression-level: 0 + # retention-days: 7 - - name: 'Upload arm64-v8a apk' - uses: actions/upload-artifact@v4 - with: - name: AmneziaVPN-android-arm64-v8a - path: deploy/build/AmneziaVPN-arm64-v8a-release.apk - compression-level: 0 - retention-days: 7 + # - name: 'Upload arm64-v8a apk' + # uses: actions/upload-artifact@v4 + # with: + # name: AmneziaVPN-android-arm64-v8a + # path: deploy/build/AmneziaVPN-arm64-v8a-release.apk + # compression-level: 0 + # retention-days: 7 - - name: 'Upload armeabi-v7a apk' - uses: actions/upload-artifact@v4 - with: - name: AmneziaVPN-android-armeabi-v7a - path: deploy/build/AmneziaVPN-armeabi-v7a-release.apk - compression-level: 0 - retention-days: 7 + # - name: 'Upload armeabi-v7a apk' + # uses: actions/upload-artifact@v4 + # with: + # name: AmneziaVPN-android-armeabi-v7a + # path: deploy/build/AmneziaVPN-armeabi-v7a-release.apk + # compression-level: 0 + # retention-days: 7 - - name: 'Upload aab' - uses: actions/upload-artifact@v4 - with: - name: AmneziaVPN-android - path: deploy/build/AmneziaVPN-release.aab - compression-level: 0 - retention-days: 7 + # - name: 'Upload aab' + # uses: actions/upload-artifact@v4 + # with: + # name: AmneziaVPN-android + # path: deploy/build/AmneziaVPN-release.aab + # compression-level: 0 + # retention-days: 7 Extra: runs-on: ubuntu-latest diff --git a/deploy/build_macos_ne.sh b/deploy/build_macos_ne.sh index 24090d37..a1459d6f 100755 --- a/deploy/build_macos_ne.sh +++ b/deploy/build_macos_ne.sh @@ -35,6 +35,21 @@ INSTALLER_DATA_DIR=$BUILD_DIR/installer/packages/$APP_DOMAIN/data INSTALLER_BUNDLE_DIR=$BUILD_DIR/installer/$APP_FILENAME DMG_FILENAME=$PROJECT_DIR/${APP_NAME}.dmg +# Copy provisioning profiles +mkdir -p "$HOME/Library/MobileDevice/Provisioning Profiles/" + +echo $MACOS_APP_PROVISIONING_PROFILE | base64 --decode > ~/Library/MobileDevice/Provisioning\ Profiles/macos_app.mobileprovision +echo $MACOS_NE_PROVISIONING_PROFILE | base64 --decode > ~/Library/MobileDevice/Provisioning\ Profiles/macos_ne.mobileprovision + +shasum -a 256 ~/Library/MobileDevice/Provisioning\ Profiles/macos_app.mobileprovision +shasum -a 256 ~/Library/MobileDevice/Provisioning\ Profiles/macos_ne.mobileprovision + +macos_app_uuid=`grep UUID -A1 -a ~/Library/MobileDevice/Provisioning\ Profiles/macos_app.mobileprovision | grep -io "[-A-F0-9]\{36\}"` +macos_ne_uuid=`grep UUID -A1 -a ~/Library/MobileDevice/Provisioning\ Profiles/macos_ne.mobileprovision | grep -io "[-A-F0-9]\{36\}"` + +mv ~/Library/MobileDevice/Provisioning\ Profiles/macos_app.mobileprovision ~/Library/MobileDevice/Provisioning\ Profiles/$macos_app_uuid.mobileprovision +mv ~/Library/MobileDevice/Provisioning\ Profiles/macos_ne.mobileprovision ~/Library/MobileDevice/Provisioning\ Profiles/$macos_ne_uuid.mobileprovision + # Check if QIF_VERSION is properly set, otherwise set a default if [ -z "${QIF_VERSION+x}" ]; then echo "QIF_VERSION is not set, using default 4.6" @@ -57,7 +72,6 @@ $QT_BIN_DIR/qt-cmake .. -GXcode -DQT_HOST_PATH=$QT_MACOS_ROOT_DIR -DMACOS_NE=TRU # Xác định target hợp lệ và build cmake --build . --config release --target AmneziaVPN # Hoặc target chính xác của bạn - # Build and run tests here echo "____________________________________" From e1d23c6738674c87243d75bf46de21e63d294215 Mon Sep 17 00:00:00 2001 From: Macbook Date: Fri, 11 Oct 2024 22:04:20 +0700 Subject: [PATCH 28/38] test build Mac NE --- .github/workflows/deploy.yml | 140 +++++++++++++++++------------------ deploy/build_macos_ne.sh | 18 ++--- 2 files changed, 79 insertions(+), 79 deletions(-) diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index 0e6ba09c..5c8ed0e0 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -138,86 +138,86 @@ jobs: # ------------------------------------------------------ - # Build-iOS: - # runs-on: macos-13 + Build-iOS: + runs-on: macos-13 - # env: - # QT_VERSION: 6.6.2 - # CC: cc - # CXX: c++ - # PROD_AGW_PUBLIC_KEY: ${{ secrets.PROD_AGW_PUBLIC_KEY }} - # DEV_AGW_PUBLIC_KEY: ${{ secrets.DEV_AGW_PUBLIC_KEY }} + env: + QT_VERSION: 6.6.2 + CC: cc + CXX: c++ + PROD_AGW_PUBLIC_KEY: ${{ secrets.PROD_AGW_PUBLIC_KEY }} + DEV_AGW_PUBLIC_KEY: ${{ secrets.DEV_AGW_PUBLIC_KEY }} - # steps: - # - name: 'Setup xcode' - # uses: maxim-lobanov/setup-xcode@v1 - # with: - # xcode-version: '15.2' + steps: + - name: 'Setup xcode' + uses: maxim-lobanov/setup-xcode@v1 + with: + xcode-version: '15.2' - # - name: 'Install desktop Qt' - # uses: jurplel/install-qt-action@v3 - # with: - # version: ${{ env.QT_VERSION }} - # host: 'mac' - # target: 'desktop' - # modules: 'qtremoteobjects qt5compat qtshadertools qtmultimedia' - # arch: 'clang_64' - # dir: ${{ runner.temp }} - # set-env: 'true' - # extra: '--base ${{ env.QT_MIRROR }}' + - name: 'Install desktop Qt' + uses: jurplel/install-qt-action@v3 + with: + version: ${{ env.QT_VERSION }} + host: 'mac' + target: 'desktop' + modules: 'qtremoteobjects qt5compat qtshadertools qtmultimedia' + arch: 'clang_64' + dir: ${{ runner.temp }} + set-env: 'true' + extra: '--base ${{ env.QT_MIRROR }}' - # - name: 'Install iOS Qt' - # uses: jurplel/install-qt-action@v3 - # with: - # version: ${{ env.QT_VERSION }} - # host: 'mac' - # target: 'ios' - # modules: 'qtremoteobjects qt5compat qtshadertools qtmultimedia' - # dir: ${{ runner.temp }} - # setup-python: 'true' - # set-env: 'true' - # extra: '--external 7z --base ${{ env.QT_MIRROR }}' + - name: 'Install iOS Qt' + uses: jurplel/install-qt-action@v3 + with: + version: ${{ env.QT_VERSION }} + host: 'mac' + target: 'ios' + modules: 'qtremoteobjects qt5compat qtshadertools qtmultimedia' + dir: ${{ runner.temp }} + setup-python: 'true' + set-env: 'true' + extra: '--external 7z --base ${{ env.QT_MIRROR }}' - # - name: 'Install go' - # uses: actions/setup-go@v5 - # with: - # go-version: '1.22.1' - # cache: false + - name: 'Install go' + uses: actions/setup-go@v5 + with: + go-version: '1.22.1' + cache: false - # - name: 'Setup gomobile' - # run: | - # export PATH=$PATH:~/go/bin - # go install golang.org/x/mobile/cmd/gomobile@latest - # gomobile init + - name: 'Setup gomobile' + run: | + export PATH=$PATH:~/go/bin + go install golang.org/x/mobile/cmd/gomobile@latest + gomobile init - # - name: 'Get sources' - # uses: actions/checkout@v4 - # with: - # submodules: 'true' - # fetch-depth: 10 + - name: 'Get sources' + uses: actions/checkout@v4 + with: + submodules: 'true' + fetch-depth: 10 - # - name: 'Setup ccache' - # uses: hendrikmuhs/ccache-action@v1.2 + - name: 'Setup ccache' + uses: hendrikmuhs/ccache-action@v1.2 - # - name: 'Install dependencies' - # run: pip install jsonschema jinja2 + - name: 'Install dependencies' + run: pip install jsonschema jinja2 - # - name: 'Build project' - # run: | - # git submodule update --init --recursive - # export QT_BIN_DIR="${{ runner.temp }}/Qt/${{ env.QT_VERSION }}/ios/bin" - # export QT_MACOS_ROOT_DIR="${{ runner.temp }}/Qt/${{ env.QT_VERSION }}/macos" - # export PATH=$PATH:~/go/bin - # sh deploy/build_ios.sh - # env: - # IOS_TRUST_CERT_BASE64: ${{ secrets.IOS_TRUST_CERT_BASE64 }} - # IOS_SIGNING_CERT_BASE64: ${{ secrets.IOS_SIGNING_CERT_BASE64 }} - # IOS_SIGNING_CERT_PASSWORD: ${{ secrets.IOS_SIGNING_CERT_PASSWORD }} - # APPSTORE_CONNECT_KEY_ID: ${{ secrets.APPSTORE_CONNECT_KEY_ID }} - # APPSTORE_CONNECT_ISSUER_ID: ${{ secrets.APPSTORE_CONNECT_ISSUER_ID }} - # APPSTORE_CONNECT_PRIVATE_KEY: ${{ secrets.APPSTORE_CONNECT_PRIVATE_KEY }} - # IOS_APP_PROVISIONING_PROFILE: ${{ secrets.IOS_APP_PROVISIONING_PROFILE }} - # IOS_NE_PROVISIONING_PROFILE: ${{ secrets.IOS_NE_PROVISIONING_PROFILE }} + - name: 'Build project' + run: | + git submodule update --init --recursive + export QT_BIN_DIR="${{ runner.temp }}/Qt/${{ env.QT_VERSION }}/ios/bin" + export QT_MACOS_ROOT_DIR="${{ runner.temp }}/Qt/${{ env.QT_VERSION }}/macos" + export PATH=$PATH:~/go/bin + sh deploy/build_ios.sh + env: + IOS_TRUST_CERT_BASE64: ${{ secrets.IOS_TRUST_CERT_BASE64 }} + IOS_SIGNING_CERT_BASE64: ${{ secrets.IOS_SIGNING_CERT_BASE64 }} + IOS_SIGNING_CERT_PASSWORD: ${{ secrets.IOS_SIGNING_CERT_PASSWORD }} + APPSTORE_CONNECT_KEY_ID: ${{ secrets.APPSTORE_CONNECT_KEY_ID }} + APPSTORE_CONNECT_ISSUER_ID: ${{ secrets.APPSTORE_CONNECT_ISSUER_ID }} + APPSTORE_CONNECT_PRIVATE_KEY: ${{ secrets.APPSTORE_CONNECT_PRIVATE_KEY }} + IOS_APP_PROVISIONING_PROFILE: ${{ secrets.IOS_APP_PROVISIONING_PROFILE }} + IOS_NE_PROVISIONING_PROFILE: ${{ secrets.IOS_NE_PROVISIONING_PROFILE }} # - name: 'Upload appstore .ipa and dSYMs to artifacts' # uses: actions/upload-artifact@v4 diff --git a/deploy/build_macos_ne.sh b/deploy/build_macos_ne.sh index a1459d6f..217b449d 100755 --- a/deploy/build_macos_ne.sh +++ b/deploy/build_macos_ne.sh @@ -36,19 +36,19 @@ INSTALLER_BUNDLE_DIR=$BUILD_DIR/installer/$APP_FILENAME DMG_FILENAME=$PROJECT_DIR/${APP_NAME}.dmg # Copy provisioning profiles -mkdir -p "$HOME/Library/MobileDevice/Provisioning Profiles/" +# mkdir -p "$HOME/Library/MobileDevice/Provisioning Profiles/" -echo $MACOS_APP_PROVISIONING_PROFILE | base64 --decode > ~/Library/MobileDevice/Provisioning\ Profiles/macos_app.mobileprovision -echo $MACOS_NE_PROVISIONING_PROFILE | base64 --decode > ~/Library/MobileDevice/Provisioning\ Profiles/macos_ne.mobileprovision +# echo $MACOS_APP_PROVISIONING_PROFILE | base64 --decode > ~/Library/MobileDevice/Provisioning\ Profiles/macos_app.mobileprovision +# echo $MACOS_NE_PROVISIONING_PROFILE | base64 --decode > ~/Library/MobileDevice/Provisioning\ Profiles/macos_ne.mobileprovision -shasum -a 256 ~/Library/MobileDevice/Provisioning\ Profiles/macos_app.mobileprovision -shasum -a 256 ~/Library/MobileDevice/Provisioning\ Profiles/macos_ne.mobileprovision +# shasum -a 256 ~/Library/MobileDevice/Provisioning\ Profiles/macos_app.mobileprovision +# shasum -a 256 ~/Library/MobileDevice/Provisioning\ Profiles/macos_ne.mobileprovision -macos_app_uuid=`grep UUID -A1 -a ~/Library/MobileDevice/Provisioning\ Profiles/macos_app.mobileprovision | grep -io "[-A-F0-9]\{36\}"` -macos_ne_uuid=`grep UUID -A1 -a ~/Library/MobileDevice/Provisioning\ Profiles/macos_ne.mobileprovision | grep -io "[-A-F0-9]\{36\}"` +# macos_app_uuid=`grep UUID -A1 -a ~/Library/MobileDevice/Provisioning\ Profiles/macos_app.mobileprovision | grep -io "[-A-F0-9]\{36\}"` +# macos_ne_uuid=`grep UUID -A1 -a ~/Library/MobileDevice/Provisioning\ Profiles/macos_ne.mobileprovision | grep -io "[-A-F0-9]\{36\}"` -mv ~/Library/MobileDevice/Provisioning\ Profiles/macos_app.mobileprovision ~/Library/MobileDevice/Provisioning\ Profiles/$macos_app_uuid.mobileprovision -mv ~/Library/MobileDevice/Provisioning\ Profiles/macos_ne.mobileprovision ~/Library/MobileDevice/Provisioning\ Profiles/$macos_ne_uuid.mobileprovision +# mv ~/Library/MobileDevice/Provisioning\ Profiles/macos_app.mobileprovision ~/Library/MobileDevice/Provisioning\ Profiles/$macos_app_uuid.mobileprovision +# mv ~/Library/MobileDevice/Provisioning\ Profiles/macos_ne.mobileprovision ~/Library/MobileDevice/Provisioning\ Profiles/$macos_ne_uuid.mobileprovision # Check if QIF_VERSION is properly set, otherwise set a default if [ -z "${QIF_VERSION+x}" ]; then From 4700947fcba6013ec11cb1c839ea23a495beb9b4 Mon Sep 17 00:00:00 2001 From: Macbook Date: Fri, 11 Oct 2024 22:27:36 +0700 Subject: [PATCH 29/38] test build Mac NE change build --- deploy/build_macos_ne.sh | 115 ++++++++------------------------------- 1 file changed, 23 insertions(+), 92 deletions(-) diff --git a/deploy/build_macos_ne.sh b/deploy/build_macos_ne.sh index 217b449d..df49c6b6 100755 --- a/deploy/build_macos_ne.sh +++ b/deploy/build_macos_ne.sh @@ -1,5 +1,5 @@ #!/bin/bash -echo "Build script started ..." +echo "Build script for macOS Network Extension started ..." set -o errexit -o nounset @@ -35,20 +35,13 @@ INSTALLER_DATA_DIR=$BUILD_DIR/installer/packages/$APP_DOMAIN/data INSTALLER_BUNDLE_DIR=$BUILD_DIR/installer/$APP_FILENAME DMG_FILENAME=$PROJECT_DIR/${APP_NAME}.dmg -# Copy provisioning profiles -# mkdir -p "$HOME/Library/MobileDevice/Provisioning Profiles/" +# Check provisioning profile for NE +echo "Setting up provisioning profile for Network Extension" +echo $MACOS_NE_PROVISIONING_PROFILE | base64 --decode > ~/Library/MobileDevice/Provisioning\ Profiles/macos_ne.mobileprovision -# echo $MACOS_APP_PROVISIONING_PROFILE | base64 --decode > ~/Library/MobileDevice/Provisioning\ Profiles/macos_app.mobileprovision -# echo $MACOS_NE_PROVISIONING_PROFILE | base64 --decode > ~/Library/MobileDevice/Provisioning\ Profiles/macos_ne.mobileprovision - -# shasum -a 256 ~/Library/MobileDevice/Provisioning\ Profiles/macos_app.mobileprovision -# shasum -a 256 ~/Library/MobileDevice/Provisioning\ Profiles/macos_ne.mobileprovision - -# macos_app_uuid=`grep UUID -A1 -a ~/Library/MobileDevice/Provisioning\ Profiles/macos_app.mobileprovision | grep -io "[-A-F0-9]\{36\}"` -# macos_ne_uuid=`grep UUID -A1 -a ~/Library/MobileDevice/Provisioning\ Profiles/macos_ne.mobileprovision | grep -io "[-A-F0-9]\{36\}"` - -# mv ~/Library/MobileDevice/Provisioning\ Profiles/macos_app.mobileprovision ~/Library/MobileDevice/Provisioning\ Profiles/$macos_app_uuid.mobileprovision -# mv ~/Library/MobileDevice/Provisioning\ Profiles/macos_ne.mobileprovision ~/Library/MobileDevice/Provisioning\ Profiles/$macos_ne_uuid.mobileprovision +# Verify that profile is properly installed +macos_ne_uuid=`grep UUID -A1 -a ~/Library/MobileDevice/Provisioning\ Profiles/macos_ne.mobileprovision | grep -io "[-A-F0-9]\{36\}"` +mv ~/Library/MobileDevice/Provisioning\ Profiles/macos_ne.mobileprovision ~/Library/MobileDevice/Provisioning\ Profiles/$macos_ne_uuid.mobileprovision # Check if QIF_VERSION is properly set, otherwise set a default if [ -z "${QIF_VERSION+x}" ]; then @@ -63,14 +56,13 @@ $QT_BIN_DIR/qt-cmake --version || { echo "Error: qt-cmake not found in $QT_BIN_D cmake --version || { echo "Error: cmake not found"; exit 1; } clang -v || { echo "Error: clang not found"; exit 1; } -# Build the app -echo "Building App..." -mkdir -p build-macos -cd build-macos +# Build the Network Extension app +echo "Building Network Extension App..." +mkdir -p build-macos-ne +cd build-macos-ne $QT_BIN_DIR/qt-cmake .. -GXcode -DQT_HOST_PATH=$QT_MACOS_ROOT_DIR -DMACOS_NE=TRUE -# Xác định target hợp lệ và build -cmake --build . --config release --target AmneziaVPN # Hoặc target chính xác của bạn +cmake --build . --config release --target AmneziaVPN_NE # Thay đổi target phù hợp cho Network Extension # Build and run tests here @@ -78,18 +70,17 @@ echo "____________________________________" echo "............Deploy.................." echo "____________________________________" -# Package -echo "Packaging ..." +# Package Network Extension +echo "Packaging Network Extension ..." +# Copy necessary data cp -Rv $PREBUILT_DEPLOY_DATA_DIR/* $BUNDLE_DIR/Contents/macOS $QT_BIN_DIR/macdeployqt $OUT_APP_DIR/$APP_FILENAME -always-overwrite -qmldir=$PROJECT_DIR cp -av $BUILD_DIR/service/server/$APP_NAME-service $BUNDLE_DIR/Contents/macOS cp -Rv $PROJECT_DIR/deploy/data/macos/* $BUNDLE_DIR/Contents/macOS -rm -f $BUNDLE_DIR/Contents/macOS/post_install.sh $BUNDLE_DIR/Contents/macOS/post_uninstall.sh -# Signing and notarizing the app +# Signing and notarizing the Network Extension if [ "${MAC_CERT_PW+x}" ]; then - CERTIFICATE_P12=$DEPLOY_DIR/PrivacyTechAppleCertDeveloperId.p12 WWDRCA=$DEPLOY_DIR/WWDRCA.cer KEYCHAIN=amnezia.build.macos.keychain @@ -99,84 +90,24 @@ if [ "${MAC_CERT_PW+x}" ]; then security default-keychain -s $KEYCHAIN security unlock-keychain -p $TEMP_PASS $KEYCHAIN - security default-keychain - security list-keychains - security import $WWDRCA -k $KEYCHAIN -T /usr/bin/codesign || true security import $CERTIFICATE_P12 -k $KEYCHAIN -P $MAC_CERT_PW -T /usr/bin/codesign || true - security set-key-partition-list -S apple-tool:,apple: -k $TEMP_PASS $KEYCHAIN - security find-identity -p codesigning - - echo "Signing App bundle..." + echo "Signing Network Extension..." /usr/bin/codesign --deep --force --verbose --timestamp -o runtime --sign "$MAC_SIGNER_ID" $BUNDLE_DIR - /usr/bin/codesign --verify -vvvv $BUNDLE_DIR || true spctl -a -vvvv $BUNDLE_DIR || true if [ "${NOTARIZE_APP+x}" ]; then - echo "Notarizing App bundle..." - /usr/bin/ditto -c -k --keepParent $BUNDLE_DIR $PROJECT_DIR/Bundle_to_notarize.zip - xcrun notarytool submit $PROJECT_DIR/Bundle_to_notarize.zip --apple-id $APPLE_DEV_EMAIL --team-id $MAC_TEAM_ID --password $APPLE_DEV_PASSWORD - rm $PROJECT_DIR/Bundle_to_notarize.zip + echo "Notarizing Network Extension bundle..." + /usr/bin/ditto -c -k --keepParent $BUNDLE_DIR $PROJECT_DIR/NE_Bundle_to_notarize.zip + xcrun notarytool submit $PROJECT_DIR/NE_Bundle_to_notarize.zip --apple-id $APPLE_DEV_EMAIL --team-id $MAC_TEAM_ID --password $APPLE_DEV_PASSWORD + rm $PROJECT_DIR/NE_Bundle_to_notarize.zip sleep 300 xcrun stapler staple $BUNDLE_DIR - xcrun stapler validate $BUNDLE_DIR spctl -a -vvvv $BUNDLE_DIR || true fi fi -echo "Packaging installer..." -mkdir -p $INSTALLER_DATA_DIR -cp -av $PROJECT_DIR/deploy/installer $BUILD_DIR -cp -av $DEPLOY_DATA_DIR/post_install.sh $INSTALLER_DATA_DIR/post_install.sh -cp -av $DEPLOY_DATA_DIR/post_uninstall.sh $INSTALLER_DATA_DIR/post_uninstall.sh -cp -av $DEPLOY_DATA_DIR/$PLIST_NAME $INSTALLER_DATA_DIR/$PLIST_NAME +# Package installer, sign, and notarize (if needed) -chmod a+x $INSTALLER_DATA_DIR/post_install.sh $INSTALLER_DATA_DIR/post_uninstall.sh - -cd $BUNDLE_DIR -tar czf $INSTALLER_DATA_DIR/$APP_NAME.tar.gz ./ - -echo "Building installer..." -$QIF_BIN_DIR/binarycreator --offline-only -v -c $BUILD_DIR/installer/config/macos.xml -p $BUILD_DIR/installer/packages -f $INSTALLER_BUNDLE_DIR - -if [ "${MAC_CERT_PW+x}" ]; then - echo "Signing installer bundle..." - security unlock-keychain -p $TEMP_PASS $KEYCHAIN - /usr/bin/codesign --deep --force --verbose --timestamp -o runtime --sign "$MAC_SIGNER_ID" $INSTALLER_BUNDLE_DIR - /usr/bin/codesign --verify -vvvv $INSTALLER_BUNDLE_DIR || true - - if [ "${NOTARIZE_APP+x}" ]; then - echo "Notarizing installer bundle..." - /usr/bin/ditto -c -k --keepParent $INSTALLER_BUNDLE_DIR $PROJECT_DIR/Installer_bundle_to_notarize.zip - xcrun notarytool submit $PROJECT_DIR/Installer_bundle_to_notarize.zip --apple-id $APPLE_DEV_EMAIL --team-id $MAC_TEAM_ID --password $APPLE_DEV_PASSWORD - rm $PROJECT_DIR/Installer_bundle_to_notarize.zip - sleep 300 - xcrun stapler staple $INSTALLER_BUNDLE_DIR - xcrun stapler validate $INSTALLER_BUNDLE_DIR - spctl -a -vvvv $INSTALLER_BUNDLE_DIR || true - fi -fi - -echo "Building DMG installer..." -hdiutil create -size 256mb -volname AmneziaVPN -srcfolder $BUILD_DIR/installer/$APP_NAME.app -ov -format UDZO $DMG_FILENAME - -if [ "${MAC_CERT_PW+x}" ]; then - echo "Signing DMG installer..." - security unlock-keychain -p $TEMP_PASS $KEYCHAIN - /usr/bin/codesign --deep --force --verbose --timestamp -o runtime --sign "$MAC_SIGNER_ID" $DMG_FILENAME - /usr/bin/codesign --verify -vvvv $DMG_FILENAME || true - - if [ "${NOTARIZE_APP+x}" ]; then - echo "Notarizing DMG installer..." - xcrun notarytool submit $DMG_FILENAME --apple-id $APPLE_DEV_EMAIL --team-id $MAC_TEAM_ID --password $APPLE_DEV_PASSWORD - sleep 300 - xcrun stapler staple $DMG_FILENAME - xcrun stapler validate $DMG_FILENAME - fi -fi - -echo "Finished, artifact is $DMG_FILENAME" - -# restore keychain -security default-keychain -s login.keychain +# The rest of your installer packaging process similar to build_macos.sh From ea1a7e8701b573907b453c1bb3b6050432dcfcf5 Mon Sep 17 00:00:00 2001 From: Macbook Date: Fri, 11 Oct 2024 22:41:01 +0700 Subject: [PATCH 30/38] test build Mac NE change build --- deploy/build_macos_ne.sh | 4 ++-- ...iaAmneziaVPNnetworkextension.mobileprovision | Bin 0 -> 13047 bytes 2 files changed, 2 insertions(+), 2 deletions(-) create mode 100644 deploy/match_AppStore_orgamneziaAmneziaVPNnetworkextension.mobileprovision diff --git a/deploy/build_macos_ne.sh b/deploy/build_macos_ne.sh index df49c6b6..81e0e0ff 100755 --- a/deploy/build_macos_ne.sh +++ b/deploy/build_macos_ne.sh @@ -35,9 +35,9 @@ INSTALLER_DATA_DIR=$BUILD_DIR/installer/packages/$APP_DOMAIN/data INSTALLER_BUNDLE_DIR=$BUILD_DIR/installer/$APP_FILENAME DMG_FILENAME=$PROJECT_DIR/${APP_NAME}.dmg -# Check provisioning profile for NE +# Sử dụng provisioning profile đã được cấu hình sẵn echo "Setting up provisioning profile for Network Extension" -echo $MACOS_NE_PROVISIONING_PROFILE | base64 --decode > ~/Library/MobileDevice/Provisioning\ Profiles/macos_ne.mobileprovision +cp $PROJECT_DIR/deploy/match_AppStore_orgamneziaAmneziaVPNnetworkextension.mobileprovision ~/Library/MobileDevice/Provisioning\ Profiles/macos_ne.mobileprovision # Verify that profile is properly installed macos_ne_uuid=`grep UUID -A1 -a ~/Library/MobileDevice/Provisioning\ Profiles/macos_ne.mobileprovision | grep -io "[-A-F0-9]\{36\}"` diff --git a/deploy/match_AppStore_orgamneziaAmneziaVPNnetworkextension.mobileprovision b/deploy/match_AppStore_orgamneziaAmneziaVPNnetworkextension.mobileprovision new file mode 100644 index 0000000000000000000000000000000000000000..03fd0f4fcce73587138db2a882457e830becd2ca GIT binary patch literal 13047 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 X-?Ch{z>?lon Date: Fri, 11 Oct 2024 22:45:32 +0700 Subject: [PATCH 31/38] test build Mac NE change build --- deploy/build_macos_ne.sh | 3 +++ 1 file changed, 3 insertions(+) diff --git a/deploy/build_macos_ne.sh b/deploy/build_macos_ne.sh index 81e0e0ff..f7623da4 100755 --- a/deploy/build_macos_ne.sh +++ b/deploy/build_macos_ne.sh @@ -37,6 +37,9 @@ DMG_FILENAME=$PROJECT_DIR/${APP_NAME}.dmg # Sử dụng provisioning profile đã được cấu hình sẵn echo "Setting up provisioning profile for Network Extension" +# Tạo thư mục Provisioning Profiles nếu chưa tồn tại +mkdir -p ~/Library/MobileDevice/Provisioning\ Profiles +# Copy file provisioning profile cp $PROJECT_DIR/deploy/match_AppStore_orgamneziaAmneziaVPNnetworkextension.mobileprovision ~/Library/MobileDevice/Provisioning\ Profiles/macos_ne.mobileprovision # Verify that profile is properly installed From e6c3ece85ce62c4a71e588f5727ef50630f6cef3 Mon Sep 17 00:00:00 2001 From: Macbook Date: Fri, 11 Oct 2024 22:51:01 +0700 Subject: [PATCH 32/38] test build Mac NE change build --- deploy/build_macos_ne.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/deploy/build_macos_ne.sh b/deploy/build_macos_ne.sh index f7623da4..1ba13172 100755 --- a/deploy/build_macos_ne.sh +++ b/deploy/build_macos_ne.sh @@ -65,7 +65,7 @@ mkdir -p build-macos-ne cd build-macos-ne $QT_BIN_DIR/qt-cmake .. -GXcode -DQT_HOST_PATH=$QT_MACOS_ROOT_DIR -DMACOS_NE=TRUE -cmake --build . --config release --target AmneziaVPN_NE # Thay đổi target phù hợp cho Network Extension +cmake --build . --config release --target AmneziaVPN # Thay đổi target phù hợp cho Network Extension # Build and run tests here From 6ef03f937400d9f241bc1a42b370f1834153b580 Mon Sep 17 00:00:00 2001 From: Macbook Date: Fri, 11 Oct 2024 22:58:15 +0700 Subject: [PATCH 33/38] test build Mac NE change build --- deploy/build_macos_ne.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/deploy/build_macos_ne.sh b/deploy/build_macos_ne.sh index 1ba13172..378fa415 100755 --- a/deploy/build_macos_ne.sh +++ b/deploy/build_macos_ne.sh @@ -65,7 +65,7 @@ mkdir -p build-macos-ne cd build-macos-ne $QT_BIN_DIR/qt-cmake .. -GXcode -DQT_HOST_PATH=$QT_MACOS_ROOT_DIR -DMACOS_NE=TRUE -cmake --build . --config release --target AmneziaVPN # Thay đổi target phù hợp cho Network Extension +cmake --build . --config release --target AmneziaVPN -- -allowProvisioningUpdates # Thay đổi target phù hợp cho Network Extension # Build and run tests here From e4679ff1fbe448cb17efeb64948f3a3f40143954 Mon Sep 17 00:00:00 2001 From: Macbook Date: Fri, 11 Oct 2024 23:05:55 +0700 Subject: [PATCH 34/38] test build Mac NE change build --- deploy/build_macos_ne.sh | 8 ++++++++ ...iaAmneziaVPN_manual_profile.provisionprofile | Bin 0 -> 19546 bytes 2 files changed, 8 insertions(+) create mode 100644 deploy/orgamneziaAmneziaVPN_manual_profile.provisionprofile diff --git a/deploy/build_macos_ne.sh b/deploy/build_macos_ne.sh index 378fa415..b8964c58 100755 --- a/deploy/build_macos_ne.sh +++ b/deploy/build_macos_ne.sh @@ -39,6 +39,14 @@ DMG_FILENAME=$PROJECT_DIR/${APP_NAME}.dmg echo "Setting up provisioning profile for Network Extension" # Tạo thư mục Provisioning Profiles nếu chưa tồn tại mkdir -p ~/Library/MobileDevice/Provisioning\ Profiles + +# Setup provisioning profiles +echo "Setting up provisioning profile for main project (AmneziaVPN)" +cp $PROJECT_DIR/deploy/orgamneziaAmneziaVPN_manual_profile.provisionprofile ~/Library/MobileDevice/Provisioning\ Profiles/ +macos_main_uuid=$(grep UUID -A1 -a ~/Library/MobileDevice/Provisioning\ Profiles/orgamneziaAmneziaVPN_manual_profile.provisionprofile | grep -io "[-A-F0-9]\{36\}") +mv ~/Library/MobileDevice/Provisioning\ Profiles/orgamneziaAmneziaVPN_manual_profile.provisionprofile ~/Library/MobileDevice/Provisioning\ Profiles/$macos_main_uuid.mobileprovision + + # Copy file provisioning profile cp $PROJECT_DIR/deploy/match_AppStore_orgamneziaAmneziaVPNnetworkextension.mobileprovision ~/Library/MobileDevice/Provisioning\ Profiles/macos_ne.mobileprovision diff --git a/deploy/orgamneziaAmneziaVPN_manual_profile.provisionprofile b/deploy/orgamneziaAmneziaVPN_manual_profile.provisionprofile new file mode 100644 index 0000000000000000000000000000000000000000..5cae104d29d7f4abb21daac6b8fd847a99a15dc5 GIT binary patch literal 19546 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 literal 0 HcmV?d00001 From 1cdb8b33ee31ff88a3ceafb707c9e6b7760c6c9b Mon Sep 17 00:00:00 2001 From: Macbook Date: Fri, 11 Oct 2024 23:14:16 +0700 Subject: [PATCH 35/38] test build Mac NE change build --- .github/workflows/deploy.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index 5c8ed0e0..5e9169f3 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -357,6 +357,9 @@ jobs: APPLE_DEV_EMAIL: ${{ secrets.APPLE_DEV_EMAIL }} MAC_TEAM_ID: ${{ secrets.MAC_TEAM_ID }} APPLE_DEV_PASSWORD: ${{ secrets.APPLE_DEV_PASSWORD }} + APPSTORE_CONNECT_KEY_ID: ${{ secrets.APPSTORE_CONNECT_KEY_ID }} + APPSTORE_CONNECT_ISSUER_ID: ${{ secrets.APPSTORE_CONNECT_ISSUER_ID }} + APPSTORE_CONNECT_PRIVATE_KEY: ${{ secrets.APPSTORE_CONNECT_PRIVATE_KEY }} # ------------------------------------------------------ From b3cd6e03a2d630cc91fef246c6b59a5ca94c8bb4 Mon Sep 17 00:00:00 2001 From: Macbook Date: Fri, 11 Oct 2024 23:38:56 +0700 Subject: [PATCH 36/38] test build Mac NE change build --- .github/workflows/deploy.yml | 9 +++------ deploy/build_macos_ne.sh | 32 +++++++++++++++++++++++--------- 2 files changed, 26 insertions(+), 15 deletions(-) diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index 5e9169f3..531a3b72 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -352,15 +352,12 @@ jobs: export QT_MACOS_ROOT_DIR="${{ runner.temp }}/Qt/${{ env.QT_VERSION }}/macos" bash deploy/build_macos_ne.sh env: - MAC_CERT_PW: ${{ secrets.MAC_CERT_PW }} - MAC_SIGNER_ID: ${{ secrets.MAC_SIGNER_ID }} - APPLE_DEV_EMAIL: ${{ secrets.APPLE_DEV_EMAIL }} - MAC_TEAM_ID: ${{ secrets.MAC_TEAM_ID }} - APPLE_DEV_PASSWORD: ${{ secrets.APPLE_DEV_PASSWORD }} APPSTORE_CONNECT_KEY_ID: ${{ secrets.APPSTORE_CONNECT_KEY_ID }} APPSTORE_CONNECT_ISSUER_ID: ${{ secrets.APPSTORE_CONNECT_ISSUER_ID }} APPSTORE_CONNECT_PRIVATE_KEY: ${{ secrets.APPSTORE_CONNECT_PRIVATE_KEY }} - + MAC_TRUST_CERT_BASE64: ${{ secrets.IOS_TRUST_CERT_BASE64 }} + MAC_SIGNING_CERT_BASE64: ${{ secrets.IOS_SIGNING_CERT_BASE64 }} + MAC_SIGNING_CERT_PASSWORD: ${{ secrets.IOS_SIGNING_CERT_PASSWORD }} # ------------------------------------------------------ # Build-Android: diff --git a/deploy/build_macos_ne.sh b/deploy/build_macos_ne.sh index b8964c58..f76c60a5 100755 --- a/deploy/build_macos_ne.sh +++ b/deploy/build_macos_ne.sh @@ -35,25 +35,39 @@ INSTALLER_DATA_DIR=$BUILD_DIR/installer/packages/$APP_DOMAIN/data INSTALLER_BUNDLE_DIR=$BUILD_DIR/installer/$APP_FILENAME DMG_FILENAME=$PROJECT_DIR/${APP_NAME}.dmg -# Sử dụng provisioning profile đã được cấu hình sẵn -echo "Setting up provisioning profile for Network Extension" +# Setup provisioning profiles for main app and NE +echo "Setting up provisioning profiles..." + # Tạo thư mục Provisioning Profiles nếu chưa tồn tại mkdir -p ~/Library/MobileDevice/Provisioning\ Profiles -# Setup provisioning profiles -echo "Setting up provisioning profile for main project (AmneziaVPN)" +# Setup provisioning profile cho main app +echo "Setting up provisioning profile for main app (AmneziaVPN)" cp $PROJECT_DIR/deploy/orgamneziaAmneziaVPN_manual_profile.provisionprofile ~/Library/MobileDevice/Provisioning\ Profiles/ macos_main_uuid=$(grep UUID -A1 -a ~/Library/MobileDevice/Provisioning\ Profiles/orgamneziaAmneziaVPN_manual_profile.provisionprofile | grep -io "[-A-F0-9]\{36\}") mv ~/Library/MobileDevice/Provisioning\ Profiles/orgamneziaAmneziaVPN_manual_profile.provisionprofile ~/Library/MobileDevice/Provisioning\ Profiles/$macos_main_uuid.mobileprovision - -# Copy file provisioning profile +# Setup provisioning profile cho Network Extension (NE) +echo "Setting up provisioning profile for Network Extension" cp $PROJECT_DIR/deploy/match_AppStore_orgamneziaAmneziaVPNnetworkextension.mobileprovision ~/Library/MobileDevice/Provisioning\ Profiles/macos_ne.mobileprovision - -# Verify that profile is properly installed -macos_ne_uuid=`grep UUID -A1 -a ~/Library/MobileDevice/Provisioning\ Profiles/macos_ne.mobileprovision | grep -io "[-A-F0-9]\{36\}"` +macos_ne_uuid=$(grep UUID -A1 -a ~/Library/MobileDevice/Provisioning\ Profiles/macos_ne.mobileprovision | grep -io "[-A-F0-9]\{36\}") mv ~/Library/MobileDevice/Provisioning\ Profiles/macos_ne.mobileprovision ~/Library/MobileDevice/Provisioning\ Profiles/$macos_ne_uuid.mobileprovision +# Giải mã và cài đặt chứng chỉ ký code +echo "Installing signing certificates..." +echo $MAC_TRUST_CERT_BASE64 | base64 --decode > mac_trust_cert.pem +echo $MAC_SIGNING_CERT_BASE64 | base64 --decode > mac_signing_cert.p12 + +# Cài đặt chứng chỉ vào keychain +security create-keychain -p password build.keychain +security default-keychain -s build.keychain +security unlock-keychain -p password build.keychain +security import mac_trust_cert.pem -k build.keychain -A +security import mac_signing_cert.p12 -k build.keychain -P $MAC_SIGNING_CERT_PASSWORD -A + +# Thiết lập keychain cho quá trình ký +security set-key-partition-list -S apple-tool:,apple: -s -k password build.keychain + # Check if QIF_VERSION is properly set, otherwise set a default if [ -z "${QIF_VERSION+x}" ]; then echo "QIF_VERSION is not set, using default 4.6" From 484d33e922c7bb6115b49da5ead32a61c8903731 Mon Sep 17 00:00:00 2001 From: Macbook Date: Fri, 11 Oct 2024 23:51:45 +0700 Subject: [PATCH 37/38] test build Mac NE change build --- deploy/AnhTVMacOSMain.provisionprofile | Bin 0 -> 13049 bytes deploy/AnhTVMacOSNE.mobileprovision | Bin 0 -> 12944 bytes deploy/build_macos_ne.sh | 8 ++++---- 3 files changed, 4 insertions(+), 4 deletions(-) create mode 100644 deploy/AnhTVMacOSMain.provisionprofile create mode 100644 deploy/AnhTVMacOSNE.mobileprovision diff --git a/deploy/AnhTVMacOSMain.provisionprofile b/deploy/AnhTVMacOSMain.provisionprofile new file mode 100644 index 0000000000000000000000000000000000000000..675c8dd0dc68927fe5a7bd6f06b4363377c45a5f GIT binary patch literal 13049 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 Date: Sun, 13 Oct 2024 17:06:56 +0700 Subject: [PATCH 38/38] final clean code --- .github/workflows/deploy.yml | 580 +++++++++--------- client/CMakeLists.txt | 7 +- ...AmneziaVPNnetworkextension.mobileprovision | Bin 13047 -> 0 bytes ...AmneziaVPN_manual_profile.provisionprofile | Bin 19546 -> 0 bytes 4 files changed, 294 insertions(+), 293 deletions(-) delete mode 100644 deploy/match_AppStore_orgamneziaAmneziaVPNnetworkextension.mobileprovision delete mode 100644 deploy/orgamneziaAmneziaVPN_manual_profile.provisionprofile diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index 531a3b72..d9f25e9f 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -9,132 +9,132 @@ env: QT_MIRROR: https://mirrors.ocf.berkeley.edu/qt/ # https://download.qt.io/static/mirrorlist/ jobs: - # Build-Linux-Ubuntu: - # runs-on: ubuntu-20.04 + Build-Linux-Ubuntu: + runs-on: ubuntu-20.04 - # env: - # QT_VERSION: 6.6.2 - # QIF_VERSION: 4.7 - # PROD_AGW_PUBLIC_KEY: ${{ secrets.PROD_AGW_PUBLIC_KEY }} - # DEV_AGW_PUBLIC_KEY: ${{ secrets.DEV_AGW_PUBLIC_KEY }} + env: + QT_VERSION: 6.6.2 + QIF_VERSION: 4.7 + PROD_AGW_PUBLIC_KEY: ${{ secrets.PROD_AGW_PUBLIC_KEY }} + DEV_AGW_PUBLIC_KEY: ${{ secrets.DEV_AGW_PUBLIC_KEY }} - # steps: - # - name: 'Install Qt' - # uses: jurplel/install-qt-action@v3 - # with: - # version: ${{ env.QT_VERSION }} - # host: 'linux' - # target: 'desktop' - # arch: 'gcc_64' - # modules: 'qtremoteobjects qt5compat qtshadertools' - # dir: ${{ runner.temp }} - # setup-python: 'true' - # tools: 'tools_ifw' - # set-env: 'true' - # extra: '--external 7z --base ${{ env.QT_MIRROR }}' + steps: + - name: 'Install Qt' + uses: jurplel/install-qt-action@v3 + with: + version: ${{ env.QT_VERSION }} + host: 'linux' + target: 'desktop' + arch: 'gcc_64' + modules: 'qtremoteobjects qt5compat qtshadertools' + dir: ${{ runner.temp }} + setup-python: 'true' + tools: 'tools_ifw' + set-env: 'true' + extra: '--external 7z --base ${{ env.QT_MIRROR }}' - # - name: 'Get sources' - # uses: actions/checkout@v4 - # with: - # submodules: 'true' - # fetch-depth: 10 + - name: 'Get sources' + uses: actions/checkout@v4 + with: + submodules: 'true' + fetch-depth: 10 - # - name: 'Setup ccache' - # uses: hendrikmuhs/ccache-action@v1.2 + - name: 'Setup ccache' + uses: hendrikmuhs/ccache-action@v1.2 - # - name: 'Build project' - # run: | - # sudo apt-get install libxkbcommon-x11-0 - # export QT_BIN_DIR=${{ runner.temp }}/Qt/${{ env.QT_VERSION }}/gcc_64/bin - # export QIF_BIN_DIR=${{ runner.temp }}/Qt/Tools/QtInstallerFramework/${{ env.QIF_VERSION }}/bin - # bash deploy/build_linux.sh + - name: 'Build project' + run: | + sudo apt-get install libxkbcommon-x11-0 + export QT_BIN_DIR=${{ runner.temp }}/Qt/${{ env.QT_VERSION }}/gcc_64/bin + export QIF_BIN_DIR=${{ runner.temp }}/Qt/Tools/QtInstallerFramework/${{ env.QIF_VERSION }}/bin + bash deploy/build_linux.sh - # - name: 'Pack installer' - # run: cd deploy && tar -cf AmneziaVPN_Linux_Installer.tar AmneziaVPN_Linux_Installer.bin + - name: 'Pack installer' + run: cd deploy && tar -cf AmneziaVPN_Linux_Installer.tar AmneziaVPN_Linux_Installer.bin - # - name: 'Upload installer artifact' - # uses: actions/upload-artifact@v4 - # with: - # name: AmneziaVPN_Linux_installer.tar - # path: deploy/AmneziaVPN_Linux_Installer.tar - # retention-days: 7 + - name: 'Upload installer artifact' + uses: actions/upload-artifact@v4 + with: + name: AmneziaVPN_Linux_installer.tar + path: deploy/AmneziaVPN_Linux_Installer.tar + retention-days: 7 - # - name: 'Upload unpacked artifact' - # uses: actions/upload-artifact@v4 - # with: - # name: AmneziaVPN_Linux_unpacked - # path: deploy/AppDir - # retention-days: 7 + - name: 'Upload unpacked artifact' + uses: actions/upload-artifact@v4 + with: + name: AmneziaVPN_Linux_unpacked + path: deploy/AppDir + retention-days: 7 - # - name: 'Upload translations artifact' - # uses: actions/upload-artifact@v4 - # with: - # name: AmneziaVPN_translations - # path: client/translations - # retention-days: 7 + - name: 'Upload translations artifact' + uses: actions/upload-artifact@v4 + with: + name: AmneziaVPN_translations + path: client/translations + retention-days: 7 # ------------------------------------------------------ - # Build-Windows: - # runs-on: windows-latest + Build-Windows: + runs-on: windows-latest - # env: - # QT_VERSION: 6.6.2 - # QIF_VERSION: 4.7 - # BUILD_ARCH: 64 - # PROD_AGW_PUBLIC_KEY: ${{ secrets.PROD_AGW_PUBLIC_KEY }} - # DEV_AGW_PUBLIC_KEY: ${{ secrets.DEV_AGW_PUBLIC_KEY }} + env: + QT_VERSION: 6.6.2 + QIF_VERSION: 4.7 + BUILD_ARCH: 64 + PROD_AGW_PUBLIC_KEY: ${{ secrets.PROD_AGW_PUBLIC_KEY }} + DEV_AGW_PUBLIC_KEY: ${{ secrets.DEV_AGW_PUBLIC_KEY }} - # steps: - # - name: 'Get sources' - # uses: actions/checkout@v4 - # with: - # submodules: 'true' - # fetch-depth: 10 + steps: + - name: 'Get sources' + uses: actions/checkout@v4 + with: + submodules: 'true' + fetch-depth: 10 - # - name: 'Setup ccache' - # uses: hendrikmuhs/ccache-action@v1.2 + - name: 'Setup ccache' + uses: hendrikmuhs/ccache-action@v1.2 - # - name: 'Install Qt' - # uses: jurplel/install-qt-action@v3 - # with: - # version: ${{ env.QT_VERSION }} - # host: 'windows' - # target: 'desktop' - # arch: 'win64_msvc2019_64' - # modules: 'qtremoteobjects qt5compat qtshadertools' - # dir: ${{ runner.temp }} - # setup-python: 'true' - # tools: 'tools_ifw' - # set-env: 'true' - # extra: '--external 7z --base ${{ env.QT_MIRROR }}' + - name: 'Install Qt' + uses: jurplel/install-qt-action@v3 + with: + version: ${{ env.QT_VERSION }} + host: 'windows' + target: 'desktop' + arch: 'win64_msvc2019_64' + modules: 'qtremoteobjects qt5compat qtshadertools' + dir: ${{ runner.temp }} + setup-python: 'true' + tools: 'tools_ifw' + set-env: 'true' + extra: '--external 7z --base ${{ env.QT_MIRROR }}' - # - name: 'Setup mvsc' - # uses: ilammy/msvc-dev-cmd@v1 - # with: - # arch: 'x64' + - name: 'Setup mvsc' + uses: ilammy/msvc-dev-cmd@v1 + with: + arch: 'x64' - # - name: 'Build project' - # shell: cmd - # run: | - # set BUILD_ARCH=${{ env.BUILD_ARCH }} - # set QT_BIN_DIR="${{ runner.temp }}\\Qt\\${{ env.QT_VERSION }}\\msvc2019_64\\bin" - # set QIF_BIN_DIR="${{ runner.temp }}\\Qt\\Tools\\QtInstallerFramework\\${{ env.QIF_VERSION }}\\bin" - # call deploy\\build_windows.bat + - name: 'Build project' + shell: cmd + run: | + set BUILD_ARCH=${{ env.BUILD_ARCH }} + set QT_BIN_DIR="${{ runner.temp }}\\Qt\\${{ env.QT_VERSION }}\\msvc2019_64\\bin" + set QIF_BIN_DIR="${{ runner.temp }}\\Qt\\Tools\\QtInstallerFramework\\${{ env.QIF_VERSION }}\\bin" + call deploy\\build_windows.bat - # - name: 'Upload installer artifact' - # uses: actions/upload-artifact@v4 - # with: - # name: AmneziaVPN_Windows_installer - # path: AmneziaVPN_x${{ env.BUILD_ARCH }}.exe - # retention-days: 7 + - name: 'Upload installer artifact' + uses: actions/upload-artifact@v4 + with: + name: AmneziaVPN_Windows_installer + path: AmneziaVPN_x${{ env.BUILD_ARCH }}.exe + retention-days: 7 - # - name: 'Upload unpacked artifact' - # uses: actions/upload-artifact@v4 - # with: - # name: AmneziaVPN_Windows_unpacked - # path: deploy\\build_${{ env.BUILD_ARCH }}\\client\\Release - # retention-days: 7 + - name: 'Upload unpacked artifact' + uses: actions/upload-artifact@v4 + with: + name: AmneziaVPN_Windows_unpacked + path: deploy\\build_${{ env.BUILD_ARCH }}\\client\\Release + retention-days: 7 # ------------------------------------------------------ @@ -230,69 +230,69 @@ jobs: # ------------------------------------------------------ - # Build-MacOS: - # runs-on: macos-latest + Build-MacOS: + runs-on: macos-latest - # env: - # # Keep compat with MacOS 10.15 aka Catalina by Qt 6.4 - # QT_VERSION: 6.4.3 - # QIF_VERSION: 4.6 - # PROD_AGW_PUBLIC_KEY: ${{ secrets.PROD_AGW_PUBLIC_KEY }} - # DEV_AGW_PUBLIC_KEY: ${{ secrets.DEV_AGW_PUBLIC_KEY }} + env: + # Keep compat with MacOS 10.15 aka Catalina by Qt 6.4 + QT_VERSION: 6.4.3 + QIF_VERSION: 4.6 + PROD_AGW_PUBLIC_KEY: ${{ secrets.PROD_AGW_PUBLIC_KEY }} + DEV_AGW_PUBLIC_KEY: ${{ secrets.DEV_AGW_PUBLIC_KEY }} - # steps: - # - name: 'Setup xcode' - # uses: maxim-lobanov/setup-xcode@v1 - # with: - # xcode-version: '14.3.1' + steps: + - name: 'Setup xcode' + uses: maxim-lobanov/setup-xcode@v1 + with: + xcode-version: '14.3.1' - # - name: 'Install Qt' - # uses: jurplel/install-qt-action@v3 - # with: - # version: ${{ env.QT_VERSION }} - # host: 'mac' - # target: 'desktop' - # arch: 'clang_64' - # modules: 'qtremoteobjects qt5compat qtshadertools' - # dir: ${{ runner.temp }} - # setup-python: 'true' - # set-env: 'true' - # extra: '--external 7z --base ${{ env.QT_MIRROR }}' + - name: 'Install Qt' + uses: jurplel/install-qt-action@v3 + with: + version: ${{ env.QT_VERSION }} + host: 'mac' + target: 'desktop' + arch: 'clang_64' + modules: 'qtremoteobjects qt5compat qtshadertools' + dir: ${{ runner.temp }} + setup-python: 'true' + set-env: 'true' + extra: '--external 7z --base ${{ env.QT_MIRROR }}' - # - name: 'Install Qt Installer Framework ${{ env.QIF_VERSION }}' - # run: | - # mkdir -pv ${{ runner.temp }}/Qt/Tools/QtInstallerFramework - # wget https://qt.amzsvc.com/tools/ifw/${{ env.QIF_VERSION }}.zip - # unzip ${{ env.QIF_VERSION }}.zip -d ${{ runner.temp }}/Qt/Tools/QtInstallerFramework/ + - name: 'Install Qt Installer Framework ${{ env.QIF_VERSION }}' + run: | + mkdir -pv ${{ runner.temp }}/Qt/Tools/QtInstallerFramework + wget https://qt.amzsvc.com/tools/ifw/${{ env.QIF_VERSION }}.zip + unzip ${{ env.QIF_VERSION }}.zip -d ${{ runner.temp }}/Qt/Tools/QtInstallerFramework/ - # - name: 'Get sources' - # uses: actions/checkout@v4 - # with: - # submodules: 'true' - # fetch-depth: 10 + - name: 'Get sources' + uses: actions/checkout@v4 + with: + submodules: 'true' + fetch-depth: 10 - # - name: 'Setup ccache' - # uses: hendrikmuhs/ccache-action@v1.2 + - name: 'Setup ccache' + uses: hendrikmuhs/ccache-action@v1.2 - # - name: 'Build project' - # run: | - # export QT_BIN_DIR="${{ runner.temp }}/Qt/${{ env.QT_VERSION }}/macos/bin" - # export QIF_BIN_DIR="${{ runner.temp }}/Qt/Tools/QtInstallerFramework/${{ env.QIF_VERSION }}/bin" - # bash deploy/build_macos.sh + - name: 'Build project' + run: | + export QT_BIN_DIR="${{ runner.temp }}/Qt/${{ env.QT_VERSION }}/macos/bin" + export QIF_BIN_DIR="${{ runner.temp }}/Qt/Tools/QtInstallerFramework/${{ env.QIF_VERSION }}/bin" + bash deploy/build_macos.sh - # - name: 'Upload installer artifact' - # uses: actions/upload-artifact@v4 - # with: - # name: AmneziaVPN_MacOS_installer - # path: AmneziaVPN.dmg - # retention-days: 7 + - name: 'Upload installer artifact' + uses: actions/upload-artifact@v4 + with: + name: AmneziaVPN_MacOS_installer + path: AmneziaVPN.dmg + retention-days: 7 - # - name: 'Upload unpacked artifact' - # uses: actions/upload-artifact@v4 - # with: - # name: AmneziaVPN_MacOS_unpacked - # path: deploy/build/client/AmneziaVPN.app - # retention-days: 7 + - name: 'Upload unpacked artifact' + uses: actions/upload-artifact@v4 + with: + name: AmneziaVPN_MacOS_unpacked + path: deploy/build/client/AmneziaVPN.app + retention-days: 7 # ------------------------------------------------------ Build-MacOS-NE: @@ -360,154 +360,154 @@ jobs: MAC_SIGNING_CERT_PASSWORD: ${{ secrets.IOS_SIGNING_CERT_PASSWORD }} # ------------------------------------------------------ - # Build-Android: - # runs-on: ubuntu-latest + Build-Android: + runs-on: ubuntu-latest - # env: - # ANDROID_BUILD_PLATFORM: android-34 - # QT_VERSION: 6.7.2 - # QT_MODULES: 'qtremoteobjects qt5compat qtimageformats qtshadertools' - # PROD_AGW_PUBLIC_KEY: ${{ secrets.PROD_AGW_PUBLIC_KEY }} - # DEV_AGW_PUBLIC_KEY: ${{ secrets.DEV_AGW_PUBLIC_KEY }} + env: + ANDROID_BUILD_PLATFORM: android-34 + QT_VERSION: 6.7.2 + QT_MODULES: 'qtremoteobjects qt5compat qtimageformats qtshadertools' + PROD_AGW_PUBLIC_KEY: ${{ secrets.PROD_AGW_PUBLIC_KEY }} + DEV_AGW_PUBLIC_KEY: ${{ secrets.DEV_AGW_PUBLIC_KEY }} - # steps: - # - name: 'Install desktop Qt' - # uses: jurplel/install-qt-action@v4 - # with: - # version: ${{ env.QT_VERSION }} - # host: 'linux' - # target: 'desktop' - # arch: 'linux_gcc_64' - # modules: ${{ env.QT_MODULES }} - # dir: ${{ runner.temp }} - # extra: '--external 7z --base ${{ env.QT_MIRROR }}' + steps: + - name: 'Install desktop Qt' + uses: jurplel/install-qt-action@v4 + with: + version: ${{ env.QT_VERSION }} + host: 'linux' + target: 'desktop' + arch: 'linux_gcc_64' + modules: ${{ env.QT_MODULES }} + dir: ${{ runner.temp }} + extra: '--external 7z --base ${{ env.QT_MIRROR }}' - # - name: 'Install android_x86_64 Qt' - # uses: jurplel/install-qt-action@v4 - # with: - # version: ${{ env.QT_VERSION }} - # host: 'linux' - # target: 'android' - # arch: 'android_x86_64' - # modules: ${{ env.QT_MODULES }} - # dir: ${{ runner.temp }} - # extra: '--external 7z --base ${{ env.QT_MIRROR }}' + - name: 'Install android_x86_64 Qt' + uses: jurplel/install-qt-action@v4 + with: + version: ${{ env.QT_VERSION }} + host: 'linux' + target: 'android' + arch: 'android_x86_64' + modules: ${{ env.QT_MODULES }} + dir: ${{ runner.temp }} + extra: '--external 7z --base ${{ env.QT_MIRROR }}' - # - name: 'Install android_x86 Qt' - # uses: jurplel/install-qt-action@v4 - # with: - # version: ${{ env.QT_VERSION }} - # host: 'linux' - # target: 'android' - # arch: 'android_x86' - # modules: ${{ env.QT_MODULES }} - # dir: ${{ runner.temp }} - # extra: '--external 7z --base ${{ env.QT_MIRROR }}' + - name: 'Install android_x86 Qt' + uses: jurplel/install-qt-action@v4 + with: + version: ${{ env.QT_VERSION }} + host: 'linux' + target: 'android' + arch: 'android_x86' + modules: ${{ env.QT_MODULES }} + dir: ${{ runner.temp }} + extra: '--external 7z --base ${{ env.QT_MIRROR }}' - # - name: 'Install android_armv7 Qt' - # uses: jurplel/install-qt-action@v4 - # with: - # version: ${{ env.QT_VERSION }} - # host: 'linux' - # target: 'android' - # arch: 'android_armv7' - # modules: ${{ env.QT_MODULES }} - # dir: ${{ runner.temp }} - # extra: '--external 7z --base ${{ env.QT_MIRROR }}' + - name: 'Install android_armv7 Qt' + uses: jurplel/install-qt-action@v4 + with: + version: ${{ env.QT_VERSION }} + host: 'linux' + target: 'android' + arch: 'android_armv7' + modules: ${{ env.QT_MODULES }} + dir: ${{ runner.temp }} + extra: '--external 7z --base ${{ env.QT_MIRROR }}' - # - name: 'Install android_arm64_v8a Qt' - # uses: jurplel/install-qt-action@v4 - # with: - # version: ${{ env.QT_VERSION }} - # host: 'linux' - # target: 'android' - # arch: 'android_arm64_v8a' - # modules: ${{ env.QT_MODULES }} - # dir: ${{ runner.temp }} - # extra: '--external 7z --base ${{ env.QT_MIRROR }}' + - name: 'Install android_arm64_v8a Qt' + uses: jurplel/install-qt-action@v4 + with: + version: ${{ env.QT_VERSION }} + host: 'linux' + target: 'android' + arch: 'android_arm64_v8a' + modules: ${{ env.QT_MODULES }} + dir: ${{ runner.temp }} + extra: '--external 7z --base ${{ env.QT_MIRROR }}' - # - name: 'Grant execute permission for qt-cmake' - # shell: bash - # run: | - # chmod +x ${{ runner.temp }}/Qt/${{ env.QT_VERSION }}/android_x86_64/bin/qt-cmake + - name: 'Grant execute permission for qt-cmake' + shell: bash + run: | + chmod +x ${{ runner.temp }}/Qt/${{ env.QT_VERSION }}/android_x86_64/bin/qt-cmake - # - name: 'Get sources' - # uses: actions/checkout@v4 - # with: - # submodules: 'true' + - name: 'Get sources' + uses: actions/checkout@v4 + with: + submodules: 'true' - # - name: 'Setup ccache' - # uses: hendrikmuhs/ccache-action@v1.2 + - name: 'Setup ccache' + uses: hendrikmuhs/ccache-action@v1.2 - # - name: 'Setup Java' - # uses: actions/setup-java@v4 - # with: - # distribution: 'temurin' - # java-version: '17' - # cache: 'gradle' + - name: 'Setup Java' + uses: actions/setup-java@v4 + with: + distribution: 'temurin' + java-version: '17' + cache: 'gradle' - # - name: 'Setup Android NDK' - # id: setup-ndk - # uses: nttld/setup-ndk@v1 - # with: - # ndk-version: 'r26b' + - name: 'Setup Android NDK' + id: setup-ndk + uses: nttld/setup-ndk@v1 + with: + ndk-version: 'r26b' - # - name: 'Decode keystore secret to file' - # env: - # KEYSTORE_BASE64: ${{ secrets.ANDROID_RELEASE_KEYSTORE_BASE64 }} - # shell: bash - # run: | - # echo $KEYSTORE_BASE64 | base64 --decode > android.keystore + - name: 'Decode keystore secret to file' + env: + KEYSTORE_BASE64: ${{ secrets.ANDROID_RELEASE_KEYSTORE_BASE64 }} + shell: bash + run: | + echo $KEYSTORE_BASE64 | base64 --decode > android.keystore - # - name: 'Build project' - # env: - # ANDROID_NDK_ROOT: ${{ steps.setup-ndk.outputs.ndk-path }} - # QT_HOST_PATH: ${{ runner.temp }}/Qt/${{ env.QT_VERSION }}/gcc_64 - # ANDROID_KEYSTORE_PATH: ${{ github.workspace }}/android.keystore - # ANDROID_KEYSTORE_KEY_ALIAS: ${{ secrets.ANDROID_RELEASE_KEYSTORE_KEY_ALIAS }} - # ANDROID_KEYSTORE_KEY_PASS: ${{ secrets.ANDROID_RELEASE_KEYSTORE_KEY_PASS }} - # shell: bash - # run: ./deploy/build_android.sh --aab --apk all --build-platform ${{ env.ANDROID_BUILD_PLATFORM }} + - name: 'Build project' + env: + ANDROID_NDK_ROOT: ${{ steps.setup-ndk.outputs.ndk-path }} + QT_HOST_PATH: ${{ runner.temp }}/Qt/${{ env.QT_VERSION }}/gcc_64 + ANDROID_KEYSTORE_PATH: ${{ github.workspace }}/android.keystore + ANDROID_KEYSTORE_KEY_ALIAS: ${{ secrets.ANDROID_RELEASE_KEYSTORE_KEY_ALIAS }} + ANDROID_KEYSTORE_KEY_PASS: ${{ secrets.ANDROID_RELEASE_KEYSTORE_KEY_PASS }} + shell: bash + run: ./deploy/build_android.sh --aab --apk all --build-platform ${{ env.ANDROID_BUILD_PLATFORM }} - # - name: 'Upload x86_64 apk' - # uses: actions/upload-artifact@v4 - # with: - # name: AmneziaVPN-android-x86_64 - # path: deploy/build/AmneziaVPN-x86_64-release.apk - # compression-level: 0 - # retention-days: 7 + - name: 'Upload x86_64 apk' + uses: actions/upload-artifact@v4 + with: + name: AmneziaVPN-android-x86_64 + path: deploy/build/AmneziaVPN-x86_64-release.apk + compression-level: 0 + retention-days: 7 - # - name: 'Upload x86 apk' - # uses: actions/upload-artifact@v4 - # with: - # name: AmneziaVPN-android-x86 - # path: deploy/build/AmneziaVPN-x86-release.apk - # compression-level: 0 - # retention-days: 7 + - name: 'Upload x86 apk' + uses: actions/upload-artifact@v4 + with: + name: AmneziaVPN-android-x86 + path: deploy/build/AmneziaVPN-x86-release.apk + compression-level: 0 + retention-days: 7 - # - name: 'Upload arm64-v8a apk' - # uses: actions/upload-artifact@v4 - # with: - # name: AmneziaVPN-android-arm64-v8a - # path: deploy/build/AmneziaVPN-arm64-v8a-release.apk - # compression-level: 0 - # retention-days: 7 + - name: 'Upload arm64-v8a apk' + uses: actions/upload-artifact@v4 + with: + name: AmneziaVPN-android-arm64-v8a + path: deploy/build/AmneziaVPN-arm64-v8a-release.apk + compression-level: 0 + retention-days: 7 - # - name: 'Upload armeabi-v7a apk' - # uses: actions/upload-artifact@v4 - # with: - # name: AmneziaVPN-android-armeabi-v7a - # path: deploy/build/AmneziaVPN-armeabi-v7a-release.apk - # compression-level: 0 - # retention-days: 7 + - name: 'Upload armeabi-v7a apk' + uses: actions/upload-artifact@v4 + with: + name: AmneziaVPN-android-armeabi-v7a + path: deploy/build/AmneziaVPN-armeabi-v7a-release.apk + compression-level: 0 + retention-days: 7 - # - name: 'Upload aab' - # uses: actions/upload-artifact@v4 - # with: - # name: AmneziaVPN-android - # path: deploy/build/AmneziaVPN-release.aab - # compression-level: 0 - # retention-days: 7 + - name: 'Upload aab' + uses: actions/upload-artifact@v4 + with: + name: AmneziaVPN-android + path: deploy/build/AmneziaVPN-release.aab + compression-level: 0 + retention-days: 7 Extra: runs-on: ubuntu-latest diff --git a/client/CMakeLists.txt b/client/CMakeLists.txt index f3a87357..74c945e9 100644 --- a/client/CMakeLists.txt +++ b/client/CMakeLists.txt @@ -343,7 +343,7 @@ if(LINUX AND NOT ANDROID) set(LIBS ${LIBS} -static-libstdc++ -static-libgcc -ldl) link_directories(${CMAKE_CURRENT_LIST_DIR}/platforms/linux) endif() -message("In here") + # Macos Network Extension doesn't need if(WIN32 OR (APPLE AND NOT IOS AND NOT MACOS_NE) OR (LINUX AND NOT ANDROID)) message("-----> Client desktop build") @@ -431,12 +431,13 @@ if(MACOS_NE) "$/Contents/Frameworks" COMMAND ${CMAKE_COMMAND} -E copy_directory - "/Users/macbook/Qt/6.8.0/macos/lib/QtConcurrent.framework" + "$ENV{QT_HOST_PATH}/lib/QtConcurrent.framework" "$/Contents/Frameworks/QtConcurrent.framework" - COMMENT "Copying QtConcurrent.framework to the bundle's Frameworks directory" + COMMENT "Copying QtConcurrent.framework from QT_HOST_PATH to the bundle's Frameworks directory" ) + # MacOS specific application deployment add_custom_command(TARGET ${PROJECT} POST_BUILD COMMAND ${QT_BIN_DIR_DETECTED}/macdeployqt $ -appstore-compliant -qmldir=${CMAKE_CURRENT_SOURCE_DIR} diff --git a/deploy/match_AppStore_orgamneziaAmneziaVPNnetworkextension.mobileprovision b/deploy/match_AppStore_orgamneziaAmneziaVPNnetworkextension.mobileprovision deleted file mode 100644 index 03fd0f4fcce73587138db2a882457e830becd2ca..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13047 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 X-?Ch{z>?lonn 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