diff --git a/client/CMakeLists.txt b/client/CMakeLists.txt index 6805dd9d0..557188d10 100644 --- a/client/CMakeLists.txt +++ b/client/CMakeLists.txt @@ -278,9 +278,7 @@ if(ANDROID) ) endif() -qt_add_executable(${PROJECT} ${SOURCES} ${HEADERS} ${RESOURCES} ${QRC}) -qt_add_translations(${PROJECT} TS_FILES - ${CMAKE_CURRENT_LIST_DIR}/translations/amneziavpn_ru.ts) + if(IOS) message("Client iOS build") @@ -296,10 +294,12 @@ if(IOS) find_library(FW_STOREKIT StoreKit) find_library(FW_USERNOTIFICATIONS UserNotifications) - set(LIBS ${LIBS} FW_AUTHENTICATIONSERVICES FW_UIKIT FW_FOUNDATION FW_STOREKIT FW_USERNOTIFICATIONS) + set(LIBS ${LIBS} ${FW_AUTHENTICATIONSERVICES} ${FW_UIKIT} ${FW_FOUNDATION} ${FW_STOREKIT} ${FW_USERNOTIFICATIONS}) add_compile_definitions(MVPN_IOS) + message("shahzain ${CMAKE_CURRENT_LIST_DIR}") + set(HEADERS ${HEADERS} ${CMAKE_CURRENT_LIST_DIR}/protocols/ios_vpnprotocol.h ${CMAKE_CURRENT_LIST_DIR}/platforms/ios/iosnotificationhandler.h @@ -332,10 +332,8 @@ if(IOS) - set_target_properties(${PROJECT} PROPERTIES XCODE_ATTRIBUTE_ENABLE_BITCODE "NO") - add_subdirectory(ios/networkextension) - add_dependencies(${PROJECT} networkextension) - set_target_properties(${PROJECT} PROPERTIES XCODE_EMBED_APP_EXTENSIONS networkextension) + + # Q_ENABLE_BITCODE.value = NO # Q_ENABLE_BITCODE.name = ENABLE_BITCODE @@ -348,20 +346,20 @@ if(CMAKE_OSX_SYSROOT STREQUAL "iphoneos") - set_target_properties(${PROJECT} PROPERTIES XCODE_ATTRIBUTE_PRODUCT_BUNDLE_IDENTIFIER "org.amnezia.${PROJECT}" - OUTPUT_NAME "AmneziaVPN" - XCODE_ATTRIBUTE_TARGETED_DEVICE_FAMILY "1" - XCODE_ATTRIBUTE_DEVELOPMENT_TEAM "X7UJ388FXK" - MACOSX_BUNDLE_INFO_PLIST ${CMAKE_SOURCE_DIR}/ios/app/Info.plist - XCODE_ATTRIBUTE_CODE_SIGN_IDENTITY "Apple Development") - find_library(LIB_LIBCRYPTO NAMES "libcrypto.a" - PATHS ${PROJECT_SOURCE_DIR}/3rd/OpenSSL/lib/ios/iphone/ NO_DEFAULT_PATH) + # find_library(LIB_LIBCRYPTO NAMES "libcrypto.a" + # PATHS ${PROJECT_SOURCE_DIR}/3rd/OpenSSL/lib/ios/iphone/ NO_DEFAULT_PATH) - find_library(LIB_SSL NAMES "libssl.a" - PATHS ${PROJECT_SOURCE_DIR}/3rd/OpenSSL/lib/ios/iphone/ NO_DEFAULT_PATH) + #find_library(LIB_SSL NAMES "libssl.a" + # PATHS ${PROJECT_SOURCE_DIR}/3rd/OpenSSL/lib/ios/iphone/ NO_DEFAULT_PATH) - # set(LIBS ${LIBS} LIB_LIBCRYPTO LIB_SSL) + + + #set(LIBS ${LIBS} LIB_LIBCRYPTO LIB_SSL) + + # target_link_libraries(${PROJECT} PRIVATE ${LIB_LIBCRYPTO}) + + # target_link_libraries(${PROJECT} PRIVATE ${LIB_SSL}) endif() @@ -394,8 +392,91 @@ endif() # } #endif() + +qt_add_executable(${PROJECT} ${SOURCES} ${HEADERS} ${RESOURCES} ${QRC}) +qt_add_translations(${PROJECT} TS_FILES + ${CMAKE_CURRENT_LIST_DIR}/translations/amneziavpn_ru.ts) + # NETWORKEXTENSION=1 +if(IOS) + enable_language(OBJC) + enable_language(OBJCXX) + enable_language(Swift) + include(src/cmake/osxtools.cmake) + + set_target_properties(${PROJECT} PROPERTIES XCODE_ATTRIBUTE_ENABLE_BITCODE "NO") + + + set_target_properties(${PROJECT} PROPERTIES XCODE_ATTRIBUTE_PRODUCT_BUNDLE_IDENTIFIER "org.amnezia.${PROJECT}" + XCODE_ATTRIBUTE_TARGETED_DEVICE_FAMILY "1" + XCODE_ATTRIBUTE_DEVELOPMENT_TEAM "X7UJ388FXK" + XCODE_ATTRIBUTE_CODE_SIGN_IDENTITY "Apple Development") + set(LIBS ${LIBS} + ${CMAKE_CURRENT_LIST_DIR}/3rd/OpenSSL/lib/ios/iphone/libcrypto.a + ${CMAKE_CURRENT_LIST_DIR}/3rd/OpenSSL/lib/ios/iphone/libssl.a) + + target_include_directories(${PROJECT} PRIVATE ${Qt6Gui_PRIVATE_INCLUDE_DIRS}) + + set_target_properties(${PROJECT} PROPERTIES + XCODE_ATTRIBUTE_SWIFT_VERSION "5.0" + XCODE_ATTRIBUTE_CLANG_ENABLE_MODULES "YES" + XCODE_ATTRIBUTE_SWIFT_OBJC_BRIDGING_HEADER "${CMAKE_SOURCE_DIR}/platforms/ios/WireGuard-Bridging-Header.h" + XCODE_ATTRIBUTE_SWIFT_PRECOMPILE_BRIDGING_HEADER "NO" + XCODE_ATTRIBUTE_SWIFT_OPTIMIZATION_LEVEL "-Onone" + XCODE_ATTRIBUTE_SWIFT_OBJC_INTERFACE_HEADER_NAME "AmneziaVPN-Swift.h" + ) + +set_target_properties(${PROJECT} PROPERTIES + OUTPUT_NAME "AmneziaVPN" + MACOSX_BUNDLE ON + MACOSX_BUNDLE_INFO_PLIST ${CMAKE_SOURCE_DIR}/ios/app/Info.plist.in + MACOSX_BUNDLE_BUNDLE_NAME "AmneziaVPN" + MACOSX_BUNDLE_BUNDLE_VERSION "${BUILD_ID}" + MACOSX_BUNDLE_COPYRIGHT "MPL-2.0" + MACOSX_BUNDLE_GUI_IDENTIFIER "${BUILD_IOS_APP_IDENTIFIER}" + MACOSX_BUNDLE_INFO_STRING "AmneziaVPN" + MACOSX_BUNDLE_LONG_VERSION_STRING "${CMAKE_PROJECT_VERSION}-${BUILD_ID}" + MACOSX_BUNDLE_SHORT_VERSION_STRING "${CMAKE_PROJECT_VERSION}" + XCODE_ATTRIBUTE_PRODUCT_BUNDLE_IDENTIFIER "${BUILD_IOS_APP_IDENTIFIER}" + XCODE_ATTRIBUTE_CODE_SIGN_ENTITLEMENTS "${CMAKE_SOURCE_DIR}/ios/app/main.entitlements" + XCODE_ATTRIBUTE_MARKETING_VERSION "${CMAKE_PROJECT_VERSION}" + XCODE_GENERATE_SCHEME TRUE +) +target_include_directories(${PROJECT} PRIVATE ${CMAKE_SOURCE_DIR}) + + target_compile_options(${PROJECT} PRIVATE + -DGROUP_ID=\"${BUILD_IOS_GROUP_IDENTIFIER}\" + -DVPN_NE_BUNDLEID=\"${BUILD_IOS_APP_IDENTIFIER}.network-extension\" + ) + + + target_sources(${PROJECT} PRIVATE + ${CMAKE_SOURCE_DIR}/3rd/wireguard-apple/Sources/Shared/Keychain.swift + ${CMAKE_SOURCE_DIR}/3rd/wireguard-apple/Sources/WireGuardKit/IPAddressRange.swift + ${CMAKE_SOURCE_DIR}/3rd/wireguard-apple/Sources/WireGuardKit/InterfaceConfiguration.swift + ${CMAKE_SOURCE_DIR}/3rd/wireguard-apple/Sources/Shared/Model/NETunnelProviderProtocol+Extension.swift + ${CMAKE_SOURCE_DIR}/3rd/wireguard-apple/Sources/WireGuardKit/TunnelConfiguration.swift + ${CMAKE_SOURCE_DIR}/3rd/wireguard-apple/Sources/Shared/Model/TunnelConfiguration+WgQuickConfig.swift + ${CMAKE_SOURCE_DIR}/3rd/wireguard-apple/Sources/WireGuardKit/Endpoint.swift + ${CMAKE_SOURCE_DIR}/3rd/wireguard-apple/Sources/Shared/Model/String+ArrayConversion.swift + ${CMAKE_SOURCE_DIR}/3rd/wireguard-apple/Sources/WireGuardKit/PeerConfiguration.swift + ${CMAKE_SOURCE_DIR}/3rd/wireguard-apple/Sources/WireGuardKit/DNSServer.swift + ${CMAKE_SOURCE_DIR}/3rd/wireguard-apple/Sources/WireGuardApp/LocalizationHelper.swift + ${CMAKE_SOURCE_DIR}/3rd/wireguard-apple/Sources/Shared/FileManager+Extension.swift + ${CMAKE_SOURCE_DIR}/3rd/wireguard-apple/Sources/WireGuardKitC/x25519.c + ${CMAKE_SOURCE_DIR}/3rd/wireguard-apple/Sources/WireGuardKit/PrivateKey.swift +) + + target_sources(${PROJECT} PRIVATE + platforms/ios/iosvpnprotocol.swift + platforms/ios/ioslogger.swift + ) + add_subdirectory(ios/networkextension) + add_dependencies(${PROJECT} networkextension) + set_target_properties(${PROJECT} PROPERTIES XCODE_EMBED_APP_EXTENSIONS networkextension) + +endif() if(ANDROID) diff --git a/client/ios/app/Info.plist.in b/client/ios/app/Info.plist.in new file mode 100644 index 000000000..07dc596fe --- /dev/null +++ b/client/ios/app/Info.plist.in @@ -0,0 +1,53 @@ + + + + + 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 + + + \ No newline at end of file diff --git a/client/platforms/ios/WireGuard-Bridging-Header.h b/client/platforms/ios/WireGuard-Bridging-Header.h index 40b6c89de..0ce523562 100644 --- a/client/platforms/ios/WireGuard-Bridging-Header.h +++ b/client/platforms/ios/WireGuard-Bridging-Header.h @@ -2,7 +2,7 @@ * 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 "wireguard-go-version.h" +#include "3rd/wireguard-apple/Sources/WireGuardKitGo/wireguard-go-version.h" #include "3rd/wireguard-apple/Sources/WireGuardKitC/WireGuardKitC.h" #include diff --git a/client/platforms/ios/ioslogger.swift b/client/platforms/ios/ioslogger.swift index e364d365a..644f75819 100644 --- a/client/platforms/ios/ioslogger.swift +++ b/client/platforms/ios/ioslogger.swift @@ -37,7 +37,7 @@ public class Logger { appVersion += " (\(appBuild))" } - let goBackendVersion = WIREGUARD_GO_VERSION + let goBackendVersion = "1" Logger.global?.log(message: "App version: \(appVersion); Go backend version: \(goBackendVersion)") } } diff --git a/client/protocols/ios_vpnprotocol.mm b/client/protocols/ios_vpnprotocol.mm index 8decd8853..14b7ee9a8 100644 --- a/client/protocols/ios_vpnprotocol.mm +++ b/client/protocols/ios_vpnprotocol.mm @@ -10,10 +10,12 @@ #include -#include "ipaddressrange.h" +#include "platforms/ios/ipaddressrange.h" #include "ios_vpnprotocol.h" #include "core/errorstrings.h" #include "AmneziaVPN-Swift.h" +#include "UIKit/UIKit.h" + namespace { diff --git a/client/src/cmake/osxtools.cmake b/client/src/cmake/osxtools.cmake new file mode 100644 index 000000000..9e711d464 --- /dev/null +++ b/client/src/cmake/osxtools.cmake @@ -0,0 +1,148 @@ +if(NOT APPLE) + message(FATAL_ERROR "OSX Tools are only supported on Apple targets") +endif() + +if(CMAKE_COLOR_MAKEFILE) + set(COMMENT_ECHO_COMMAND ${CMAKE_COMMAND} -E cmake_echo_color --blue --bold) +else() + set(COMMENT_ECHO_COMMAND ${CMAKE_COMMAND} -E echo) +endif() + +if(CODE_SIGN_IDENTITY) + find_program(CODESIGN_BIN NAMES codesign) + if(NOT CODESIGN_BIN) + messsage(FATAL_ERROR "Cannot sign code, could not find 'codesign' executable") + endif() + set(CMAKE_XCODE_ATTRIBUTE_CODE_SIGN_IDENTITY ${CODE_SIGN_IDENTITY}) +endif() + +## A helper to copy files into the application bundle +function(osx_bundle_files TARGET) + cmake_parse_arguments(BUNDLE + "" + "DESTINATION" + "FILES" + ${ARGN}) + + if(NOT BUNDLE_DESTINATION) + set(BUNDLE_DESTINATION Resources) + endif() + + foreach(FILE ${BUNDLE_FILES}) + add_custom_command(TARGET ${TARGET} POST_BUILD + COMMAND_EXPAND_LISTS + COMMAND ${COMMENT_ECHO_COMMAND} "Bundling ${FILE}" + COMMAND ${CMAKE_COMMAND} -E make_directory $/${BUNDLE_DESTINATION} + COMMAND ${CMAKE_COMMAND} -E copy ${FILE} $/${BUNDLE_DESTINATION}/ + ) + endforeach() +endfunction(osx_bundle_files) + +## A helper to bundle an asset catalog. +function(osx_bundle_assetcatalog TARGET) + cmake_parse_arguments(XCASSETS + "" + "CATALOG;PLATFORM" + "DEVICES" + ${ARGN}) + + if(XCASSETS_PLATFORM) + set(XCASSETS_TARGET_ARGS --platform ${XCASSETS_PLATFORM}) + elseif(IOS) + set(XCASSETS_TARGET_ARGS --platform iphoneos) + else() + set(XCASSETS_TARGET_ARGS --platform macosx) + endif() + foreach(DEVNAME ${XCASSETS_DEVICES}) + list(APPEND XCASSETS_TARGET_ARGS --target-device ${DEVNAME}) + endforeach() + list(APPEND XCASSETS_TARGET_ARGS --minimum-deployment-target ${CMAKE_OSX_DEPLOYMENT_TARGET}) + + ## Compile the asset catalog + set(XCASSETS_GEN_PLIST ${CMAKE_CURRENT_BINARY_DIR}/xcassets_generated_info.plist) + add_custom_command( + OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/xcassets/Assets.car ${XCASSETS_GEN_PLIST} + MAIN_DEPENDENCY ${XCASSETS_CATALOG}/Contents.json + COMMENT "Building asset catalog" + COMMAND ${CMAKE_COMMAND} -E make_directory ${CMAKE_CURRENT_BINARY_DIR}/xcassets + COMMAND actool --output-format human-readable-text --notices --warnings + ${XCASSETS_TARGET_ARGS} + --app-icon AppIcon + --output-partial-info-plist ${XCASSETS_GEN_PLIST} + --development-region en --enable-on-demand-resources NO + --compile ${CMAKE_CURRENT_BINARY_DIR}/xcassets ${XCASSETS_CATALOG} + ) + + ## Patch the asset catalog into the target bundle. + if(NOT IOS) + set(XCASSETS_RESOURCE_DIR "Resources") + endif() + add_custom_command(TARGET ${TARGET} POST_BUILD + COMMENT "Bundling asset catalog" + COMMAND ${CMAKE_COMMAND} -E copy_directory ${CMAKE_CURRENT_BINARY_DIR}/xcassets $/${XCASSETS_RESOURCE_DIR} + COMMAND ${CMAKE_SOURCE_DIR}/scripts/macos/merge_plist.py ${XCASSETS_GEN_PLIST} -o $/Info.plist + ) + + target_sources(${TARGET} PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/xcassets/Assets.car) + set_source_files_properties( + ${CMAKE_CURRENT_BINARY_DIR}/xcassets/Assets.car + ${XCASSETS_GEN_PLIST} + PROPERTIES + GENERATED TRUE + HEADER_FILE_ONLY TRUE + ) + + target_sources(${TARGET} PRIVATE ${XCASSETS_GEN_PLIST}) + set_source_files_properties(${XCASSETS_GEN_PLIST} PROPERTIES GENERATED TRUE) +endfunction() + +## A helper to code-sign an executable. +function(osx_codesign_target TARGET) + ## Xcode should perform automatic code-signing for us. + if(XCODE) + return() + endif() + + if(CODE_SIGN_IDENTITY) + cmake_parse_arguments(CODESIGN + "FORCE" + "" + "OPTIONS;FILES" + ${ARGN}) + + set(CODESIGN_ARGS --timestamp -s "${CODE_SIGN_IDENTITY}") + if(CODESIGN_FORCE) + list(APPEND CODESIGN_ARGS -f) + endif() + if(CODESIGN_OPTIONS) + list(JOIN CODESIGN_OPTIONS , CODESIGN_OPTIONS_JOINED) + list(APPEND CODESIGN_ARGS "--option=${CODESIGN_OPTIONS_JOINED}") + endif() + + ## Process the entitlements as though Xcode has done variable expansion. + ## This only supports the PRODUCT_BUNDLE_IDENTIFIER and DEVELOPMENT_TEAM + ## for now. + get_target_property(CODESIGN_ENTITLEMENTS ${TARGET} XCODE_ATTRIBUTE_CODE_SIGN_ENTITLEMENTS) + if(CODESIGN_ENTITLEMENTS) + add_custom_command(TARGET ${TARGET} POST_BUILD + COMMAND ${CMAKE_SOURCE_DIR}/scripts/utils/make_template.py ${CODESIGN_ENTITLEMENTS} + -k PRODUCT_BUNDLE_IDENTIFIER=$ + -k DEVELOPMENT_TEAM=$ + -o ${CMAKE_CURRENT_BINARY_DIR}/${TARGET}_codesign.entitlements + ) + list(APPEND CODESIGN_ARGS --entitlements ${CMAKE_CURRENT_BINARY_DIR}/${TARGET}_codesign.entitlements) + endif() + + ## If no files were specified, sign the target itself. + if(NOT CODESIGN_FILES) + set(CODESIGN_FILES $) + endif() + + foreach(FILE ${CODESIGN_FILES}) + add_custom_command(TARGET ${TARGET} POST_BUILD VERBATIM + COMMAND ${COMMENT_ECHO_COMMAND} "Signing ${TARGET}: ${FILE}" + COMMAND ${CODESIGN_BIN} ${CODESIGN_ARGS} ${FILE} + ) + endforeach() + endif() +endfunction() \ No newline at end of file