diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index a5605263..187150da 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -1,5 +1,6 @@ name: 'Deploy workflow' + on: [push] jobs: @@ -8,7 +9,7 @@ jobs: runs-on: ubuntu-latest env: - QT_VERSION: 5.15.2 + QT_VERSION: 6.4.1 QIF_VERSION: 4.5 steps: @@ -19,6 +20,7 @@ jobs: host: 'linux' target: 'desktop' arch: 'gcc_64' + modules: 'qtremoteobjects qt5compat' dir: ${{ runner.temp }} setup-python: 'true' tools: 'tools_ifw' @@ -45,29 +47,11 @@ jobs: Build-Windows: name: Build-Windows runs-on: windows-latest - continue-on-error: true - - strategy: - matrix: - arch: [32, 64] - include: - - qt-arch: 'win32_msvc2019' - arch: 32 - - qt-msvc-path: 'msvc2019' - arch: 32 - - msvc-arch: 'x86' - arch: 32 - - qt-arch: 'win64_msvc2019_64' - arch: 64 - - qt-msvc-path: 'msvc2019_64' - arch: 64 - - msvc-arch: 'x64' - arch: 64 env: - QT_VERSION: 5.15.2 + QT_VERSION: 6.4.1 QIF_VERSION: 4.5 - BUILD_ARCH: ${{ matrix.arch }} + BUILD_ARCH: 64 steps: - name: 'Get sources' @@ -85,7 +69,8 @@ jobs: version: ${{ env.QT_VERSION }} host: 'windows' target: 'desktop' - arch: '${{ matrix.qt-arch }}' + arch: 'win64_msvc2019_64' + modules: 'qtremoteobjects qt5compat' dir: ${{ runner.temp }} setup-python: 'true' tools: 'tools_ifw' @@ -95,13 +80,13 @@ jobs: - name: 'Setup mvsc' uses: ilammy/msvc-dev-cmd@v1 with: - arch: ${{ matrix.msvc-arch }} + arch: 'x64' - name: 'Build project' shell: cmd run: | set BUILD_ARCH=${{ env.BUILD_ARCH }} - set QT_BIN_DIR="${{ runner.temp }}\\Qt\\${{ env.QT_VERSION }}\\${{ matrix.qt-msvc-path }}\\bin" + 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 @@ -112,7 +97,7 @@ jobs: runs-on: macos-latest env: - QT_VERSION: 5.15.2 + QT_VERSION: 6.4.1 QIF_VERSION: 4.4 steps: @@ -121,12 +106,24 @@ jobs: with: xcode-version: '13.4' - - name: 'Install 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' + dir: ${{ runner.temp }} + set-env: 'true' + + - name: 'Install ios Qt' uses: jurplel/install-qt-action@v3 with: version: ${{ env.QT_VERSION }} host: 'mac' target: 'ios' + modules: 'qtremoteobjects qt5compat qtshadertools' dir: ${{ runner.temp }} setup-python: 'true' set-env: 'true' @@ -153,9 +150,29 @@ jobs: - name: 'Build project' run: | 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 QT_IOS_BIN=$QT_BIN_DIR export PATH=$PATH:~/go/bin - bash deploy/build_ios.sh + mkdir build-ios + $QT_IOS_BIN/qt-cmake . -B build-ios -GXcode -DQT_HOST_PATH=$QT_MACOS_ROOT_DIR + + - name: iOS Build/Release With Multiple Targets Action + uses: kumarsunil0007/build-ios-action@latest + with: + project-path: build-ios/AmneziaVPN.xcodeproj + p12-base64: ~/amnezia-vpn/amnezia-ios-certificates/certs/distribution/443886Q5PL.p12 + mobileprovision-base64: ~/amnezia-vpn/amnezia-ios-certificates/testprofilez.mobileprovision + code-signing-identity: 'iOS Distribution' + team-id: 'X7UJ388FXK' + configuration: Release + + + + + + + + # ------------------------------------------------------ @@ -164,7 +181,7 @@ jobs: runs-on: macos-latest env: - QT_VERSION: 5.15.2 + QT_VERSION: 6.4.1 QIF_VERSION: 4.5 steps: @@ -180,6 +197,7 @@ jobs: host: 'mac' target: 'desktop' arch: 'clang_64' + modules: 'qtremoteobjects qt5compat' dir: ${{ runner.temp }} setup-python: 'true' tools: 'tools_ifw' @@ -197,7 +215,7 @@ jobs: - name: 'Build project' run: | - export QT_BIN_DIR="${{ runner.temp }}/Qt/${{ env.QT_VERSION }}/clang_64/bin" + 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 @@ -206,19 +224,38 @@ jobs: Build-Android: name: 'Build-Android' runs-on: ubuntu-latest + continue-on-error: true + + strategy: + matrix: + arch: ['android_x86_64', 'android_x86'] #, 'android_armv7', 'android_arm64_v8a'] env: - QT_VERSION: 5.15.2 + QT_VERSION: 6.4.1 QIF_VERSION: 4.5 steps: - - name: 'Install Qt' + - name: 'Install desktop Qt' + uses: jurplel/install-qt-action@v3 + with: + version: ${{ env.QT_VERSION }} + host: 'linux' + target: 'desktop' + arch: 'gcc_64' + modules: 'qtremoteobjects qt5compat' + dir: ${{ runner.temp }} + setup-python: 'true' + set-env: 'true' + extra: '--external 7z' + + - name: 'Install android Qt' uses: jurplel/install-qt-action@v3 with: version: ${{ env.QT_VERSION }} host: 'linux' target: 'android' - arch: 'android' + arch: ${{ matrix.arch }} + modules: 'qtremoteobjects qt5compat' dir: ${{ runner.temp }} setup-python: 'true' set-env: 'true' @@ -251,5 +288,5 @@ jobs: unzip -q -d ${{ runner.temp }} ${{ runner.temp }}/ndk.zip ; fi - export QT_BIN_DIR=${{ runner.temp }}/Qt/${{ env.QT_VERSION }}/android/bin - bash deploy/build_android.sh \ No newline at end of file + export QT_BIN_DIR=${{ runner.temp }}/Qt/${{ env.QT_VERSION }}/${{ matrix.arch }}/bin + bash deploy/build_android.sh diff --git a/.gitmodules b/.gitmodules index 3447966d..7a51fcf7 100644 --- a/.gitmodules +++ b/.gitmodules @@ -25,6 +25,9 @@ [submodule "client/3rd/qtkeychain"] path = client/3rd/qtkeychain url = https://github.com/frankosterfeld/qtkeychain.git +[submodule "deploy/amnezia-ios-certificates"] + path = deploy/amnezia-ios-certificates + url = https://github.com/amnezia-vpn/amnezia-ios-certificates.git [submodule "client/3rd/SortFilterProxyModel"] path = client/3rd/SortFilterProxyModel url = https://github.com/mitchcurtis/SortFilterProxyModel.git diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 00000000..6236396e --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,10 @@ +cmake_minimum_required(VERSION 3.23.0 FATAL_ERROR) + +set(PROJECT AmneziaVPN) +project(${PROJECT}) + +add_subdirectory(client) + +if(NOT IOS AND NOT ANDROID) + add_subdirectory(service) +endif() diff --git a/client/3rd/QSimpleCrypto/QSimpleCrypto.cmake b/client/3rd/QSimpleCrypto/QSimpleCrypto.cmake new file mode 100644 index 00000000..7ec5498a --- /dev/null +++ b/client/3rd/QSimpleCrypto/QSimpleCrypto.cmake @@ -0,0 +1,20 @@ +include_directories(${CMAKE_CURRENT_LIST_DIR}) + +set(HEADERS ${HEADERS} + ${CMAKE_CURRENT_LIST_DIR}/include/QAead.h + ${CMAKE_CURRENT_LIST_DIR}/include/QBlockCipher.h + ${CMAKE_CURRENT_LIST_DIR}/include/QCryptoError.h + ${CMAKE_CURRENT_LIST_DIR}/include/QRsa.h + ${CMAKE_CURRENT_LIST_DIR}/include/QSimpleCrypto_global.h + ${CMAKE_CURRENT_LIST_DIR}/include/QX509.h + ${CMAKE_CURRENT_LIST_DIR}/include/QX509Store.h +) + +set(SOURCES ${SOURCES} + ${CMAKE_CURRENT_LIST_DIR}/sources/QAead.cpp + ${CMAKE_CURRENT_LIST_DIR}/sources/QBlockCipher.cpp + ${CMAKE_CURRENT_LIST_DIR}/sources/QCryptoError.cpp + ${CMAKE_CURRENT_LIST_DIR}/sources/QRsa.cpp + ${CMAKE_CURRENT_LIST_DIR}/sources/QX509.cpp + ${CMAKE_CURRENT_LIST_DIR}/sources/QX509Store.cpp +) diff --git a/client/3rd/QtSsh/src/botan/botan.cmake b/client/3rd/QtSsh/src/botan/botan.cmake new file mode 100644 index 00000000..d363fe71 --- /dev/null +++ b/client/3rd/QtSsh/src/botan/botan.cmake @@ -0,0 +1,73 @@ +include_directories( + ${CMAKE_CURRENT_LIST_DIR}/include + ${CMAKE_CURRENT_LIST_DIR}/include/external +) + +if(WIN32) + add_compile_definitions(MVPN_WINDOWS) + add_compile_options(/bigobj) + set(LIBS ${LIBS} + crypt32 + ) + + if("${CMAKE_SIZEOF_VOID_P}" STREQUAL "8") + include_directories(${CMAKE_CURRENT_LIST_DIR}/windows/x86_64) + set(HEADERS ${HEADERS} ${CMAKE_CURRENT_LIST_DIR}/windows/x86_64/botan_all.h) + set(SOURCES ${SOURCES} ${CMAKE_CURRENT_LIST_DIR}/windows/x86_64/botan_all.cpp) + else() + include_directories(${CMAKE_CURRENT_LIST_DIR}/windows/x86) + set(HEADERS ${HEADERS} ${CMAKE_CURRENT_LIST_DIR}/windows/x86/botan_all.h) + set(SOURCES ${SOURCES} ${CMAKE_CURRENT_LIST_DIR}/windows/x86/botan_all.cpp) + endif() +endif() + +if(APPLE AND NOT IOS) + include_directories(${CMAKE_CURRENT_LIST_DIR}/macos) + set(HEADERS ${HEADERS} ${CMAKE_CURRENT_LIST_DIR}/macos/botan_all.h) + set(SOURCES ${SOURCES} ${CMAKE_CURRENT_LIST_DIR}/macos/botan_all.cpp) +endif() + +if(LINUX) + include_directories(${CMAKE_CURRENT_LIST_DIR}/linux) + set(HEADERS ${HEADERS} ${CMAKE_CURRENT_LIST_DIR}/linux/botan_all.h) + set(SOURCES ${SOURCES} ${CMAKE_CURRENT_LIST_DIR}/linux/botan_all.cpp) + set(LIBS ${LIBS} dl) +endif() + +if(ANDROID) + # We need to include qtprivate api's + # As QAndroidBinder is not yet implemented with a public api + set(LIBS ${LIBS} Qt6::CorePrivate) + set(ANDROID_ABIS ANDROID_TARGET_ARCH) + + link_directories(${CMAKE_CURRENT_LIST_DIR}/android/${ANDROID_TARGET_ARCH}) + set(HEADERS ${HEADERS} ${CMAKE_CURRENT_LIST_DIR}/android/${ANDROID_TARGET_ARCH}/botan_all.h) + set(SOURCES ${SOURCES} ${CMAKE_CURRENT_LIST_DIR}/android/${ANDROID_TARGET_ARCH}/botan_all.cpp) +endif() + +if(IOS) + # CONFIG(iphoneos, iphoneos|iphonesimulator) { + # contains(QT_ARCH, arm64) { + # INCLUDEPATH += $$PWD/ios/iphone + # HEADERS += $$PWD/ios/iphone/botan_all.h + # SOURCES += $$PWD/ios/iphone/botan_all.cpp + # } else { + # message("Building for iOS/ARM v7 (32-bit) architecture") + # ARCH_TAG = "ios_armv7" + # } + # } + + # CONFIG(iphonesimulator, iphoneos|iphonesimulator) { + # INCLUDEPATH += $$PWD/ios/iphone + # HEADERS += $$PWD/ios/iphone/botan_all.h + # SOURCES += $$PWD/ios/iphone/botan_all.cpp + # } + + include_directories(${CMAKE_CURRENT_LIST_DIR}/ios/iphone) + set(HEADERS ${HEADERS} ${CMAKE_CURRENT_LIST_DIR}/ios/iphone/botan_all.h) + set(SOURCES ${SOURCES} ${CMAKE_CURRENT_LIST_DIR}/ios/iphone/botan_all.cpp) + + + + +endif() diff --git a/client/3rd/QtSsh/src/ssh/qssh.cmake b/client/3rd/QtSsh/src/ssh/qssh.cmake new file mode 100644 index 00000000..b829fed5 --- /dev/null +++ b/client/3rd/QtSsh/src/ssh/qssh.cmake @@ -0,0 +1,96 @@ +include_directories(${CMAKE_CURRENT_LIST_DIR}) + +find_package(Qt6 REQUIRED COMPONENTS + Widgets Gui Network Core5Compat +) +set(LIBS ${LIBS} Qt6::Widgets Qt6::Gui Qt6::Network Qt6::Core5Compat) + +set(SOURCES ${SOURCES} + ${CMAKE_CURRENT_LIST_DIR}/sshsendfacility.cpp + ${CMAKE_CURRENT_LIST_DIR}/sshremoteprocess.cpp + ${CMAKE_CURRENT_LIST_DIR}/sshpacketparser.cpp + ${CMAKE_CURRENT_LIST_DIR}/sshpacket.cpp + ${CMAKE_CURRENT_LIST_DIR}/sshoutgoingpacket.cpp + ${CMAKE_CURRENT_LIST_DIR}/sshkeygenerator.cpp + ${CMAKE_CURRENT_LIST_DIR}/sshkeyexchange.cpp + ${CMAKE_CURRENT_LIST_DIR}/sshincomingpacket.cpp + ${CMAKE_CURRENT_LIST_DIR}/sshcryptofacility.cpp + ${CMAKE_CURRENT_LIST_DIR}/sshconnection.cpp + ${CMAKE_CURRENT_LIST_DIR}/sshchannelmanager.cpp + ${CMAKE_CURRENT_LIST_DIR}/sshchannel.cpp + ${CMAKE_CURRENT_LIST_DIR}/sshcapabilities.cpp + ${CMAKE_CURRENT_LIST_DIR}/sftppacket.cpp + ${CMAKE_CURRENT_LIST_DIR}/sftpoutgoingpacket.cpp + ${CMAKE_CURRENT_LIST_DIR}/sftpoperation.cpp + ${CMAKE_CURRENT_LIST_DIR}/sftpincomingpacket.cpp + ${CMAKE_CURRENT_LIST_DIR}/sftpdefs.cpp + ${CMAKE_CURRENT_LIST_DIR}/sftpchannel.cpp + ${CMAKE_CURRENT_LIST_DIR}/sshremoteprocessrunner.cpp + ${CMAKE_CURRENT_LIST_DIR}/sshconnectionmanager.cpp + ${CMAKE_CURRENT_LIST_DIR}/sshkeypasswordretriever.cpp + ${CMAKE_CURRENT_LIST_DIR}/sftpfilesystemmodel.cpp + ${CMAKE_CURRENT_LIST_DIR}/sshdirecttcpiptunnel.cpp + ${CMAKE_CURRENT_LIST_DIR}/sshhostkeydatabase.cpp + ${CMAKE_CURRENT_LIST_DIR}/sshlogging.cpp + ${CMAKE_CURRENT_LIST_DIR}/sshtcpipforwardserver.cpp + ${CMAKE_CURRENT_LIST_DIR}/sshtcpiptunnel.cpp + ${CMAKE_CURRENT_LIST_DIR}/sshforwardedtcpiptunnel.cpp + ${CMAKE_CURRENT_LIST_DIR}/sshagent.cpp + ${CMAKE_CURRENT_LIST_DIR}/sshx11channel.cpp + ${CMAKE_CURRENT_LIST_DIR}/sshx11inforetriever.cpp + ${CMAKE_CURRENT_LIST_DIR}/opensshkeyfilereader.cpp +) + +set(PUBLIC_HEADERS ${PUBLIC_HEADERS} + ${CMAKE_CURRENT_LIST_DIR}/sftpdefs.h + ${CMAKE_CURRENT_LIST_DIR}/ssherrors.h + ${CMAKE_CURRENT_LIST_DIR}/sshremoteprocess.h + ${CMAKE_CURRENT_LIST_DIR}/sftpchannel.h + ${CMAKE_CURRENT_LIST_DIR}/sshkeygenerator.h + ${CMAKE_CURRENT_LIST_DIR}/sshremoteprocessrunner.h + ${CMAKE_CURRENT_LIST_DIR}/sshconnectionmanager.h + ${CMAKE_CURRENT_LIST_DIR}/sshpseudoterminal.h + ${CMAKE_CURRENT_LIST_DIR}/sftpfilesystemmodel.h + ${CMAKE_CURRENT_LIST_DIR}/sshdirecttcpiptunnel.h + ${CMAKE_CURRENT_LIST_DIR}/sshtcpipforwardserver.h + ${CMAKE_CURRENT_LIST_DIR}/sshhostkeydatabase.h + ${CMAKE_CURRENT_LIST_DIR}/sshforwardedtcpiptunnel.h + ${CMAKE_CURRENT_LIST_DIR}/ssh_global.h + ${CMAKE_CURRENT_LIST_DIR}/sshconnection.h +) + +set(HEADERS ${HEADERS} + ${PUBLIC_HEADERS} + ${CMAKE_CURRENT_LIST_DIR}/sshsendfacility_p.h + ${CMAKE_CURRENT_LIST_DIR}/sshremoteprocess_p.h + ${CMAKE_CURRENT_LIST_DIR}/sshpacketparser_p.h + ${CMAKE_CURRENT_LIST_DIR}/sshpacket_p.h + ${CMAKE_CURRENT_LIST_DIR}/sshoutgoingpacket_p.h + ${CMAKE_CURRENT_LIST_DIR}/sshkeyexchange_p.h + ${CMAKE_CURRENT_LIST_DIR}/sshincomingpacket_p.h + ${CMAKE_CURRENT_LIST_DIR}/sshexception_p.h + ${CMAKE_CURRENT_LIST_DIR}/sshcryptofacility_p.h + ${CMAKE_CURRENT_LIST_DIR}/sshconnection_p.h + ${CMAKE_CURRENT_LIST_DIR}/sshchannelmanager_p.h + ${CMAKE_CURRENT_LIST_DIR}/sshchannel_p.h + ${CMAKE_CURRENT_LIST_DIR}/sshcapabilities_p.h + ${CMAKE_CURRENT_LIST_DIR}/sshbotanconversions_p.h + ${CMAKE_CURRENT_LIST_DIR}/sftppacket_p.h + ${CMAKE_CURRENT_LIST_DIR}/sftpoutgoingpacket_p.h + ${CMAKE_CURRENT_LIST_DIR}/sftpoperation_p.h + ${CMAKE_CURRENT_LIST_DIR}/sftpincomingpacket_p.h + ${CMAKE_CURRENT_LIST_DIR}/sftpchannel_p.h + ${CMAKE_CURRENT_LIST_DIR}/sshkeypasswordretriever_p.h + ${CMAKE_CURRENT_LIST_DIR}/sshdirecttcpiptunnel_p.h + ${CMAKE_CURRENT_LIST_DIR}/sshlogging_p.h + ${CMAKE_CURRENT_LIST_DIR}/sshtcpipforwardserver_p.h + ${CMAKE_CURRENT_LIST_DIR}/sshtcpiptunnel_p.h + ${CMAKE_CURRENT_LIST_DIR}/sshforwardedtcpiptunnel_p.h + ${CMAKE_CURRENT_LIST_DIR}/sshagent_p.h + ${CMAKE_CURRENT_LIST_DIR}/sshx11channel_p.h + ${CMAKE_CURRENT_LIST_DIR}/sshx11displayinfo_p.h + ${CMAKE_CURRENT_LIST_DIR}/sshx11inforetriever_p.h + ${CMAKE_CURRENT_LIST_DIR}/opensshkeyfilereader_p.h +) + +# qt6_add_resources(QRC ${QRC} ${CMAKE_CURRENT_LIST_DIR}/qssh.qrc) \ No newline at end of file diff --git a/client/3rd/QtSsh/src/ssh/sshpacket.cpp b/client/3rd/QtSsh/src/ssh/sshpacket.cpp index e75ab4a4..06160f11 100644 --- a/client/3rd/QtSsh/src/ssh/sshpacket.cpp +++ b/client/3rd/QtSsh/src/ssh/sshpacket.cpp @@ -138,7 +138,7 @@ QByteArray AbstractSshPacket::generateMac(const SshAbstractCryptoFacility &crypt quint32 seqNr) const { const quint32 seqNrBe = qToBigEndian(seqNr); - QByteArray data(reinterpret_cast(&seqNrBe), sizeof seqNrBe); + QByteArray data(reinterpret_cast(&seqNrBe), static_cast(sizeof seqNrBe)); data += QByteArray(m_data.constData(), length() + 4); return crypt.generateMac(data, data.size()); } @@ -150,8 +150,9 @@ quint32 AbstractSshPacket::minPacketSize() const void AbstractSshPacket::setLengthField(QByteArray &data) { - const quint32 length = qToBigEndian(data.size() - 4); - data.replace(qsizetype(0), 4, reinterpret_cast(&length), 4); + const quint32 length = qToBigEndian(data.size() - 4); + data.replace(static_cast(0), static_cast(4), + reinterpret_cast(&length), static_cast(4)); } } // namespace Internal diff --git a/client/3rd/SingleApplication/singleapplication.cmake b/client/3rd/SingleApplication/singleapplication.cmake new file mode 100644 index 00000000..78abfa8a --- /dev/null +++ b/client/3rd/SingleApplication/singleapplication.cmake @@ -0,0 +1,25 @@ +include_directories(${CMAKE_CURRENT_LIST_DIR}) + +find_package(Qt6 REQUIRED COMPONENTS + Core Network +) +set(LIBS ${LIBS} Qt6::Core Qt6::Network) + + +set(HEADERS ${HEADERS} + ${CMAKE_CURRENT_LIST_DIR}/singleapplication.h + ${CMAKE_CURRENT_LIST_DIR}/singleapplication_p.h +) + +set(SOURCES ${SOURCES} + ${CMAKE_CURRENT_LIST_DIR}/singleapplication.cpp + ${CMAKE_CURRENT_LIST_DIR}/singleapplication_p.cpp +) + +if(WIN32) + if(MSVC) + set(LIBS ${LIBS} Advapi32.lib) + elseif ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU") + set(LIBS ${LIBS} advapi32) + endif() +endif() diff --git a/client/3rd/qrcodegen/qrcodegen.cmake b/client/3rd/qrcodegen/qrcodegen.cmake new file mode 100644 index 00000000..4be9056d --- /dev/null +++ b/client/3rd/qrcodegen/qrcodegen.cmake @@ -0,0 +1,4 @@ +include_directories(${CMAKE_CURRENT_LIST_DIR}) + +set(HEADERS ${HEADERS} ${CMAKE_CURRENT_LIST_DIR}/qrcodegen.hpp) +set(SOURCES ${SOURCES} ${CMAKE_CURRENT_LIST_DIR}/qrcodegen.cpp) diff --git a/client/AmneziaVPN.entitlements b/client/AmneziaVPN.entitlements new file mode 100644 index 00000000..dd0d73f2 --- /dev/null +++ b/client/AmneziaVPN.entitlements @@ -0,0 +1,14 @@ + + + + + com.apple.security.application-groups + + group.org.amnezia.AmneziaVPN + + keychain-access-groups + + $(AppIdentifierPrefix)group.org.amnezia.AmneziaVPN + + + diff --git a/client/CMakeLists.txt b/client/CMakeLists.txt new file mode 100644 index 00000000..8aeddc32 --- /dev/null +++ b/client/CMakeLists.txt @@ -0,0 +1,551 @@ +cmake_minimum_required(VERSION 3.23.0 FATAL_ERROR) + +set(PROJECT AmneziaVPN) +project(${PROJECT} VERSION 2.1.2) +set(BUILD_ID 1) +SET(QT_BUILD_TOOLS_WHEN_CROSS_COMPILING ON) +set(CMAKE_CXX_STANDARD 17) +set(CMAKE_CXX_STANDARD_REQUIRED ON) +if(${CMAKE_VERSION} VERSION_GREATER_EQUAL 3.17) + cmake_policy(SET CMP0099 OLD) +endif() + +set(CMAKE_AUTOMOC ON) +set(CMAKE_AUTORCC ON) +set(CMAKE_AUTOUIC ON) +set_property(GLOBAL PROPERTY USE_FOLDERS ON) +set_property(GLOBAL PROPERTY AUTOGEN_TARGETS_FOLDER "Autogen") +set_property(GLOBAL PROPERTY AUTOMOC_TARGETS_FOLDER "Autogen") +set_property(GLOBAL PROPERTY PREDEFINED_TARGETS_FOLDER "Autogen") + +find_package(Qt6 REQUIRED COMPONENTS + Widgets Core Gui Network Xml + RemoteObjects Quick Svg QuickControls2 + Core5Compat +) +set(LIBS ${LIBS} + Qt6::Widgets Qt6::Core Qt6::Gui + Qt6::Network Qt6::Xml Qt6::RemoteObjects + Qt6::Quick Qt6::Svg Qt6::QuickControls2 + Qt6::Core5Compat +) + +qt_standard_project_setup() + +if(IOS) + execute_process(COMMAND bash ${CMAKE_CURRENT_LIST_DIR}/scripts/openvpn.sh args + WORKING_DIRECTORY ${CMAKE_CURRENT_LIST_DIR}) +endif() + +set(IS_CI ${CI}) +if(IS_CI) + message("Detected CI env") + find_program(CCACHE "ccache") + if(CCACHE) + set_property(GLOBAL PROPERTY RULE_LAUNCH_COMPILE "${CCACHE}") + endif() +endif() + +include(${CMAKE_CURRENT_LIST_DIR}/cmake/3rdparty.cmake) + +include_directories( + ${CMAKE_CURRENT_LIST_DIR}/../ipc + ${CMAKE_CURRENT_LIST_DIR} + ${CMAKE_CURRENT_BINARY_DIR} +) + +set(HEADERS ${HEADERS} + ${CMAKE_CURRENT_LIST_DIR}/../ipc/ipc.h + ${CMAKE_CURRENT_LIST_DIR}/amnezia_application.h + ${CMAKE_CURRENT_LIST_DIR}/containers/containers_defs.h + ${CMAKE_CURRENT_LIST_DIR}/core/defs.h + ${CMAKE_CURRENT_LIST_DIR}/core/errorstrings.h + ${CMAKE_CURRENT_LIST_DIR}/core/scripts_registry.h + ${CMAKE_CURRENT_LIST_DIR}/core/server_defs.h + ${CMAKE_CURRENT_LIST_DIR}/core/servercontroller.h + ${CMAKE_CURRENT_LIST_DIR}/platforms/linux/leakdetector.h + ${CMAKE_CURRENT_LIST_DIR}/protocols/protocols_defs.h + ${CMAKE_CURRENT_LIST_DIR}/ui/notificationhandler.h + ${CMAKE_CURRENT_LIST_DIR}/ui/pages.h + ${CMAKE_CURRENT_LIST_DIR}/ui/property_helper.h + ${CMAKE_CURRENT_LIST_DIR}/ui/uilogic.h + ${CMAKE_CURRENT_LIST_DIR}/ui/qautostart.h + ${CMAKE_CURRENT_LIST_DIR}/protocols/vpnprotocol.h +) + +if(NOT IOS) + set(HEADERS ${HEADERS} + ${CMAKE_CURRENT_LIST_DIR}/platforms/ios/MobileUtils.h + ${CMAKE_CURRENT_LIST_DIR}/platforms/ios/QRCodeReaderBase.h + ) +endif() + +set(SOURCES ${SOURCES} + ${CMAKE_CURRENT_LIST_DIR}/amnezia_application.cpp + ${CMAKE_CURRENT_LIST_DIR}/containers/containers_defs.cpp + ${CMAKE_CURRENT_LIST_DIR}/core/errorstrings.cpp + ${CMAKE_CURRENT_LIST_DIR}/core/scripts_registry.cpp + ${CMAKE_CURRENT_LIST_DIR}/core/server_defs.cpp + ${CMAKE_CURRENT_LIST_DIR}/core/servercontroller.cpp + ${CMAKE_CURRENT_LIST_DIR}/platforms/linux/leakdetector.cpp + ${CMAKE_CURRENT_LIST_DIR}/protocols/protocols_defs.cpp + ${CMAKE_CURRENT_LIST_DIR}/ui/notificationhandler.cpp + ${CMAKE_CURRENT_LIST_DIR}/ui/uilogic.cpp + ${CMAKE_CURRENT_LIST_DIR}/ui/qautostart.cpp + ${CMAKE_CURRENT_LIST_DIR}/protocols/vpnprotocol.cpp +) + +if(NOT IOS) + set(SOURCES ${SOURCES} + ${CMAKE_CURRENT_LIST_DIR}/platforms/ios/MobileUtils.cpp + ${CMAKE_CURRENT_LIST_DIR}/platforms/ios/QRCodeReaderBase.cpp + ) +endif() + +file(GLOB COMMON_FILES_H CONFIGURE_DEPENDS ${CMAKE_CURRENT_LIST_DIR}/*.h) +file(GLOB COMMON_FILES_CPP CONFIGURE_DEPENDS ${CMAKE_CURRENT_LIST_DIR}/*.cpp) + +file(GLOB_RECURSE PAGE_LOGIC_H CONFIGURE_DEPENDS ${CMAKE_CURRENT_LIST_DIR}/ui/pages_logic/*.h) +file(GLOB_RECURSE PAGE_LOGIC_CPP CONFIGURE_DEPENDS ${CMAKE_CURRENT_LIST_DIR}/ui/pages_logic/*.cpp) + +file(GLOB CONFIGURATORS_H CONFIGURE_DEPENDS ${CMAKE_CURRENT_LIST_DIR}/configurators/*.h) +file(GLOB CONFIGURATORS_CPP CONFIGURE_DEPENDS ${CMAKE_CURRENT_LIST_DIR}/configurators/*.cpp) + +file(GLOB UI_MODELS_H CONFIGURE_DEPENDS ${CMAKE_CURRENT_LIST_DIR}/ui/models/*.h) +file(GLOB UI_MODELS_CPP CONFIGURE_DEPENDS ${CMAKE_CURRENT_LIST_DIR}/ui/models/*.cpp) + +set(HEADERS ${HEADERS} + ${COMMON_FILES_H} + ${PAGE_LOGIC_H} + ${CONFIGURATORS_H} + ${UI_MODELS_H} +) +set(SOURCES ${SOURCES} + ${COMMON_FILES_CPP} + ${PAGE_LOGIC_CPP} + ${CONFIGURATORS_CPP} + ${UI_MODELS_CPP} +) + +qt6_add_resources(QRC ${QRC} ${CMAKE_CURRENT_LIST_DIR}/resources.qrc) + +if(WIN32) + add_compile_definitions(MVPN_WINDOWS) + + set(HEADERS ${HEADERS} + ${CMAKE_CURRENT_LIST_DIR}/protocols/ikev2_vpn_protocol_windows.h + ${CMAKE_CURRENT_LIST_DIR}/ui/framelesswindow.h + ) + + set(SOURCES ${SOURCES} + ${CMAKE_CURRENT_LIST_DIR}/protocols/ikev2_vpn_protocol_windows.cpp + ${CMAKE_CURRENT_LIST_DIR}/ui/framelesswindow.cpp + ) + + set(RESOURCES ${RESOURCES} + ${CMAKE_CURRENT_LIST_DIR}/platforms/windows/amneziavpn.rc + ) + + set(LIBS ${LIBS} + user32 + rasapi32 + shlwapi + iphlpapi + ws2_32 + gdi32 + ) + + set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /SUBSYSTEM:WINDOWS /ENTRY:mainCRTStartup") + + if("${CMAKE_SIZEOF_VOID_P}" STREQUAL "8") + message("Windows x86_64 build") + link_directories(${CMAKE_CURRENT_LIST_DIR}/3rd/OpenSSL/lib/windows/x86_64) + set(LIBS ${LIBS} + libssl + libcrypto + ) + else() + message("Windows x86 build") + link_directories(${CMAKE_CURRENT_LIST_DIR}/3rd/OpenSSL/lib/windows/x86) + set(LIBS ${LIBS} + libssl + libcrypto + ) + endif() +endif() + +if(APPLE) + if(NOT BUILD_OSX_APP_IDENTIFIER) + set(BUILD_OSX_APP_IDENTIFIER org.amnezia.AmneziaVPN CACHE STRING "OSX Application identifier") + endif() + if(NOT BUILD_IOS_APP_IDENTIFIER) + set(BUILD_IOS_APP_IDENTIFIER org.amnezia.AmneziaVPN CACHE STRING "iOS Application identifier") + endif() + if(NOT BUILD_IOS_GROUP_IDENTIFIER) + set(BUILD_IOS_GROUP_IDENTIFIER group.org.amnezia.AmneziaVPN.Guardian CACHE STRING "iOS Group identifier") + endif() + if(NOT BUILD_VPN_DEVELOPMENT_TEAM) + set(BUILD_VPN_DEVELOPMENT_TEAM X7UJ388FXK CACHE STRING "Amnezia VPN Development Team") + endif() + + set(CMAKE_XCODE_GENERATE_SCHEME FALSE) + set(CMAKE_XCODE_ATTRIBUTE_DEVELOPMENT_TEAM ${BUILD_VPN_DEVELOPMENT_TEAM}) + set(CMAKE_XCODE_ATTRIBUTE_GROUP_ID_IOS ${BUILD_IOS_GROUP_IDENTIFIER}) + + if(NOT IOS) + set(CMAKE_OSX_ARCHITECTURES "x86_64" CACHE INTERNAL "" FORCE) + + message("MAC build") + set(HEADERS ${HEADERS} ${CMAKE_CURRENT_LIST_DIR}/ui/macos_util.h) + set(SOURCES ${SOURCES} ${CMAKE_CURRENT_LIST_DIR}/ui/macos_util.mm) + + # set(CMAKE_OSX_DEPLOYMENT_TARGET 10.14) + add_compile_definitions(MVPN_MACOS) + # ICON = $$PWD/images/app.icns + find_library(LIB_LIBCRYPTO NAMES "libcrypto.a" + PATHS ${PROJECT_SOURCE_DIR}/3rd/OpenSSL/lib/macos/x86_64/ NO_DEFAULT_PATH) + + find_library(LIB_SSL NAMES "libssl.a" + PATHS ${PROJECT_SOURCE_DIR}/3rd/OpenSSL/lib/macos/x86_64/ NO_DEFAULT_PATH) + + + find_library(FW_COCOA Cocoa) + find_library(FW_APPLICATIONSERVICES ApplicationServices) + find_library(FW_CORESERVICES CoreServices) + find_library(FW_FOUNDATION Foundation) + find_library(FW_APPKIT AppKit) + find_library(FW_SECURITY Security) + + set(LIBS ${LIBS} + ${FW_COCOA} ${FW_APPLICATIONSERVICES} + ${FW_FOUNDATION} ${FW_APPKIT} + ${FW_SECURITY} ${FW_CORESERVICES} + ${LIB_LIBCRYPTO} ${LIB_SSL} + ) + endif() +endif() + + +if(LINUX AND NOT ANDROID) + add_compile_definitions(MVPN_LINUX) + + set(OPENSSL_USE_STATIC_LIBS TRUE) + find_package(OpenSSL REQUIRED) + set(LIBS ${LIBS} + OpenSSL::Crypto + OpenSSL::SSL + ) + link_directories(${CMAKE_CURRENT_LIST_DIR}/platforms/linux) +endif() + +if(WIN32 OR (APPLE AND NOT IOS) OR (LINUX AND NOT ANDROID)) + message("Client desktop build") + add_compile_definitions(AMNEZIA_DESKTOP) + + set(HEADERS ${HEADERS} + ${CMAKE_CURRENT_LIST_DIR}/core/ipcclient.h + ${CMAKE_CURRENT_LIST_DIR}/core/privileged_process.h + ${CMAKE_CURRENT_LIST_DIR}/ui/systemtray_notificationhandler.h + ${CMAKE_CURRENT_LIST_DIR}/protocols/openvpnprotocol.h + ${CMAKE_CURRENT_LIST_DIR}/protocols/openvpnovercloakprotocol.h + ${CMAKE_CURRENT_LIST_DIR}/protocols/shadowsocksvpnprotocol.h + ${CMAKE_CURRENT_LIST_DIR}/protocols/wireguardprotocol.h + ) + + set(SOURCES ${SOURCES} + ${CMAKE_CURRENT_LIST_DIR}/core/ipcclient.cpp + ${CMAKE_CURRENT_LIST_DIR}/core/privileged_process.cpp + ${CMAKE_CURRENT_LIST_DIR}/ui/systemtray_notificationhandler.cpp + ${CMAKE_CURRENT_LIST_DIR}/protocols/openvpnprotocol.cpp + ${CMAKE_CURRENT_LIST_DIR}/protocols/openvpnovercloakprotocol.cpp + ${CMAKE_CURRENT_LIST_DIR}/protocols/shadowsocksvpnprotocol.cpp + ${CMAKE_CURRENT_LIST_DIR}/protocols/wireguardprotocol.cpp + ) +endif() + +if(ANDROID) + message("Client android ${CMAKE_ANDROID_ARCH_ABI} build") + # We need to include qtprivate api's + # As QAndroidBinder is not yet implemented with a public api + set(LIBS ${LIBS} Qt6::CorePrivate) + set(ANDROID_ABIS ANDROID_TARGET_ARCH) + + add_compile_definitions(MVPN_ANDROID) + + link_directories(${CMAKE_CURRENT_LIST_DIR}/platforms/android) + + set(HEADERS ${HEADERS} + ${CMAKE_CURRENT_LIST_DIR}/platforms/android/android_controller.h + ${CMAKE_CURRENT_LIST_DIR}/platforms/android/android_notificationhandler.h + ${CMAKE_CURRENT_LIST_DIR}/protocols/android_vpnprotocol.h + ) + + set(SOURCES ${SOURCES} + ${CMAKE_CURRENT_LIST_DIR}/platforms/android/android_controller.cp + ${CMAKE_CURRENT_LIST_DIR}/platforms/android/android_notificationhandler.cpp + ${CMAKE_CURRENT_LIST_DIR}/protocols/android_vpnprotocol.cpp + ) +endif() + + + +if(IOS) + message("Client iOS build") + + + + find_package(Qt6 REQUIRED COMPONENTS ShaderTools) + set(LIBS ${LIBS} Qt6::ShaderTools) + + find_library(FW_AUTHENTICATIONSERVICES AuthenticationServices) + find_library(FW_UIKIT UIKit) + find_library(FW_FOUNDATION Foundation) + find_library(FW_STOREKIT StoreKit) + find_library(FW_USERNOTIFICATIONS UserNotifications) + + set(LIBS ${LIBS} + ${FW_AUTHENTICATIONSERVICES} ${FW_UIKIT} + ${FW_FOUNDATION} ${FW_STOREKIT} + ${FW_USERNOTIFICATIONS} + ) + + add_compile_definitions(MVPN_IOS) + + set(HEADERS ${HEADERS} + ${CMAKE_CURRENT_LIST_DIR}/protocols/ios_vpnprotocol.h + ${CMAKE_CURRENT_LIST_DIR}/platforms/ios/iosnotificationhandler.h + ${CMAKE_CURRENT_LIST_DIR}/platforms/ios/json.h + ${CMAKE_CURRENT_LIST_DIR}/platforms/ios/bigint.h + ${CMAKE_CURRENT_LIST_DIR}/platforms/ios/bigintipv6addr.h + ${CMAKE_CURRENT_LIST_DIR}/platforms/ios/ipaddress.h + ${CMAKE_CURRENT_LIST_DIR}/platforms/ios/ipaddressrange.h + ${CMAKE_CURRENT_LIST_DIR}/platforms/ios/QtAppDelegate.h + ${CMAKE_CURRENT_LIST_DIR}/platforms/ios/QtAppDelegate-C-Interface.h + ) + + set(SOURCES ${SOURCES} + ${CMAKE_CURRENT_LIST_DIR}/protocols/ios_vpnprotocol.mm + ${CMAKE_CURRENT_LIST_DIR}/platforms/ios/iosnotificationhandler.mm + ${CMAKE_CURRENT_LIST_DIR}/platforms/ios/json.cpp + ${CMAKE_CURRENT_LIST_DIR}/platforms/ios/iosglue.mm + ${CMAKE_CURRENT_LIST_DIR}/platforms/ios/ipaddress.cpp + ${CMAKE_CURRENT_LIST_DIR}/platforms/ios/ipaddressrange.cpp + ${CMAKE_CURRENT_LIST_DIR}/platforms/ios/QRCodeReaderBase.mm + ${CMAKE_CURRENT_LIST_DIR}/platforms/ios/QtAppDelegate.mm + ${CMAKE_CURRENT_LIST_DIR}/platforms/ios/MobileUtils.mm + ) +endif() + +if(CMAKE_OSX_SYSROOT STREQUAL "iphoneos") + message("Building for iPhone OS") + set(CMAKE_OSX_DEPLOYMENT_TARGET 13.0) + +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(cmake/osxtools.cmake) + # set(CMAKE_XCODE_GENERATE_TOP_LEVEL_PROJECT_ONLY TRUE) + + set_target_properties(${PROJECT} PROPERTIES XCODE_ATTRIBUTE_ENABLE_BITCODE "NO") + set_target_properties(${PROJECT} PROPERTIES XCODE_ATTRIBUTE_ASSETCATALOG_COMPILER_APPICON_NAME "AppIcon") + + set_target_properties(${PROJECT} PROPERTIES XCODE_LINK_BUILD_PHASE_MODE KNOWN_LOCATION) + set(CMAKE_XCODE_ATTRIBUTE_LD_RUNPATH_SEARCH_PATHS "@executable_path/../../Frameworks") + set(CMAKE_XCODE_ATTRIBUTE_FRAMEWORK_SEARCH_PATHS ${CMAKE_CURRENT_LIST_DIR}/3rd/OpenVPNAdapter/build/Release-iphoneos) + + + 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_CURRENT_LIST_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_CURRENT_LIST_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_CURRENT_LIST_DIR}/ios/app/main.entitlements" + XCODE_ATTRIBUTE_MARKETING_VERSION "${CMAKE_PROJECT_VERSION}" + XCODE_GENERATE_SCHEME TRUE + MACOSX_BUNDLE_ICON_FILE "AppIcon" + + ) + + 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\" + ) + + + target_sources(${PROJECT} PRIVATE + ${CMAKE_CURRENT_LIST_DIR}/3rd/wireguard-apple/Sources/Shared/Keychain.swift + ${CMAKE_CURRENT_LIST_DIR}/3rd/wireguard-apple/Sources/WireGuardKit/IPAddressRange.swift + ${CMAKE_CURRENT_LIST_DIR}/3rd/wireguard-apple/Sources/WireGuardKit/InterfaceConfiguration.swift + ${CMAKE_CURRENT_LIST_DIR}/3rd/wireguard-apple/Sources/Shared/Model/NETunnelProviderProtocol+Extension.swift + ${CMAKE_CURRENT_LIST_DIR}/3rd/wireguard-apple/Sources/WireGuardKit/TunnelConfiguration.swift + ${CMAKE_CURRENT_LIST_DIR}/3rd/wireguard-apple/Sources/Shared/Model/TunnelConfiguration+WgQuickConfig.swift + ${CMAKE_CURRENT_LIST_DIR}/3rd/wireguard-apple/Sources/WireGuardKit/Endpoint.swift + ${CMAKE_CURRENT_LIST_DIR}/3rd/wireguard-apple/Sources/Shared/Model/String+ArrayConversion.swift + ${CMAKE_CURRENT_LIST_DIR}/3rd/wireguard-apple/Sources/WireGuardKit/PeerConfiguration.swift + ${CMAKE_CURRENT_LIST_DIR}/3rd/wireguard-apple/Sources/WireGuardKit/DNSServer.swift + ${CMAKE_CURRENT_LIST_DIR}/3rd/wireguard-apple/Sources/WireGuardApp/LocalizationHelper.swift + ${CMAKE_CURRENT_LIST_DIR}/3rd/wireguard-apple/Sources/Shared/FileManager+Extension.swift + ${CMAKE_CURRENT_LIST_DIR}/3rd/wireguard-apple/Sources/WireGuardKitC/x25519.c + ${CMAKE_CURRENT_LIST_DIR}/3rd/wireguard-apple/Sources/WireGuardKit/PrivateKey.swift + ) + + target_sources(${PROJECT} PRIVATE + platforms/ios/iosvpnprotocol.swift + platforms/ios/ioslogger.swift + ) + + target_sources(${PROJECT} PRIVATE + ${CMAKE_CURRENT_LIST_DIR}/ios/app/launch.png + ${CMAKE_CURRENT_LIST_DIR}/ios/app/AmneziaVPNLaunchScreen.storyboard + ) + set_source_files_properties( + ${CMAKE_CURRENT_LIST_DIR}/ios/app/launch.png + ${CMAKE_CURRENT_LIST_DIR}/ios/app/AmneziaVPNLaunchScreen.storyboard + PROPERTIES MACOSX_PACKAGE_LOCATION "Resources" + ) + +target_sources(${PROJECT} PRIVATE + ${CMAKE_CURRENT_LIST_DIR}/ios/Media.xcassets + +) +set_source_files_properties( + ${CMAKE_CURRENT_LIST_DIR}/ios/Media.xcassets + PROPERTIES MACOSX_PACKAGE_LOCATION "Resources" +) + + add_subdirectory(ios/networkextension) + add_dependencies(${PROJECT} networkextension) + set_target_properties(${PROJECT} PROPERTIES XCODE_EMBED_APP_EXTENSIONS networkextension) + + set_property(TARGET ${PROJECT} PROPERTY XCODE_EMBED_FRAMEWORKS + "${CMAKE_CURRENT_LIST_DIR}/3rd/OpenVPNAdapter/build/Release-iphoneos/OpenVPNAdapter.framework" + ) + set_target_properties(${PROJECT} PROPERTIES XCODE_EMBED_FRAMEWORKS_CODE_SIGN_ON_COPY ON) + set_target_properties(${PROJECT} PROPERTIES XCODE_LINK_BUILD_PHASE_MODE KNOWN_LOCATION) +endif() + +if(ANDROID) + add_custom_command( + TARGET ${PROJECT} POST_BUILD + COMMAND ${CMAKE_COMMAND} -E copy + ${CMAKE_CURRENT_LIST_DIR}/android/AndroidManifest.xml + ${CMAKE_CURRENT_LIST_DIR}/android/build.gradle + ${CMAKE_CURRENT_LIST_DIR}/android/gradle/wrapper/gradle-wrapper.jar + ${CMAKE_CURRENT_LIST_DIR}/android/gradle/wrapper/gradle-wrapper.properties + ${CMAKE_CURRENT_LIST_DIR}/android/gradlew + ${CMAKE_CURRENT_LIST_DIR}/android/gradlew.bat + ${CMAKE_CURRENT_LIST_DIR}/android/gradle.properties + ${CMAKE_CURRENT_LIST_DIR}/android/res/values/libs.xml + ${CMAKE_CURRENT_LIST_DIR}/android/res/xml/fileprovider.xml + ${CMAKE_CURRENT_LIST_DIR}/android/src/org/amnezia/vpn/AuthHelper.java + ${CMAKE_CURRENT_LIST_DIR}/android/src/org/amnezia/vpn/IPCContract.kt + ${CMAKE_CURRENT_LIST_DIR}/android/src/org/amnezia/vpn/NotificationUtil.kt + ${CMAKE_CURRENT_LIST_DIR}/android/src/org/amnezia/vpn/OpenVPNThreadv3.kt + ${CMAKE_CURRENT_LIST_DIR}/android/src/org/amnezia/vpn/Prefs.kt + ${CMAKE_CURRENT_LIST_DIR}/android/src/org/amnezia/vpn/VpnLogger.kt + ${CMAKE_CURRENT_LIST_DIR}/android/src/org/amnezia/vpn/VpnService.kt + ${CMAKE_CURRENT_LIST_DIR}/android/src/org/amnezia/vpn/VpnServiceBinder.kt + ${CMAKE_CURRENT_LIST_DIR}/android/src/org/amnezia/vpn/qt/AmneziaApp.kt + ${CMAKE_CURRENT_LIST_DIR}/android/src/org/amnezia/vpn/qt/PackageManagerHelper.java + ${CMAKE_CURRENT_LIST_DIR}/android/src/org/amnezia/vpn/qt/VPNActivity.kt + ${CMAKE_CURRENT_LIST_DIR}/android/src/org/amnezia/vpn/qt/VPNApplication.java + ${CMAKE_CURRENT_LIST_DIR}/android/src/org/amnezia/vpn/qt/VPNPermissionHelper.kt + ${CMAKE_CURRENT_BINARY_DIR} + ) + + set_property(TARGET ${PROJECT} + QT_ANDROID_PACKAGE_SOURCE_DIR + ${CMAKE_CURRENT_LIST_DIR}/android + ) + + foreach(abi IN ANDROID_ABIS) + if(ANDROID_TARGET_ARCH EQUAL ${abi}) + set(LIBS ${LIBS} + ${CMAKE_CURRENT_LIST_DIR}/3rd/OpenSSL/lib/android/${abi}/libcrypto.a + ${CMAKE_CURRENT_LIST_DIR}/3rd/OpenSSL/lib/android/${abi}/libssl.a + ) + endif() + + set_property(TARGET ${PROJECT} PROPERTY QT_ANDROID_EXTRA_LIBS + ${CMAKE_CURRENT_LIST_DIR}/android/lib/wireguard/${abi}/libwg.so + ${CMAKE_CURRENT_LIST_DIR}/android/lib/wireguard/${abi}/libwg-go.so + ${CMAKE_CURRENT_LIST_DIR}/android/lib/wireguard/${abi}/libwg-quick.so + + ${CMAKE_CURRENT_LIST_DIR}/android/lib/openvpn/${abi}/libjbcrypto.so + ${CMAKE_CURRENT_LIST_DIR}/android/lib/openvpn/${abi}/libopenvpn.so + ${CMAKE_CURRENT_LIST_DIR}/android/lib/openvpn/${abi}/libopvpnutil.so + ${CMAKE_CURRENT_LIST_DIR}/android/lib/openvpn/${abi}/libovpn3.so + ${CMAKE_CURRENT_LIST_DIR}/android/lib/openvpn/${abi}/libovpnexec.so + ) + endforeach() +endif() + +target_link_libraries(${PROJECT} PRIVATE ${LIBS}) + +if(WIN32 OR (APPLE AND NOT IOS) OR (LINUX AND NOT ANDROID)) + qt_add_repc_replicas(${PROJECT} ${CMAKE_CURRENT_LIST_DIR}/../ipc/ipc_interface.rep) + qt_add_repc_replicas(${PROJECT} ${CMAKE_CURRENT_LIST_DIR}/../ipc/ipc_process_interface.rep) +endif() + +# deploy artifacts required to run the application to the debug build folder +if(WIN32) + if("${CMAKE_SIZEOF_VOID_P}" STREQUAL "8") + set(DEPLOY_ARTIFACT_PATH "windows/x64") + else() + set(DEPLOY_ARTIFACT_PATH "windows/x32") + endif() +elseif(LINUX) + set(DEPLOY_ARTIFACT_PATH "linux/client") +elseif(APPLE AND NOT IOS) + set(DEPLOY_ARTIFACT_PATH "macos") +endif() + +if(NOT IOS) +add_custom_command( + TARGET ${PROJECT} POST_BUILD + COMMAND ${CMAKE_COMMAND} -E $,copy_directory,true> + ${CMAKE_SOURCE_DIR}/deploy/data/${DEPLOY_ARTIFACT_PATH} + $ + COMMAND_EXPAND_LISTS +) +endif() diff --git a/client/client.pro b/client/client.pro index 5d76e99e..f365cbec 100644 --- a/client/client.pro +++ b/client/client.pro @@ -8,7 +8,7 @@ TEMPLATE = app IS_CI=$$(CI) !isEmpty(IS_CI){ message("Detected CI env") - CONFIG += silent ccache + CONFIG += silent #ccache } CONFIG += qtquickcompiler @@ -248,6 +248,9 @@ android { # As QAndroidBinder is not yet implemented with a public api QT+=core-private ANDROID_ABIS=ANDROID_TARGET_ARCH + + # for not changing qtkeychain sources for qt6 + QT -= androidextras } else { QT += androidextras diff --git a/client/cmake/3rdparty.cmake b/client/cmake/3rdparty.cmake new file mode 100644 index 00000000..2fcfa9d1 --- /dev/null +++ b/client/cmake/3rdparty.cmake @@ -0,0 +1,26 @@ +set(CLIENT_ROOT_DIR ${CMAKE_CURRENT_LIST_DIR}/..) + +include(${CLIENT_ROOT_DIR}/3rd/QtSsh/src/ssh/qssh.cmake) + +include(${CLIENT_ROOT_DIR}/3rd/QtSsh/src/botan/botan.cmake) +if(NOT IOS AND NOT ANDROID) + include(${CLIENT_ROOT_DIR}/3rd/SingleApplication/singleapplication.cmake) +endif() + +add_subdirectory(${CLIENT_ROOT_DIR}/3rd/SortFilterProxyModel) +set(LIBS ${LIBS} SortFilterProxyModel) + +include(${CLIENT_ROOT_DIR}/3rd/qrcodegen/qrcodegen.cmake) +include(${CLIENT_ROOT_DIR}/3rd/QSimpleCrypto/QSimpleCrypto.cmake) + +set(BUILD_WITH_QT6 ON) +set(BUILD_SHARED_LIBS OFF) +add_subdirectory(${CLIENT_ROOT_DIR}/3rd/qtkeychain) +set(LIBS ${LIBS} qt6keychain) + +include_directories( + ${CLIENT_ROOT_DIR}/3rd/QSimpleCrypto/include + ${CLIENT_ROOT_DIR}/3rd/OpenSSL/include + ${CLIENT_ROOT_DIR}/3rd/qtkeychain + ${CMAKE_CURRENT_BINARY_DIR}/3rd/qtkeychain +) diff --git a/client/cmake/golang.cmake b/client/cmake/golang.cmake new file mode 100644 index 00000000..2e16db70 --- /dev/null +++ b/client/cmake/golang.cmake @@ -0,0 +1,72 @@ +# 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/. + +## Find the absolute path to the go build tool. +find_program(GOLANG_BUILD_TOOL NAMES go REQUIRED) + +## Create a library target built from a golang c-archive. +function(add_go_library GOTARGET SOURCE) + cmake_parse_arguments(GOLANG + "" + "GOOS;GOARCH" + "CGO_CFLAGS;CGO_LDFLAGS" + ${ARGN}) + get_filename_component(SRC_NAME ${SOURCE} NAME) + get_filename_component(DIR_NAME ${SOURCE} DIRECTORY) + get_filename_component(DIR_ABSOLUTE ${DIR_NAME} ABSOLUTE) + + file(GLOB_RECURSE SRC_DEPS ${DIR_NAME}/*.go) + set(HEADER_NAME "${GOTARGET}.h") + set(ARCHIVE_NAME "${GOTARGET}${CMAKE_STATIC_LIBRARY_SUFFIX}") + + set(GOCACHE ${CMAKE_BINARY_DIR}/go-cache) + set_directory_properties(PROPERTIES ADDITIONAL_MAKE_CLEAN_FILES ${CMAKE_BINARY_DIR}/go-cache) + set(GOFLAGS -buildmode=c-archive -trimpath -v) + if(IS_DIRECTORY ${DIR_NAME}/vendor) + set(GOFLAGS ${GOFLAGS} -mod vendor) + endif() + + ## Add extras to the CGO compiler and linker flags. + execute_process(OUTPUT_VARIABLE DEFAULT_CGO_CFLAGS OUTPUT_STRIP_TRAILING_WHITESPACE COMMAND ${GOLANG_BUILD_TOOL} env CGO_CFLAGS) + execute_process(OUTPUT_VARIABLE DEFAULT_CGO_LDFLAGS OUTPUT_STRIP_TRAILING_WHITESPACE COMMAND ${GOLANG_BUILD_TOOL} env CGO_LDFLAGS) + separate_arguments(DEFAULT_CGO_CFLAGS NATIVE_COMMAND ${DEFAULT_CGO_CFLAGS}) + separate_arguments(DEFAULT_CGO_LDFLAGS NATIVE_COMMAND ${DEFAULT_CGO_LDFLAGS}) + list(PREPEND GOLANG_CGO_CFLAGS ${DEFAULT_CGO_CFLAGS}) + list(PREPEND GOLANG_CGO_LDFLAGS ${DEFAULT_CGO_LDFLAGS}) + if(NOT GOLANG_GOOS) + execute_process(OUTPUT_VARIABLE GOLANG_GOOS OUTPUT_STRIP_TRAILING_WHITESPACE COMMAND ${GOLANG_BUILD_TOOL} env GOOS) + endif() + if(NOT GOLANG_GOARCH) + execute_process(OUTPUT_VARIABLE GOLANG_GOARCH OUTPUT_STRIP_TRAILING_WHITESPACE COMMAND ${GOLANG_BUILD_TOOL} env GOARCH) + endif() + + if(APPLE AND CMAKE_OSX_SYSROOT) + execute_process(OUTPUT_VARIABLE SDKROOT OUTPUT_STRIP_TRAILING_WHITESPACE COMMAND xcrun --sdk ${CMAKE_OSX_SYSROOT} --show-sdk-path) + list(APPEND GOLANG_CGO_CFLAGS -isysroot ${SDKROOT}) + list(APPEND GOLANG_CGO_LDFLAGS -isysroot ${SDKROOT}) + endif() + + ## The actual commands that do the building. + add_custom_target(golang_${GOTARGET} + BYPRODUCTS ${ARCHIVE_NAME} ${HEADER_NAME} + WORKING_DIRECTORY ${DIR_ABSOLUTE} + SOURCES ${SRC_DEPS} ${DIR_NAME}/go.mod + COMMAND ${CMAKE_COMMAND} -E env GOCACHE=${GOCACHE} + CGO_ENABLED=1 + CGO_CFLAGS="${GOLANG_CGO_CFLAGS}" + CGO_LDFLAGS="${GOLANG_CGO_LDFLAGS}" + GOOS="${GOLANG_GOOS}" + GOARCH="${GOLANG_GOARCH}" + ${GOLANG_BUILD_TOOL} build ${GOFLAGS} -o ${CMAKE_CURRENT_BINARY_DIR}/${ARCHIVE_NAME} ${SRC_NAME} + ) + set_target_properties(golang_${GOTARGET} PROPERTIES FOLDER "Libs") + + ## Wrap up the built library as an imported target. + add_library(${GOTARGET} STATIC IMPORTED GLOBAL) + add_dependencies(${GOTARGET} golang_${GOTARGET}) + set_target_properties(${GOTARGET} PROPERTIES + INTERFACE_INCLUDE_DIRECTORIES ${CMAKE_CURRENT_BINARY_DIR} + INTERFACE_SOURCES ${CMAKE_CURRENT_BINARY_DIR}/${HEADER_NAME} + IMPORTED_LOCATION ${CMAKE_CURRENT_BINARY_DIR}/${ARCHIVE_NAME}) +endfunction(add_go_library) \ No newline at end of file diff --git a/client/cmake/osxtools.cmake b/client/cmake/osxtools.cmake new file mode 100644 index 00000000..6e595ebe --- /dev/null +++ b/client/cmake/osxtools.cmake @@ -0,0 +1,150 @@ +if(NOT APPLE) + message(FATAL_ERROR "OSX Tools are only supported on Apple targets") +endif() + +set(CLIENT_ROOT_DIR ${CMAKE_CURRENT_LIST_DIR}/..) + +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 ${CLIENT_ROOT_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 ${CLIENT_ROOT_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 diff --git a/client/ios/app/Info.plist.in b/client/ios/app/Info.plist.in new file mode 100644 index 00000000..97f88953 --- /dev/null +++ b/client/ios/app/Info.plist.in @@ -0,0 +1,85 @@ + + + + + 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. + 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 + + + + + + \ No newline at end of file diff --git a/client/ios/app/launch.png b/client/ios/app/launch.png index 33bb9d7d..050e18bf 100644 Binary files a/client/ios/app/launch.png and b/client/ios/app/launch.png differ diff --git a/client/ios/networkextension/CMakeLists.txt b/client/ios/networkextension/CMakeLists.txt new file mode 100644 index 00000000..ec59cad4 --- /dev/null +++ b/client/ios/networkextension/CMakeLists.txt @@ -0,0 +1,107 @@ +enable_language(Swift) + +set(CLIENT_ROOT_DIR ${CMAKE_CURRENT_LIST_DIR}/../..) + +add_executable(networkextension) +set_target_properties(networkextension PROPERTIES + OUTPUT_NAME "AmneziaVPNNetworkExtension" + XCODE_PRODUCT_TYPE com.apple.product-type.app-extension + BUNDLE_EXTENSION appex + MACOSX_BUNDLE ON + MACOSX_BUNDLE_INFO_PLIST ${CMAKE_CURRENT_SOURCE_DIR}/Info.plist.in + MACOSX_BUNDLE_BUNDLE_NAME "AmneziaVPNNetworkExtension" + MACOSX_BUNDLE_BUNDLE_VERSION "${BUILD_ID}" + MACOSX_BUNDLE_COPYRIGHT "MPL-2.0" + MACOSX_BUNDLE_GUI_IDENTIFIER "${BUILD_IOS_APP_IDENTIFIER}.network-extension" + MACOSX_BUNDLE_INFO_STRING "AmneziaVPNNetworkExtension" + 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}.network-extension" + 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_PRECOMPILE_BRIDGING_HEADER "NO" + XCODE_ATTRIBUTE_APPLICATION_EXTENSION_API_ONLY "YES" + XCODE_ATTRIBUTE_ENABLE_BITCODE "NO" + XCODE_ATTRIBUTE_CODE_SIGN_ENTITLEMENTS ${CMAKE_CURRENT_SOURCE_DIR}/AmneziaVPNNetworkExtension.entitlements +) + +find_library(FW_ASSETS_LIBRARY AssetsLibrary) +find_library(FW_MOBILE_CORE MobileCoreServices) +find_library(FW_UI_KIT UIKit) + +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_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/wireguard-apple/Sources) + +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/ios/iostunnel.swift + ${CLIENT_ROOT_DIR}/platforms/ios/iosglue.mm + ${CLIENT_ROOT_DIR}/platforms/ios/ioslogger.swift +) + +## 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}) + +## HACK: Build only the first architecture, this will break universal builds +## for now, but they are already broken for mobile, which uses the arch to +## determine iOS vs. simulator builds :) +if(NOT CMAKE_OSX_ARCHITECTURES) + set(OSXARCH arm64) +else() + list(GET CMAKE_OSX_ARCHITECTURES 0 OSXARCH) +endif() + +## Build the wireguard go library +## TODO: The upstream makefile also makes an attempt to patch the golang runtime +## to provide the boot-time clock instead of an uptime clock. We should probably +## make an attempt to do the same, somehow? +include(${CLIENT_ROOT_DIR}/cmake/golang.cmake) +if(OSXARCH STREQUAL "x86_64") + set(GOARCH amd64) +else() + set(GOARCH ${FIRST_OSX_ARCHITECTURE}) +endif() +add_go_library(libwg-go ${CLIENT_ROOT_DIR}/3rd/wireguard-apple/Sources/WireGuardKitGo/api-apple.go + GOOS ios + GOARCH ${GOARCH} + CGO_CFLAGS -arch ${OSXARCH} + CGO_LDFLAGS -arch ${OSXARCH} +) +target_link_libraries(networkextension PRIVATE libwg-go) \ No newline at end of file diff --git a/client/ios/networkextension/Info.plist b/client/ios/networkextension/Info.plist new file mode 100644 index 00000000..6941af53 --- /dev/null +++ b/client/ios/networkextension/Info.plist @@ -0,0 +1,52 @@ + + + + + CFBundleExecutable + $(EXECUTABLE_NAME) + + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + + CFBundleInfoDictionaryVersion + 6.0 + + CFBundleName + $(PRODUCT_NAME) + + CFBundlePackageType + $(PRODUCT_BUNDLE_PACKAGE_TYPE) + + CFBundleShortVersionString + $(MARKETING_VERSION) + + CFBundleVersion + $(CURRENT_PROJECT_VERSION) + + ITSAppUsesNonExemptEncryption + + + LSMinimumSystemVersion + $(MACOSX_DEPLOYMENT_TARGET) + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + + CFBundleDisplayName + MozillaVPNNetworkExtension + + NSExtension + + NSExtensionPointIdentifier + com.apple.networkextension.packet-tunnel + NSExtensionPrincipalClass + $(PRODUCT_MODULE_NAME).PacketTunnelProvider + + + com.wireguard.ios.app_group_id + group.$(APP_ID_IOS) + + com.wireguard.macos.app_group_id + $(DEVELOPMENT_TEAM).group.$(APP_ID_MACOS) + + \ No newline at end of file diff --git a/client/ios/networkextension/Info.plist.in b/client/ios/networkextension/Info.plist.in new file mode 100644 index 00000000..54d9d8d9 --- /dev/null +++ b/client/ios/networkextension/Info.plist.in @@ -0,0 +1,46 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + ${MACOSX_BUNDLE_EXECUTABLE_NAME} + + CFBundleIdentifier + ${MACOSX_BUNDLE_GUI_IDENTIFIER} + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + ${MACOSX_BUNDLE_BUNDLE_NAME} + CFBundlePackageType + $(PRODUCT_BUNDLE_PACKAGE_TYPE) + CFBundleShortVersionString + ${MACOSX_BUNDLE_SHORT_VERSION_STRING} + CFBundleVersion + ${MACOSX_BUNDLE_BUNDLE_VERSION} + + ITSAppUsesNonExemptEncryption + + + LSMinimumSystemVersion + ${CMAKE_OSX_DEPLOYMENT_TARGET} + + CFBundleDisplayName + ${MACOSX_BUNDLE_INFO_STRING} + + NSExtension + + NSExtensionPointIdentifier + com.apple.networkextension.packet-tunnel + NSExtensionPrincipalClass + $(PRODUCT_MODULE_NAME).PacketTunnelProvider + + + com.wireguard.ios.app_group_id + group.${BUILD_IOS_APP_IDENTIFIER} + + com.wireguard.macos.app_group_id + ${BUILD_VPN_DEVELOPMENT_TEAM}.group.${BUILD_OSX_APP_IDENTIFIER} + + \ No newline at end of file diff --git a/client/ios/networkextension/WireGuardNetworkExtension-Bridging-Header.h b/client/ios/networkextension/WireGuardNetworkExtension-Bridging-Header.h new file mode 100644 index 00000000..03a987ad --- /dev/null +++ b/client/ios/networkextension/WireGuardNetworkExtension-Bridging-Header.h @@ -0,0 +1,21 @@ +#include "wireguard-go-version.h" +#include "3rd/wireguard-apple/Sources/WireGuardKitGo/wireguard.h" +#include "3rd/wireguard-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); diff --git a/client/ios/networkextension/wireguard-go-version.h.in b/client/ios/networkextension/wireguard-go-version.h.in new file mode 100644 index 00000000..860bc3c3 --- /dev/null +++ b/client/ios/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/platforms/ios/WireGuard-Bridging-Header.h b/client/platforms/ios/WireGuard-Bridging-Header.h index 40b6c89d..e5dfa39f 100644 --- a/client/platforms/ios/WireGuard-Bridging-Header.h +++ b/client/platforms/ios/WireGuard-Bridging-Header.h @@ -2,7 +2,6 @@ * 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/WireGuardKitC/WireGuardKitC.h" #include diff --git a/client/platforms/ios/ioslogger.swift b/client/platforms/ios/ioslogger.swift index e364d365..644f7581 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/platforms/ios/iostunnel.swift b/client/platforms/ios/iostunnel.swift index 6d87a18d..1f3f452b 100644 --- a/client/platforms/ios/iostunnel.swift +++ b/client/platforms/ios/iostunnel.swift @@ -4,7 +4,6 @@ import os import Darwin import OpenVPNAdapter //import Tun2socks - enum TunnelProtoType: String { case wireguard, openvpn, shadowsocks, none } @@ -415,9 +414,7 @@ class PacketTunnelProvider: NEPacketTunnelProvider { } } } - // MARK: -- Leaf provider methods - private func prepareConfig(onInterface iface: String, fromSSConfig ssConfig: Data, andOvpnConfig ovpnConfig: Data) -> UnsafePointer? { guard let ssConfig = try? JSONSerialization.jsonObject(with: ssConfig, options: []) as? [String: Any] else { self.ssCompletion?(0, NSError(domain: Bundle.main.bundleIdentifier ?? "unknown", @@ -425,7 +422,6 @@ class PacketTunnelProvider: NEPacketTunnelProvider { userInfo: [NSLocalizedDescriptionKey: "Cannot parse json for ss in tunnel"])) return nil } - guard let remoteHost = ssConfig[Constants.ssRemoteHost] as? String, let remotePort = ssConfig[Constants.ssRemotePort] as? Int, let method = ssConfig[Constants.ssCipherKey] as? String, @@ -435,19 +431,16 @@ class PacketTunnelProvider: NEPacketTunnelProvider { userInfo: [NSLocalizedDescriptionKey: "Cannot asign profile params for ss in tunnel"])) return nil } - var insettings: [String: Any] = .init() insettings["name"] = iface insettings["address"] = "127.0.0.2" insettings["netmask"] = "255.255.255.0" insettings["gateway"] = "127.0.0.1" insettings["mtu"] = 1600 - var inbounds: [String: Any] = .init() inbounds["protocol"] = "tun" inbounds["settings"] = insettings inbounds["tag"] = "tun_in" - var outbounds: [String: Any] = .init() var outsettings: [String: Any] = .init() outsettings["address"] = remoteHost @@ -457,18 +450,13 @@ class PacketTunnelProvider: NEPacketTunnelProvider { outbounds["protocol"] = "shadowsocks" outbounds["settings"] = outsettings outbounds["tag"] = "shadowsocks_out" - var params: [String: Any] = .init() params["inbounds"] = [inbounds] params["outbounds"] = [outbounds] - wg_log(.error, message: "Config dictionary: \(params)") - guard let jsonData = try? JSONSerialization.data(withJSONObject: params, options: .prettyPrinted), let jsonString = String(data: jsonData, encoding: .utf8) else { return nil } - wg_log(.error, message: "JSON String: \(jsonString)") - var path = "" if let documentDirectory = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first { @@ -538,7 +526,6 @@ class PacketTunnelProvider: NEPacketTunnelProvider { } } - private func stopLeafRedirector(completion: @escaping () -> Void) { leafProvider?.stopTunnel { error in // TODO: handle errors @@ -571,7 +558,6 @@ class PacketTunnelProvider: NEPacketTunnelProvider { wg_log(.error, message: "Error starting ShadowSocks: \(String(describing: errorCode))") return } - // self.setupAndHandleOpenVPNOverSSConnection(withConfig: ovpnConfig) self.startAndHandleTunnelOverSS(completionHandler: completion) } @@ -735,12 +721,12 @@ class PacketTunnelProvider: NEPacketTunnelProvider { startHandler = completionHandler ovpnAdapter.connect(using: packetFlow) + +// let ifaces = Interface.allInterfaces() +// .filter { $0.family == .ipv4 } +// .map { iface in iface.name } - let ifaces = Interface.allInterfaces() - .filter { $0.family == .ipv4 } - .map { iface in iface.name } - - wg_log(.error, message: "Available TUN Interfaces: \(ifaces)") +// wg_log(.error, message: "Available TUN Interfaces: \(ifaces)") } // MARK: -- Network observing methods diff --git a/client/protocols/ios_vpnprotocol.h b/client/protocols/ios_vpnprotocol.h index 2b2971f1..7238fc36 100644 --- a/client/protocols/ios_vpnprotocol.h +++ b/client/protocols/ios_vpnprotocol.h @@ -1,9 +1,9 @@ #ifndef IOS_VPNPROTOCOL_H #define IOS_VPNPROTOCOL_H +#include "platforms/ios/json.h" #include "vpnprotocol.h" #include "protocols/protocols_defs.h" -#include "json.h" using namespace amnezia; diff --git a/client/protocols/ios_vpnprotocol.mm b/client/protocols/ios_vpnprotocol.mm index 8decd885..14b7ee9a 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/scripts/openvpn.sh b/client/scripts/openvpn.sh new file mode 100644 index 00000000..2da9e1e8 --- /dev/null +++ b/client/scripts/openvpn.sh @@ -0,0 +1,21 @@ + +XCODEBUILD="/usr/bin/xcodebuild" +WORKINGDIR=`pwd` +PATCH="/usr/bin/patch" + + cat $WORKINGDIR/3rd/OpenVPNAdapter/Configuration/Project.xcconfig > $WORKINGDIR/3rd/OpenVPNAdapter/Configuration/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-iphoneos + BUILT_PRODUCTS_DIR = $WORKINGDIR/3rd/OpenVPNAdapter/build/Release-iphoneos +EOF + + + cd 3rd/OpenVPNAdapter + if $XCODEBUILD -scheme OpenVPNAdapter -configuration Release -xcconfig Configuration/amnezia.xcconfig -sdk iphoneos -destination 'generic/platform=iOS' -project OpenVPNAdapter.xcodeproj ; then + echo "OpenVPNAdapter built successfully" + else + echo "OpenVPNAdapter build failed" + fi + cd ../../ + diff --git a/deploy/build_android.sh b/deploy/build_android.sh index 75e8c46c..e8799394 100644 --- a/deploy/build_android.sh +++ b/deploy/build_android.sh @@ -36,7 +36,6 @@ echo "Using Qt in $QT_BIN_DIR" echo "Using Android SDK in $ANDROID_SDK_ROOT" echo "Using Android NDK in $ANDROID_NDK_ROOT" - # Checking env $QT_BIN_DIR/qmake -v $ANDROID_NDK_HOME/prebuilt/linux-x86_64/bin/make -v diff --git a/deploy/build_linux.sh b/deploy/build_linux.sh index f72f1a0c..2eab7ca6 100755 --- a/deploy/build_linux.sh +++ b/deploy/build_linux.sh @@ -47,16 +47,15 @@ echo "Using Qt in $QT_BIN_DIR" # Checking env -$QT_BIN_DIR/qmake -v -make -v +$QT_BIN_DIR/qt-cmake --version gcc -v # Build App echo "Building App..." cd $BUILD_DIR -$QT_BIN_DIR/qmake $PROJECT_DIR/AmneziaVPN.pro 'CONFIG+=release CONFIG+=x86_64' -make +$QT_BIN_DIR/qt-cmake -S $PROJECT_DIR +cmake --build . --config release # Build and run tests here diff --git a/deploy/build_macos.sh b/deploy/build_macos.sh index fa955215..869a1ccc 100755 --- a/deploy/build_macos.sh +++ b/deploy/build_macos.sh @@ -49,16 +49,18 @@ echo "Using QIF in $QIF_BIN_DIR" # Checking env -$QT_BIN_DIR/qmake -v -make -v +$QT_BIN_DIR/qt-cmake --version +cmake --version clang -v # Build App echo "Building App..." cd $BUILD_DIR -$QT_BIN_DIR/qmake $PROJECT_DIR/AmneziaVPN.pro 'CONFIG+=release CONFIG+=x86_64' -make -j `sysctl -n hw.ncpu` +$QT_BIN_DIR/qt-cmake -S $PROJECT_DIR -B $BUILD_DIR +cmake --build . --config release +# $QT_BIN_DIR/qmake $PROJECT_DIR/AmneziaVPN.pro 'CONFIG+=release CONFIG+=x86_64' +# make -j `sysctl -n hw.ncpu` # Build and run tests here diff --git a/deploy/build_windows.bat b/deploy/build_windows.bat index b58c4286..8384d210 100644 --- a/deploy/build_windows.bat +++ b/deploy/build_windows.bat @@ -25,21 +25,18 @@ set RELEASE_DIR=%WORK_DIR:"=% set OUT_APP_DIR=%RELEASE_DIR:"=%\client\release set DEPLOY_DATA_DIR=%SCRIPT_DIR:"=%\data\windows\x%BUILD_ARCH:"=% set INSTALLER_DATA_DIR=%RELEASE_DIR:"=%\installer\packages\%APP_DOMAIN:"=%\data -set PRO_FILE_PATH=%PROJECT_DIR:"=%\%APP_NAME:"=%.pro -set QMAKE_STASH_FILE=%PROJECT_DIR:"=%\.qmake_stash set TARGET_FILENAME=%PROJECT_DIR:"=%\%APP_NAME:"=%_x%BUILD_ARCH:"=%.exe echo "Environment:" -echo "APP_FILENAME: %APP_FILENAME%" -echo "PROJECT_DIR: %PROJECT_DIR%" -echo "SCRIPT_DIR: %SCRIPT_DIR%" -echo "RELEASE_DIR: %RELEASE_DIR%" -echo "OUT_APP_DIR: %OUT_APP_DIR%" -echo "DEPLOY_DATA_DIR: %DEPLOY_DATA_DIR%" -echo "INSTALLER_DATA_DIR: %INSTALLER_DATA_DIR%" -echo "PRO_FILE_PATH: %PRO_FILE_PATH%" -echo "QMAKE_STASH_FILE: %QMAKE_STASH_FILE%" -echo "TARGET_FILENAME: %TARGET_FILENAME%" +echo "APP_FILENAME: %APP_FILENAME%" +echo "PROJECT_DIR: %PROJECT_DIR%" +echo "SCRIPT_DIR: %SCRIPT_DIR%" +echo "RELEASE_DIR: %RELEASE_DIR%" +echo "OUT_APP_DIR: %OUT_APP_DIR%" +echo "DEPLOY_DATA_DIR: %DEPLOY_DATA_DIR%" +echo "INSTALLER_DATA_DIR: %INSTALLER_DATA_DIR%" +echo "QMAKE_STASH_FILE: %QMAKE_STASH_FILE%" +echo "TARGET_FILENAME: %TARGET_FILENAME%" rem Signing staff powershell Set-ExecutionPolicy -ExecutionPolicy Unrestricted -Scope LocalMachine @@ -49,22 +46,20 @@ powershell Import-PfxCertificate -FilePath %SCRIPT_DIR:"=%\PrivacyTechWindowsCer echo "Cleanup..." Rmdir /Q /S %RELEASE_DIR% -Del %QMAKE_STASH_FILE% Del %TARGET_FILENAME% -"%QT_BIN_DIR:"=%\qmake" -v +call "%QT_BIN_DIR:"=%\qt-cmake" --version "%QT_BIN_DIR:"=%\windeployqt" -v -nmake /? +cmake --version cd %PROJECT_DIR% -"%QT_BIN_DIR:"=%\qmake" -spec win32-msvc -o "%WORK_DIR:"=%\Makefile" +call "%QT_BIN_DIR:"=%\qt-cmake" . -B %WORK_DIR% cd %WORK_DIR% -set CL=/MP -nmake /A /NOLOGO +cmake --build . --config release if %errorlevel% neq 0 exit /b %errorlevel% -nmake clean +cmake --build . --target clean rem if not exist "%OUT_APP_DIR:"=%\%APP_FILENAME:"=%" break echo "Deploying..." diff --git a/service/CMakeLists.txt b/service/CMakeLists.txt new file mode 100644 index 00000000..abde0c70 --- /dev/null +++ b/service/CMakeLists.txt @@ -0,0 +1,19 @@ +cmake_minimum_required(VERSION 3.23.0 FATAL_ERROR) + +set(PROJECT service) +project(${PROJECT}) + +set(CMAKE_CXX_STANDARD 20) +set(CMAKE_CXX_STANDARD_REQUIRED ON) + +if(NOT IOS AND NOT ANDROID) + #include(common.cmake) +#if (qtservice-uselib) +# add_subdirectory(buildlib) +#endif() + add_subdirectory(server) +endif() + +if(WIN32) + add_subdirectory(wireguard-service) +endif() \ No newline at end of file diff --git a/service/common.cmake b/service/common.cmake new file mode 100644 index 00000000..2d497e05 --- /dev/null +++ b/service/common.cmake @@ -0,0 +1,18 @@ +set(QTSERVICE_LIBNAME QtSolutions_Service-head) +if(CMAKE_BUILD_TYPE STREQUAL "Debug") + if(APPLE) + set(QTSERVICE_LIBNAME ${QTSERVICE_LIBNAME}_debug) + elseif(WIN32) + set(QTSERVICE_LIBNAME ${QTSERVICE_LIBNAME}_d) + endif() +endif() + +set(QTSERVICE_LIBDIR ${CMAKE_CURRENT_LIST_DIR}/lib) + +if(UNIX) + if(qtservice-uselib) + if(NOT qtservice-buildlib) + set(CMAKE_INSTALL_RPATH ${CMAKE_INSTALL_RPATH} ${QTSERVICE_LIBDIR}) + endif() + endif() +endif() diff --git a/service/server/CMakeLists.txt b/service/server/CMakeLists.txt new file mode 100644 index 00000000..31ee3372 --- /dev/null +++ b/service/server/CMakeLists.txt @@ -0,0 +1,110 @@ +cmake_minimum_required(VERSION 3.23.0 FATAL_ERROR) + +set(PROJECT AmneziaVPN-service) +project(${PROJECT}) + +set(CMAKE_CXX_STANDARD 20) +set(CMAKE_CXX_STANDARD_REQUIRED ON) + +find_package(Qt6 REQUIRED COMPONENTS Core Network RemoteObjects Core5Compat) +qt_standard_project_setup() + +set(HEADERS + ${CMAKE_CURRENT_LIST_DIR}/../../client/utilities.h + ${CMAKE_CURRENT_LIST_DIR}/../../ipc/ipc.h + ${CMAKE_CURRENT_LIST_DIR}/../../ipc/ipcserver.h + ${CMAKE_CURRENT_LIST_DIR}/../../ipc/ipcserverprocess.h + ${CMAKE_CURRENT_LIST_DIR}/localserver.h + ${CMAKE_CURRENT_LIST_DIR}/log.h + ${CMAKE_CURRENT_LIST_DIR}/router.h + ${CMAKE_CURRENT_LIST_DIR}/systemservice.h +) + +set(SOURCES + ${CMAKE_CURRENT_LIST_DIR}/../../client/utilities.cpp + ${CMAKE_CURRENT_LIST_DIR}/../../ipc/ipcserver.cpp + ${CMAKE_CURRENT_LIST_DIR}/../../ipc/ipcserverprocess.cpp + ${CMAKE_CURRENT_LIST_DIR}/localserver.cpp + ${CMAKE_CURRENT_LIST_DIR}/log.cpp + ${CMAKE_CURRENT_LIST_DIR}/main.cpp + ${CMAKE_CURRENT_LIST_DIR}/router.cpp + ${CMAKE_CURRENT_LIST_DIR}/systemservice.cpp +) + +if(WIN32) + set(HEADERS ${HEADERS} + ${CMAKE_CURRENT_LIST_DIR}/tapcontroller_win.h + ${CMAKE_CURRENT_LIST_DIR}/router_win.h + ) + + set(SOURCES ${SOURCES} + ${CMAKE_CURRENT_LIST_DIR}/tapcontroller_win.cpp + ${CMAKE_CURRENT_LIST_DIR}/router_win.cpp + ) + + set(LIBS + user32 + rasapi32 + shlwapi + iphlpapi + ws2_32 + iphlpapi + gdi32 + Advapi32 + Kernel32 + ) + + add_compile_definitions(_WINSOCKAPI_) +endif() + +if(APPLE) + set(HEADERS ${HEADERS} + ${CMAKE_CURRENT_LIST_DIR}/helper_route_mac.h + ${CMAKE_CURRENT_LIST_DIR}/router_mac.h + ) + + set(SOURCES ${SOURCES} + ${CMAKE_CURRENT_LIST_DIR}/helper_route_mac.c + ${CMAKE_CURRENT_LIST_DIR}/router_mac.cpp + ) +endif() + +if(LINUX) + set(HEADERS ${HEADERS} + ${CMAKE_CURRENT_LIST_DIR}/router_linux.h + ) + + set(SOURCES ${SOURCES} + ${CMAKE_CURRENT_LIST_DIR}/router_linux.cpp + ) +endif() + +include(${CMAKE_CURRENT_LIST_DIR}/../src/qtservice.cmake) + +include_directories( + ${CMAKE_CURRENT_LIST_DIR}/../../client + ${CMAKE_CURRENT_LIST_DIR}/../../ipc + ${CMAKE_CURRENT_LIST_DIR} + ${CMAKE_CURRENT_BINARY_DIR} +) + +add_executable(${PROJECT} ${SOURCES} ${HEADERS}) +target_link_libraries(${PROJECT} PRIVATE Qt6::Core Qt6::Network Qt6::RemoteObjects Qt6::Core5Compat ${LIBS}) + +qt_add_repc_sources(${PROJECT} ${CMAKE_CURRENT_LIST_DIR}/../../ipc/ipc_interface.rep) +if(NOT IOS) + qt_add_repc_sources(${PROJECT} ${CMAKE_CURRENT_LIST_DIR}/../../ipc/ipc_process_interface.rep) +endif() + +# deploy artifacts required to run the application to the debug build folder +if(LINUX) + set(DEPLOY_ARTIFACT_PATH "linux/service") +endif() + +add_custom_command( + TARGET ${PROJECT} POST_BUILD + COMMAND ${CMAKE_COMMAND} -E $,copy_directory,true> + ${CMAKE_SOURCE_DIR}/deploy/data/${DEPLOY_ARTIFACT_PATH} + $ + COMMAND_EXPAND_LISTS +) \ No newline at end of file diff --git a/service/src/qtservice.cmake b/service/src/qtservice.cmake new file mode 100644 index 00000000..4a429fab --- /dev/null +++ b/service/src/qtservice.cmake @@ -0,0 +1,37 @@ +include_directories(${CMAKE_CURRENT_LIST_DIR}) + +#include(${CMAKE_CURRENT_LIST_DIR}/../common.cmake) + +if(NOT WIN32) + set(LIBS ${LIBS} Qt6::Network) +elseif(WIN32) + set(LIBS ${LIBS} user32) +endif() + +set(HEADERS ${HEADERS} + ${CMAKE_CURRENT_LIST_DIR}/qtservice.h + ${CMAKE_CURRENT_LIST_DIR}/qtservice_p.h +) + +set(SOURCES ${SOURCES} + ${CMAKE_CURRENT_LIST_DIR}/qtservice.cpp +) + +if(UNIX) + set(HEADERS ${HEADERS} + ${CMAKE_CURRENT_LIST_DIR}/qtunixsocket.h + ${CMAKE_CURRENT_LIST_DIR}/qtunixserversocket.h + ) + + set(SOURCES ${SOURCES} + ${CMAKE_CURRENT_LIST_DIR}/qtservice_unix.cpp + ${CMAKE_CURRENT_LIST_DIR}/qtunixsocket.cpp + ${CMAKE_CURRENT_LIST_DIR}/qtunixserversocket.cpp + ) +endif() + +if(WIN32) + set(SOURCES ${SOURCES} + ${CMAKE_CURRENT_LIST_DIR}/qtservice_win.cpp + ) +endif() diff --git a/service/wireguard-service/CMakeLists.txt b/service/wireguard-service/CMakeLists.txt new file mode 100644 index 00000000..6e064f71 --- /dev/null +++ b/service/wireguard-service/CMakeLists.txt @@ -0,0 +1,34 @@ +cmake_minimum_required(VERSION 3.23.0 FATAL_ERROR) + +set(PROJECT wireguard-service) +project(${PROJECT} LANGUAGES CXX) + +set(CMAKE_CXX_STANDARD 20) +set(CMAKE_CXX_STANDARD_REQUIRED ON) + +find_package(Qt6 REQUIRED COMPONENTS Core) +qt_standard_project_setup() + +set(SOURCES + ${CMAKE_CURRENT_LIST_DIR}/main.cpp + ${CMAKE_CURRENT_LIST_DIR}/wireguardtunnelservice.cpp +) + +set(HEADERS + ${CMAKE_CURRENT_LIST_DIR}/wireguardtunnelservice.h +) + +set(LIBS + user32 + rasapi32 + shlwapi + iphlpapi + ws2_32 + iphlpapi + gdi32 + Advapi32 + Kernel32 +) + +add_executable(${PROJECT} ${SOURCES} ${HEADERS}) +target_link_libraries(${PROJECT} PRIVATE Qt6::Core ${LIBS})