From d0b85813c761e9fec827e06bb5194aec7d3cd4f7 Mon Sep 17 00:00:00 2001 From: Macbook Date: Sun, 13 Oct 2024 17:06:56 +0700 Subject: [PATCH] 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 zI0%S>f?ffU#lIqpB8#Xf_o7^{s0gwt>s4{N3W|b?h{FG*oo^W!;oj%@U#~uY=Xt(q z^X5(7?VR(T-|w8a$d+t*)#{_SrnbJY$ILFXS8T~r$d)WVJ2Mm54OzWvXWyPHW)InU zCuGYpzh0^~bH$cpezWUw&hjq`wP8xN9)<+EWB(U9@wbb>UwBq`u6R*1Es2=*vGF~y{V~< zkB8=HA}3qgCck$HrG2{xojo44TAFLf2$TZRW02r6 zk%+X(Ke@H7PX$x9Ywe!(nhq?ECts}m<)-O=1=dJo!>f%dkvf0=C3sXgCL(TN& z8HcHcLBkYi{l&TqLs`8E`XwLF&~y?Za2(4TI_l6Es?%(>OC;+CMJPEVQ0r#PQCcc+ zE}FyiX1CrnsDy)HDBDk>1QuX;)?sy#D6=d<5H_Zyu)b8pD%DWBFQwFuMDaRDm4lKn z8Y)zIOefQ3l}aMAkQgXqjF2j6_%3zC;Ixb;lL3{g4;9Nqv=W(R&?bcjcoKIUoO78G z>7pE_=gJt`X7FaxQK*qgljcAihex=JrlK~sB^qG}e#{Ug!Zb)EXSThv zz;Lipb~ApSdr>gD-ooVn5m{{Jwu2=w%K;`1RG&YvcqtUL$Z^3%Mxfu%mvCB#?`}| zS)JaX-$Pk#y!dwJJAs3;OoGAwDgKBUzl!B%S^H(S@n#o=sIaIC_>@I zE>)zfA%Z1gy?7K2(-`5P-u(>PhP7siLcZ0jx9~!+)R((DJY9D(@gy~L*_4Z$AtEoL zS*nt>YR!5rTdx%e9YZUDh@FTDzLAyJsCJ%Cb5SdRWW0illswm5~vYuTjB( zuWY5l9m1{Y1yc-Ul^&mHwH2Y{mz0o2gwx#smk>iyR;v$5GB!$&Dsi!nck{dwu}IUG z<6YcGW$QgH6>ZhHzK`}Ld6qMRN_1Gz{JD4si;wM5s8i1fT$S!5@)#nP!)1J6HP8?x z7SlwdQLPuVCgs%YxM_?!xzM1Qi#6T!(CSsJF-tJLp{tA8wBmqW5}Sl2mQiKc>vv;T z7bI3`qou6Y!Xi%DMf7%~G**z7?5Zuw9dO;0&?J97kxZdFgP|zZ&~-Wt z`i18Rl=0*;#X)&3PNEGI3gVtztF*(43?`#VwB>U!f%VCWCf=cogQD0LopB|W(Z);) zrEt7Y!5Stphr}?7b;Jg0W4hkMbTWytii5Vrx}4$=g=i16!JMhII5%re^&@NLhSg#s zqz1XM76c$)s1pnO>s`%h!3m5oU7oG`c#)AjcO2?mJz6%t*9X>m2NRE zion>giJWqXj=}e23CB^6^yF*FRs?fRjD@mV+|d5L;{7|VmK zkU}O{N7NMNdULOa)X=NeZToo;mf6Q*+(~+Nf-FjDui^-4CZGMpA;v}9YNm_eHybfaZaRP7KpZj8fLAZ+Bvn%xqH7LpPB#SC2= z4V_-F7!xuKGVW7>k{hG*kyKIUbF^;|M&gma+)g(5vEy@0+oFPwSR(jPGMlX>#-(Jv z8dC90C6Ef~DAVt?m3T3miLnEr+@nmgiw{F8+i=Tts3MX4ph_e%y=26%q@+-E6eg28 z(dsI_Y-<3zokOrOV%JCniw8@7D>cZ6JE54BEMd_RHH;C$u#@BR@lFU&q*RvR8X6kY zWeH6*jhGXWIo4NdNCQ>{$(8kS5TWc!tLICDpil>b_nA z9hb)#E()fhR@!=oR02geO_oY5?CtvB%DztLu%w3LCShQ(YesD@s%RCOBD9>{Vl-yvBU0XSBjJ&o_DjQ>o|a+0 z!@g`&?6%NC-fwpOsx-(X>Q>Gmvze7Q%lkA3}b za$nC35!g1}Qn1)0jbS0D#H}ulCj+Bl{jasJQ@j(^F`r&`V@ZFPG-(s@8-m!z>ukat zk4s_=%_{-TsCV*&F+>}JilvI7ZY<9fLKf7?XIp8(>a`lWEo1#?*|k*OF8kD87>^G} z6dxmp<9;wduJl^XTs%}HY!oM)V2W+WGr@pKbyIn(KEQQjoaf|5OOcIg%FKs*AzV(= zWANoFb%xCsS{UBTciBKTQg<`mEYZ@Xbd67hYFWg{Do8aD5fzqkD@3m2G{S6XltAJX zQ}MM%y;!H*Ng-CIV-ymjTmq}|R?O*Rti*^)(~eY!LTEG;?Mg)q1{l}J1ZhRf8S${A zg|!k=j&yxiJ(CXx3&Uc%63NLhbTQs5#oZpBi4mi`kr@Zvnih=aYn5Kx*UfYt{V(k6 z4G*t(7x6loALgz85VwbH+pYG8!-$z|HvXRRdUKpBk#3GqMoV~oS=j`y>wgKahl_zU z&NOmd8L5|;lIY~nZTtitSl}mKgV)Q+G*&V&p~#nc;2`ov9Bm6FCd8OIsZ4N{65d?K zJ@gse)I(+7!}E1YAp0YlK(z&4A{oHOGT?s?AC#$bL#84_;09W+nmP~c}!wvEGg3@xOpZG<0imfbL-L^g`* ziXIA3>1@s4*6W;Hj#^3UXOnZa5a|j^Be!QZ?^)(}h|$mTHE(J<(UF zNs$0(w2+c=`9|ChB0{yN>J(n@mwK^UHXxmNZ0zE80{$NG91Q|q(oo_g99hCfa6^huN%ol%q<4XfN7b5Siu~?sDOnNb{1Ux z3DzD*no@;!7glAF$7}+rfe#f;xYv5Ve^Tcriv&D z-^(6`Cq3NGF7ZXcR3*_8j`>|2bGE~(w4+x=Fs8X8@Od4;z70TV!>ZxoY|{n&yc`Du z4o^n_dk+A&J0kFW9)4Fsxd3ovP&e6tF*_>UpW=SN+Em?~;C3Ml*xs85z|#Woh(*lx z>Pdk6B^*P57qC6dUj_UQ^91GQ0-rdP3@o4o`TlGAl7fE1`z9R1Zh&xlh5M{A)y`!~=Y`cIa z<8-6M!UWL-o$qx}KIt<;ZW6;I_()aVy4WlC;!ZZ;sPSr{QelHx|G>5)hLQ*d?562& zpk-SpVm(rC+G>Jn4??)A(F3+)`W!xpRE>O&sd8AIt*7}MP-8BJBuUPtRknz;1+rNc zOjfL?<9fNJ3)CS|PmUf8OU$w6%naYTYF?oZRGi5uME{@xU4)J%ruY(OD15Al@mhgIWv22Rh z|3BT=vke~|7^nDbFq=-b3hk0^_DUFe zn5o4zKhvor$mkA|J5qXrKQp?d!ObD~~&Vr$Dm#YO_Iw`y7?2#FAJg9Lf?VNBI=Fm!(oeESHF~ z(GYGWYbIA08!bE8PzIQ-4E1Jk3=SR9R1yuN8pdIp%a(AaHuU=feUYlA{MvvE#ar!Y zt%+uw77B2jGUbx5RCR=*6LL(y&x#IPE}0Lf3dy+Hw>$Va(E&)#^9?JG;&LGxkB-rj zJ=7xL8H5V4T5W8ykz}6_h#6f^(q<<+j*)615vCYzl*whR*gz5-s}@0kL+NB9Pf_`sK|W6f?;cDq#>bBaEGoQd)NT)D0FlC@4Th_=gZMsU$=zHZ@i zx0Dk@>1ZWUkQD$_#<*ycM6WllSA~#l`pKXk&Kj5+!4!URU*EKlG_Wo5PmtU^>19}G z>O7=D)C_aGfK5wJT5uk#%X*%Bl@0{p*kr#4AOxSu;uQzo}Vj1x2NQlG$8$d02 z?-1=xp)!;u!{Fg_G9%Jtxq&hSstVvayI$lSp2Hv(2`Cn#RYIAsBBPFK0SeNSHiMB2 zp2YeP$+94dZ!;(l!Q@0qfQS!)M$$^44iQ1lEO`+-K{dT7IYfgh1ZsNdI?a(0m>1rQ z&f8V19EHf9z>{H!L;-*arNJBaB4iN~KFy?qjB^C(fJZROHBdnPWf`LO42Yj83V}34 zDhE?99U_*f^J>%$h|I}zmAWHW(o-+K$-yT-jqsPy5xh6Z5Oe?*)}eK$!l%+hh|={X zp6fsqa4ZXH$TomzpUFiOif1rnlrHfm&p}oL?Km``_j;9|j^_F+1WHHh>K_o?i z^ALoG1Wd)m#u8*YXb=s4O~fB}7%W*X7kQRR6RO1oC6j4j&1?zvVzG9P$Tjmg5@B3r zlod$G1|UNWAz68Wg*iiQ0_E~BUnYTmlMrgjRMTT1;aAR3Vpu3ntnHh77UU7VeLBGiEducHK_6 zSIzbbp-*as2wv%Vc_~BN!hL+E1&JVCKZm<^#zlCcK2%$(rIpEWFjw;7B$rGnB%MMk z&5R}@T&roPedCIe9p-##0j!o#Y)ecx0#+_8_|O(w#&Ap=1z2HFb&MhtMP$kBmS{Vt z^qtZm+#DOQ#Mw+Ip6xq12(#j7l?TUnBFjj1Arc&da+v|WrT~>w3Ip>ti9i<@Bkz+4 z{1QS9KsL>iJ`i|vyR4C{l^9E7PgbYvoqd)5rBSCgVHFm$0ytBJ$a^(}nTio=v*kV5uQ8o(0{g!gGod@MII@&+CUHK(xOh2g^vd!Ud|(Mit-gKG=u| zWF<`BO`xMDMDA?`>VxbIq!7bkl}W}?1Tub@^du8vaejeSnP%+(yD|W|N7Nvo^dLMp zjsz7d?4kM&g96(pB>TYNg|ZdNsW#9Nf#PZ!dCQ`{x)d);87($FKh0;T{g1NxlGemMbmT`~)S|4a{ke4*! zF*jowEUy=p*TGY-0g~;Pvu0_+C_vP{kuN}27V2UxhU+`jlyM{oEWN;j7OTMoLPJo8 z#u44iu1Yshi1K^cRedJKFJxD3$LdV78`x!x#y; z@6l17AYol38Oq#zY5OvUQbv@EO4I%@47rf)l}rz-Ay#J*QqLB#6yuT>g9Fns%@R}D zDTAhOZ$H4U85pKkxHiaZ2eL<&vAOLx&Lm5TfFs0|$IiM91awwRX2K+i;xr-ZC~4)J zL&%LBck;m!-O6C($W_U7Wi*m=c|~>jq}|L%WO$~fHnl(^pU>rEDY6)-`T3gNNE;QU z)u|_KuxW8l(20bQ)R|6=FJwt1#f@@-U`MN%!T6|>M|!PFU(Y9uNI3^)U1p;^+a9$M z$RmOcemQeAh!I-5th+|K+cY{YZP*L-dWl{(o#{Kol*uejnIj%@!aRLP^V8?!6IRG` z4`7_rjFRcNAuEI-WMD!imL8#Wq2nm5P^ov+93;rZG(S>B!zkArghR13MJjy3uSwBH zhO*>%3`Y}1B_S0kHCyk7qU}bKr6F5R&X7!xCseNBiUFd~D`vzf?^XvnJ6P9366UA* zaW!I4X(Z3~D?;4nx~SWx&_b)-quX9~RRmZQ)Cw*{Lukec4Sd-IBje#$_uY|PvdUo7 zj6z73DK5wgZzYB*juC7TwP_NV(xT|3r%{6}Bsng~^c!U>LdGFEl|#_?g?AT$CCxUL zG8q@L^ip*t$CMO@X+V6+`*Ufa*`dq@rWdjrz)67FMjfGnjhFQY^mnm8C9RSJ+llDV z27IdHh3q3wH^8s@pVy0I(;=Ph^n%`|BLvDS1Pi)>S%YTTN+eq28s|3Te6wx~ZkY{A zWG`(}hUDuv_1YjC5KzAowt78^SBBX^Jk~)e1m$vME!nnuGOlEbLMEb#R250Yg>D{8 z!2XmV(85G!w`JC0C9sE(3H6%ny6nISb(10!HslW7l|sE}A{zC}<8iUakm3?6?`78! zZ6^=D$}(2gK}E5#j^92`L90V35gd z2JNy>BR%^Q!kvZ7=MDLzT+ay{tVzAboI9C+{M3R=_YW%Ej7Yqs}*rc$#vn z(E?>~u^h^D<(%i<7adbOSq5?BNYrJW=@?lk)H(6r26C*p@> zIF=BE@qo8Eeblyt;Vi7qkWAO|xEu}+M&Xb%8sTcR6ON|+vK>MjAnjvfl&Sf>fa@Tm z)SHEh6yxPm5j7IQp@kaFTB@9HRTMj)r81qWZ=|;r;CRaE0udkgAmX4iDNoOPi+f#N z=@rE$Int9u_f>n{-?FYOW+Ri}50gQNZZ5E(pzHKF=T6H!7PQnLy9};RYzf$@dO4ty zya9Qho?le){HjQ&YAO06o+)A_Sx^U_ANJqdk1@%M7+_~x`t^;+@9h|8b~IvmPjXV{N6^EEap z<48N8V-U(q4g_u7F)@F^2sMk49h)q8J`DImZ=4;Q>ZAq@Ba9JTf9nt&Hu9g1|jO?WqE^rF{cq0$Zn1<3lDy@yf8Do4_GJ#K>AWVF3Ov!T!(tx(-cO zGKiJN7!j++C((V8mS|Mq2@Itnx(@+;tqEb~<(yBG0H1krt|weh300P#yuew0M2x^s zXs{yymB4X`;4kn2p@DX{t5;%2sS;Y9oCFYXs)!~{6xI#0$k8_2Uet5X&tveV^@TRm z7(p6EAYPkA%ZT0D3JrWVCe9X4~l{ zs0>NDke2Hm9fE^U+m1x33x{+z>TsxOUV%ro-ohcB)tl_zU~-`64WDjlw$tu4;Uv_? zZC|yKt+l*kT}y9UJo5wH*mgz=4ra}FdhOBJ`+sPtUgL|$r@ZcNyHMKDv6ej#d?j@7 z4JvnJrK#ET5T9yk<{Q*iTm5MVcHFLayRX?c3=F1pM?LFlraWGLYmssFru+5heA%oG zJ1tleF z1_GtjWurAOD~i_d&+EPRptC4{t2gan)t9w(^nYtCOX6y4vh`mZ&Qb%QCjRAz`N&bn z=>6q0bdlFTL${+-fIFVKIZJL0WOEKge9E^k%F#p{frcL%o~CFjoS8FV5*HR{Y3>&E zAQBA&;T8(ahp|qUxbXu=HtmoI2uDk$v~J~8t{_-go8nZ3J!2><?I){bSX!x_HHJ%J3j<7puJw)&MI)R13m4l=BG1#rVt=>2DOL+Xej}pJ zBheVlMM#a$C%~bcm!q;AL!z~W8iW^Z-)wn$M0N313(W+UwYVT$oBWe=q{m;eWzSC` zTUPSOmKDccv0`>+c6PsGPuslaR}aiy`O{|}`^Y2Ty#8&M{l>Tm*<$-vsbv=zK2Zv8S2J%^*n;Ro&!L;}G;G>{0zBT?zVJwo0kGW{nZg8+eGlP7mS zcKW2y?wP6s_G1oYbb79Hjsw%@9c%5+{iXK3Bfwricb}yqizC^6`AD|an2Z(KGP8d9 zY|QMu(~2!KYvJ(l%$nIPGc!AV{G>E9oI%O4MX;kO?@{CIWm+9l7P ze8+X+uUxy~h}Of0Uv$KKHrRLWxtDzHCMA7Z`l)XW9=`Xhm+hK*cjJq1|J>cRKY!!g z1HOCH%1v9owAuX8D{FdBU;py4?bIEYpSL%2@u@ex`vU*$p}9ZNcYLpXYyOVW*B^cI zrhD#wq_+35($80u{c{Qr=6+P)`Lss|mt|%?^XOCeS~l}!@xF%+iElaPzK=b1(%awt zxifz8_P6f#(kcJ6b)T1hUCpohS@yf@9=wn`oyN)es=4hpV=&|J@E2( z_|AUo?Jvx(nAvIO>NB22&Ugmd2PXEgeP?D~S-C5+3O;6Mc0$&9Wk;?&2svQ$e!lw* z>Z0N5mw($lf8zy2b3Xvr#MuT^U%=gAdy)$Gj5Sx|}X zH3Vd0W+&;c$W@R0bj{`5RXc52@7&Y#U-07k&+d2Bx367;o$|r2er0gj)7fwC|C7_2 zC+v0dODB@{9=~=^eeZ?ec~UtKJLmp`{sX)>BYDKEaj-rPHR{G;-{U%vgUFUF$vs}5)8}jU|6o68kU*a z<#V+2U(bqoG8Bvi17RdIu_6&9h(MOzcIV~10Pr+5D4$>X!; zpN?K7Wcg>#JNTR@U(A@l+vU3T$n1X}bo?I*s~CGl za{tW!;$b&m^uq5iyZqk5m+q_-^bhQM%iIg!x_-l4yYu;X%pmW(4ZnBo$Buj6N5Acm zZ@m1STfeyHBPSpF@VAb;^_UxeyLQi=KDgWGjyPbW{m`a89;+U3-PPR>QbqpG&-&4u z|M1dNoqK+Ib(TDBUA9^HFnZ2ic6GPC&P2}+oqNXTkjgXC%HaFzH-F%;C$;`7`pMdt z>F*Ce9@M3b=cg> zEi=19i!0%8r)}GtqV7C{obeoT^n%TqojKre&v5i#^CJxtW24A^Z##gE4#C*Lo`qAwC=(b?_BquGvD*3j~++Gp8NEr zC%k{dgP*%#pYPxC+y14$x?f%Ut#Lm5{i}|Dar8>_8@oJnYU0fEigORd@A}-oT#{eY ze8u-C@l!jm{-*;^DDQo^{lIPK9eFHu^+WA9|LE!O-q!h#wd4=q`pw^1qhJ2))&mc` z=JC_kN4|N~LyxR|xcT5!Z$5JG7p}bi1N}2j`TCnqT^uMn??DNcJCoA8`Y(B7X?YR#<`r|*{w|bY@jf24v z$d;YY0~6Mtny?`kCK4qRy^uOefcy3Y{@!X^^ct;6vlY((1 z6o?{$KnQ+Q1L5GeLpFfCuUxVFQH-q2<%@HbxkYy#Fr#LE7{PBcF9PZ#bj?Z4$#JvBK`O8~B{S5c;*Z4O- zzCLmBA-A21fA3TGoxAnUt7n*Xr(Ev7{lZ6X`cQ0mRb%U2KmK=hwM||!_etiWeJ=Ur zzH6U|uDbBFv;Ta;M=t&O7tK9Cdg&LEzd!7RgUX84q^_?f*{;T_6Ahm;%ng|Jqjzl9mrSK5FF+Io@m6r%%C{rn zPF?}-#&_Oxos7;cPH1q@FVKz6&IZPUF0S4aO9QevEiV+{T{c=W@PQ+bg$g) zFL{$IK73*ZyJi2)&mwz#^~_-C-ZkI4`{=l zro?-H|Nf&cF>n9cFW!62OUaAzRqf5^-}Uu3AxA&(V?_Ay1NR@aFaNXg-X|S#MdYrl z!asI4-1w0n>|I*_=&z&Sk=|3@y87bZJfHaXiIe2u6#@Hfx;(u z-SaCyH$MA-__1F;HG1*VCvRGN?+uP}ToamM4wL5o0n^@_l5ix<1hAcrnqtll}W*0b6Hu+dhsrHp~z8#6*bcI0g_QxAmXvo`_Dun}wB8M#d@v1AA;Sa#12)9&qZGc2@ zWX-Bwr@w%;ViypN|VVA)LyME%?Pv3H%ez>sqeLK&db@cT&pQUK{haUgZd!N7S#`WL)tpEAvK6%W` zU;m0^torC#e{e2*>f*f)ICQ__J662oU!VENhxSU|{fURl2R?CHA$r7t*M7cm_nD6! z^CYwB!A*Zyf6v?_-97(+oEhFQd)?VPt+-p(_kR4@YlzQR_B`|5D?hV&-4FgCoO=C1 zr5E4+v5yg-Ka>6AoyQ$~`ieW>^Fw+?y1R1k^KYmVC!KFT`!6r+l}+WVzjhgloqSvP z7ghLyn;+iz^EK~(?1YQ*!Mi{8#FsbRar|YSTW&h?Ptw=#JpJ9;pLW5|dE&{3W=?uI my5`p(c>3%IZ{PX)iywNb{Lud24}5mFf4lw%FPugF^#1}#MV_<(