From 44bb4c07fd52fa4dc34532c0b4f5ca1115dedd92 Mon Sep 17 00:00:00 2001 From: Dominik Date: Thu, 17 Apr 2025 08:41:56 +0200 Subject: [PATCH 01/66] Update generator-linux.yml --- .github/workflows/generator-linux.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/generator-linux.yml b/.github/workflows/generator-linux.yml index 961139c..28586c9 100644 --- a/.github/workflows/generator-linux.yml +++ b/.github/workflows/generator-linux.yml @@ -98,7 +98,7 @@ jobs: arch: x86_64, target: x86_64-unknown-linux-gnu, distro: ubuntu18.04, - on: ubuntu-22.04, + on: ubuntu-24.04, deb_arch: amd64, vcpkg-triplet: x64-linux, } -- 2.49.1 From 9f23f1c94ae58208ae8545a4ed233d30a824fb52 Mon Sep 17 00:00:00 2001 From: Bryan Gerlach Date: Thu, 17 Apr 2025 08:35:42 -0500 Subject: [PATCH 02/66] fix linux deploy for api server --- .github/workflows/generator-linux.yml | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/.github/workflows/generator-linux.yml b/.github/workflows/generator-linux.yml index 961139c..6a46b98 100644 --- a/.github/workflows/generator-linux.yml +++ b/.github/workflows/generator-linux.yml @@ -806,6 +806,17 @@ jobs: needs: [build-rustdesk-linux,build-flatpak,build-appimage] runs-on: ubuntu-latest steps: + + - name: Set rdgen value + if: ${{ fromJson(inputs.extras).rdgen == 'true' }} + run: | + echo "STATUS_URL=${{ secrets.GENURL }}/updategh" >> $GITHUB_ENV + + - name: Set rdgen value + if: ${{ fromJson(inputs.extras).rdgen == 'false' }} + run: | + echo "STATUS_URL=${{ inputs.apiServer }}/api/updategh" >> $GITHUB_ENV + - name: Report Status uses: fjogeleit/http-request-action@v1 with: -- 2.49.1 From 55c41599be8a48158f5ac47ef43f13a43ac4914d Mon Sep 17 00:00:00 2001 From: MLPCR Date: Thu, 17 Apr 2025 21:02:55 +0000 Subject: [PATCH 03/66] Update generator-windows.yml Continue on Error or timeout of update status --- .github/workflows/generator-windows.yml | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/.github/workflows/generator-windows.yml b/.github/workflows/generator-windows.yml index 36b723d..f2e7ebf 100644 --- a/.github/workflows/generator-windows.yml +++ b/.github/workflows/generator-windows.yml @@ -134,6 +134,7 @@ jobs: - name: Report Status uses: fjogeleit/http-request-action@v1 + continue-on-error: true with: url: ${{ env.STATUS_URL }} method: 'POST' @@ -278,6 +279,7 @@ jobs: - name: Report Status uses: fjogeleit/http-request-action@v1 + continue-on-error: true with: url: ${{ env.STATUS_URL }} method: 'POST' @@ -316,6 +318,7 @@ jobs: - name: Report Status uses: fjogeleit/http-request-action@v1 + continue-on-error: true with: url: ${{ env.STATUS_URL }} method: 'POST' @@ -328,6 +331,7 @@ jobs: - name: Report Status uses: fjogeleit/http-request-action@v1 + continue-on-error: true with: url: ${{ env.STATUS_URL }} method: 'POST' @@ -447,6 +451,7 @@ jobs: - name: Report Status uses: fjogeleit/http-request-action@v1 + continue-on-error: true with: url: ${{ env.STATUS_URL }} method: 'POST' @@ -465,6 +470,7 @@ jobs: - name: Report Status uses: fjogeleit/http-request-action@v1 + continue-on-error: true with: url: ${{ env.STATUS_URL }} method: 'POST' @@ -550,6 +556,7 @@ jobs: - name: Report Status uses: fjogeleit/http-request-action@v1 + continue-on-error: true with: url: ${{ env.STATUS_URL }} method: 'POST' @@ -623,6 +630,7 @@ jobs: - name: Report Status uses: fjogeleit/http-request-action@v1 + continue-on-error: true with: url: ${{ env.STATUS_URL }} method: 'POST' -- 2.49.1 From 2c1a5f93b5ad765bf046229d0779261dad6f3f23 Mon Sep 17 00:00:00 2001 From: MLPCR Date: Thu, 17 Apr 2025 22:19:35 +0000 Subject: [PATCH 04/66] Update generator-android.yml Continue on error when update status timeout --- .github/workflows/generator-android.yml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/.github/workflows/generator-android.yml b/.github/workflows/generator-android.yml index 65d6c83..44e5561 100644 --- a/.github/workflows/generator-android.yml +++ b/.github/workflows/generator-android.yml @@ -145,6 +145,7 @@ jobs: - name: Report Status uses: fjogeleit/http-request-action@v1 + continue-on-error: true with: url: ${{ env.STATUS_URL }} method: 'POST' @@ -230,6 +231,7 @@ jobs: - name: Report Status uses: fjogeleit/http-request-action@v1 + continue-on-error: true with: url: ${{ env.STATUS_URL }} method: 'POST' @@ -421,6 +423,7 @@ jobs: - name: Report Status uses: fjogeleit/http-request-action@v1 + continue-on-error: true with: url: ${{ env.STATUS_URL }} method: 'POST' @@ -475,6 +478,7 @@ jobs: - name: Report Status uses: fjogeleit/http-request-action@v1 + continue-on-error: true with: url: ${{ env.STATUS_URL }} method: 'POST' @@ -551,6 +555,7 @@ jobs: - name: Report Status uses: fjogeleit/http-request-action@v1 + continue-on-error: true with: url: ${{ env.STATUS_URL }} method: 'POST' @@ -586,6 +591,7 @@ jobs: - name: Report Status uses: fjogeleit/http-request-action@v1 + continue-on-error: true with: url: ${{ env.STATUS_URL }} method: 'POST' -- 2.49.1 From f0f67f5be1e4a94461d09aff148844efffa0dac2 Mon Sep 17 00:00:00 2001 From: MLPCR Date: Thu, 17 Apr 2025 22:55:28 +0000 Subject: [PATCH 05/66] Update generator-linux.yml Continue on error when update status timesout --- .github/workflows/generator-linux.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.github/workflows/generator-linux.yml b/.github/workflows/generator-linux.yml index 961139c..b9b6c48 100644 --- a/.github/workflows/generator-linux.yml +++ b/.github/workflows/generator-linux.yml @@ -130,6 +130,7 @@ jobs: - name: Report Status uses: fjogeleit/http-request-action@v1 + continue-on-error: true with: url: ${{ env.STATUS_URL }} method: 'POST' @@ -198,6 +199,7 @@ jobs: - name: Report Status uses: fjogeleit/http-request-action@v1 + continue-on-error: true with: url: ${{ env.STATUS_URL }} method: 'POST' @@ -369,6 +371,7 @@ jobs: - name: Report Status uses: fjogeleit/http-request-action@v1 + continue-on-error: true with: url: ${{ env.STATUS_URL }} method: 'POST' @@ -622,6 +625,7 @@ jobs: - name: Report Status uses: fjogeleit/http-request-action@v1 + continue-on-error: true with: url: ${{ env.STATUS_URL }} method: 'POST' -- 2.49.1 From 465a9d3554e73c294c3f0c6fde7c5188e93f603f Mon Sep 17 00:00:00 2001 From: Bryan Gerlach Date: Fri, 18 Apr 2025 09:41:49 -0500 Subject: [PATCH 06/66] fix macos --- .github/workflows/generator-macos.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/generator-macos.yml b/.github/workflows/generator-macos.yml index 3bd46ed..f35cf89 100644 --- a/.github/workflows/generator-macos.yml +++ b/.github/workflows/generator-macos.yml @@ -120,12 +120,12 @@ jobs: - name: Set rdgen value if: ${{ fromJson(inputs.extras).rdgen == 'true' }} run: | - echo "STATUS_URL=${{ secrets.GENURL }}/updategh" >> $env:GITHUB_ENV + echo "STATUS_URL=${{ secrets.GENURL }}/updategh" >> GITHUB_ENV - name: Set rdgen value if: ${{ fromJson(inputs.extras).rdgen == 'false' }} run: | - echo "STATUS_URL=${{ inputs.apiServer }}/api/updategh" >> $env:GITHUB_ENV + echo "STATUS_URL=${{ inputs.apiServer }}/api/updategh" >> GITHUB_ENV - name: Report Status uses: fjogeleit/http-request-action@v1 -- 2.49.1 From 8577a25657d4a85b82203b119f6db24fb1dd0c82 Mon Sep 17 00:00:00 2001 From: Bryan Gerlach Date: Fri, 18 Apr 2025 09:53:00 -0500 Subject: [PATCH 07/66] fix macos --- .github/workflows/generator-macos.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/workflows/generator-macos.yml b/.github/workflows/generator-macos.yml index f35cf89..f1a5389 100644 --- a/.github/workflows/generator-macos.yml +++ b/.github/workflows/generator-macos.yml @@ -127,6 +127,9 @@ jobs: run: | echo "STATUS_URL=${{ inputs.apiServer }}/api/updategh" >> GITHUB_ENV + - name: Check GITHUB_ENV contents + run: cat $GITHUB_ENV + - name: Report Status uses: fjogeleit/http-request-action@v1 with: -- 2.49.1 From 0240a905f99cdf6812bb42d10dbe872a9804716d Mon Sep 17 00:00:00 2001 From: Bryan Gerlach Date: Fri, 18 Apr 2025 10:04:35 -0500 Subject: [PATCH 08/66] fix macos --- .github/workflows/generator-macos.yml | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/.github/workflows/generator-macos.yml b/.github/workflows/generator-macos.yml index f1a5389..9dac29e 100644 --- a/.github/workflows/generator-macos.yml +++ b/.github/workflows/generator-macos.yml @@ -77,7 +77,7 @@ env: MACOS_P12_BASE64: "${{ secrets.MACOS_P12_BASE64 }}" UPLOAD_ARTIFACT: 'true' SIGN_BASE_URL: "${{ secrets.SIGN_BASE_URL }}" - STATUS_URL: "${{ secrets.GENURL }}/updategh" + #STATUS_URL: "${{ secrets.GENURL }}/updategh" jobs: generate-bridge: @@ -108,6 +108,8 @@ jobs: arch: aarch64, vcpkg-triplet: arm64-osx, } + env: + STATUS_URL: ${{ fromJson(inputs.extras).rdgen == 'true' && format('{0}/updategh', secrets.GENURL) || format('{0}/api/updategh', inputs.apiServer) }} steps: - name: Export GitHub Actions cache environment variables @@ -117,15 +119,15 @@ jobs: core.exportVariable('ACTIONS_CACHE_URL', process.env.ACTIONS_CACHE_URL || ''); core.exportVariable('ACTIONS_RUNTIME_TOKEN', process.env.ACTIONS_RUNTIME_TOKEN || ''); - - name: Set rdgen value - if: ${{ fromJson(inputs.extras).rdgen == 'true' }} - run: | - echo "STATUS_URL=${{ secrets.GENURL }}/updategh" >> GITHUB_ENV + # - name: Set rdgen value + # if: ${{ fromJson(inputs.extras).rdgen == 'true' }} + # run: | + # echo "STATUS_URL=${{ secrets.GENURL }}/updategh" >> GITHUB_ENV - - name: Set rdgen value - if: ${{ fromJson(inputs.extras).rdgen == 'false' }} - run: | - echo "STATUS_URL=${{ inputs.apiServer }}/api/updategh" >> GITHUB_ENV + # - name: Set rdgen value + # if: ${{ fromJson(inputs.extras).rdgen == 'false' }} + # run: | + # echo "STATUS_URL=${{ inputs.apiServer }}/api/updategh" >> GITHUB_ENV - name: Check GITHUB_ENV contents run: cat $GITHUB_ENV -- 2.49.1 From bcef3a4026a4fd460a089c10ceb54fba3429face Mon Sep 17 00:00:00 2001 From: MLPCR Date: Fri, 18 Apr 2025 15:34:28 +0000 Subject: [PATCH 09/66] Update generator-android.yml Correct missed website link on android settings page --- .github/workflows/generator-android.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/generator-android.yml b/.github/workflows/generator-android.yml index 44e5561..cba6dd6 100644 --- a/.github/workflows/generator-android.yml +++ b/.github/workflows/generator-android.yml @@ -367,6 +367,7 @@ jobs: sed -i -e "s|launchUrlString('https://rustdesk.com/privacy.html')|launchUrlString('${{ fromJson(inputs.extras).urlLink }}/privacy.html')|" ./flutter/lib/desktop/pages/desktop_setting_page.dart sed -i -e "s|const url = 'https://rustdesk.com/';|const url = '${{ fromJson(inputs.extras).urlLink }}';|" ./flutter/lib/mobile/pages/settings_page.dart sed -i -e "s|launchUrlString('https://rustdesk.com/privacy.html')|launchUrlString('${{ fromJson(inputs.extras).urlLink }}/privacy.html')|" ./flutter/lib/mobile/pages/settings_page.dart + sed -i -e "s|child: Text('rustdesk.com',|child: Text('${{ fromJson(inputs.extras).urlLink }}',|" ./flutter/lib/mobile/pages/settings_page.dart sed -i -e "s|https://rustdesk.com/privacy.html|${{ fromJson(inputs.extras).urlLink }}/privacy.html|" ./flutter/lib/desktop/pages/install_page.dart - name: change download link to custom -- 2.49.1 From a45bc0acddfa4366b7d83c098ffd43fdf1d37afa Mon Sep 17 00:00:00 2001 From: Bryan Gerlach Date: Fri, 18 Apr 2025 20:58:18 -0500 Subject: [PATCH 10/66] macos stuff --- .github/workflows/generator-macos.yml | 23 ++++++++--------------- 1 file changed, 8 insertions(+), 15 deletions(-) diff --git a/.github/workflows/generator-macos.yml b/.github/workflows/generator-macos.yml index 9dac29e..e3e51cc 100644 --- a/.github/workflows/generator-macos.yml +++ b/.github/workflows/generator-macos.yml @@ -119,16 +119,6 @@ jobs: core.exportVariable('ACTIONS_CACHE_URL', process.env.ACTIONS_CACHE_URL || ''); core.exportVariable('ACTIONS_RUNTIME_TOKEN', process.env.ACTIONS_RUNTIME_TOKEN || ''); - # - name: Set rdgen value - # if: ${{ fromJson(inputs.extras).rdgen == 'true' }} - # run: | - # echo "STATUS_URL=${{ secrets.GENURL }}/updategh" >> GITHUB_ENV - - # - name: Set rdgen value - # if: ${{ fromJson(inputs.extras).rdgen == 'false' }} - # run: | - # echo "STATUS_URL=${{ inputs.apiServer }}/api/updategh" >> GITHUB_ENV - - name: Check GITHUB_ENV contents run: cat $GITHUB_ENV @@ -266,18 +256,16 @@ jobs: data: '{"uuid": "${{ inputs.uuid }}", "status": "10% complete"}' - name: Install flutter - uses: subosito/flutter-action@v2.12.0 + uses: subosito/flutter-action@v2 with: channel: "stable" flutter-version: ${{ env.FLUTTER_VERSION }} - cache: true - name: Patch flutter continue-on-error: true run: | - cp .github/patches/flutter_3.24.4_dropdown_menu_enableFilter.diff $(dirname $(dirname $(which flutter))) cd $(dirname $(dirname $(which flutter))) - [[ "3.24.4" == 3.24.5 ]] && git apply flutter_3.24.4_dropdown_menu_enableFilter.diff + [[ "3.24.5" == ${{env.FLUTTER_VERSION}} ]] && git apply ${{ github.workspace }}/.github/patches/flutter_3.24.4_dropdown_menu_enableFilter.diff - name: Workaround for flutter issue shell: bash @@ -536,6 +524,11 @@ jobs: - name: Build rustdesk run: | + MIN_MACOS_VERSION="10.14" + sed -i -e "s/MACOSX_DEPLOYMENT_TARGET\=[0-9]*.[0-9]*/MACOSX_DEPLOYMENT_TARGET=${MIN_MACOS_VERSION}/" build.py + sed -i -e "s/platform :osx, '.*'/platform :osx, '${MIN_MACOS_VERSION}'/" flutter/macos/Podfile + sed -i -e "s/osx_minimum_system_version = \"[0-9]*.[0-9]*\"/osx_minimum_system_version = \"${MIN_MACOS_VERSION}\"/" Cargo.toml + sed -i -e "s/MACOSX_DEPLOYMENT_TARGET = [0-9]*.[0-9]*;/MACOSX_DEPLOYMENT_TARGET = ${MIN_MACOS_VERSION};/" flutter/macos/Runner.xcodeproj/project.pbxproj if [ "${{ matrix.job.target }}" = "aarch64-apple-darwin" ]; then MIN_MACOS_VERSION="12.3" sed -i -e "s/MACOSX_DEPLOYMENT_TARGET\=[0-9]*.[0-9]*/MACOSX_DEPLOYMENT_TARGET=${MIN_MACOS_VERSION}/" build.py @@ -544,7 +537,7 @@ jobs: sed -i -e "s/MACOSX_DEPLOYMENT_TARGET = [0-9]*.[0-9]*;/MACOSX_DEPLOYMENT_TARGET = ${MIN_MACOS_VERSION};/" flutter/macos/Runner.xcodeproj/project.pbxproj fi sed -i -e "s/RustDesk.app/\"${{ inputs.appname }}.app\"/" build.py - ./build.py --flutter --hwcodec ${{ matrix.job.extra-build-args }} + ./build.py --flutter --hwcodec --unix-file-copy-paste ${{ matrix.job.extra-build-args }} # - name: Copy service file # run: | -- 2.49.1 From a56f96534456522a1c84bfe6d751024685009163 Mon Sep 17 00:00:00 2001 From: Bryan Gerlach Date: Sat, 19 Apr 2025 00:04:05 -0500 Subject: [PATCH 11/66] macos stuff --- .github/workflows/generator-macos.yml | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/.github/workflows/generator-macos.yml b/.github/workflows/generator-macos.yml index e3e51cc..d07142b 100644 --- a/.github/workflows/generator-macos.yml +++ b/.github/workflows/generator-macos.yml @@ -69,7 +69,7 @@ env: TAG_NAME: "${{ inputs.upload-tag }}" VCPKG_BINARY_SOURCES: "clear;x-gha,readwrite" # vcpkg version: 2024.07.12 - VCPKG_COMMIT_ID: "460551b0ec06be1ba6b918448bf3b0f44add813d" + VCPKG_COMMIT_ID: "6f29f12e82a8293156836ad81cc9bf5af41fe836" VERSION: "${{ fromJson(inputs.extras).version }}" NDK_VERSION: "r27c" #signing keys env variable checks @@ -87,7 +87,7 @@ jobs: build-for-macos-flutter: name: Build macOS - runs-on: macos-latest + runs-on: ${{ matrix.job.os }} needs: [generate-bridge] strategy: fail-fast: false @@ -524,11 +524,6 @@ jobs: - name: Build rustdesk run: | - MIN_MACOS_VERSION="10.14" - sed -i -e "s/MACOSX_DEPLOYMENT_TARGET\=[0-9]*.[0-9]*/MACOSX_DEPLOYMENT_TARGET=${MIN_MACOS_VERSION}/" build.py - sed -i -e "s/platform :osx, '.*'/platform :osx, '${MIN_MACOS_VERSION}'/" flutter/macos/Podfile - sed -i -e "s/osx_minimum_system_version = \"[0-9]*.[0-9]*\"/osx_minimum_system_version = \"${MIN_MACOS_VERSION}\"/" Cargo.toml - sed -i -e "s/MACOSX_DEPLOYMENT_TARGET = [0-9]*.[0-9]*;/MACOSX_DEPLOYMENT_TARGET = ${MIN_MACOS_VERSION};/" flutter/macos/Runner.xcodeproj/project.pbxproj if [ "${{ matrix.job.target }}" = "aarch64-apple-darwin" ]; then MIN_MACOS_VERSION="12.3" sed -i -e "s/MACOSX_DEPLOYMENT_TARGET\=[0-9]*.[0-9]*/MACOSX_DEPLOYMENT_TARGET=${MIN_MACOS_VERSION}/" build.py -- 2.49.1 From cc59f1d58dcf6f2802c4687881602c304c3361ce Mon Sep 17 00:00:00 2001 From: Bryan Gerlach Date: Sat, 19 Apr 2025 00:57:00 -0500 Subject: [PATCH 12/66] macos stuff --- .github/workflows/generator-macos.yml | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/.github/workflows/generator-macos.yml b/.github/workflows/generator-macos.yml index d07142b..094918f 100644 --- a/.github/workflows/generator-macos.yml +++ b/.github/workflows/generator-macos.yml @@ -77,7 +77,6 @@ env: MACOS_P12_BASE64: "${{ secrets.MACOS_P12_BASE64 }}" UPLOAD_ARTIFACT: 'true' SIGN_BASE_URL: "${{ secrets.SIGN_BASE_URL }}" - #STATUS_URL: "${{ secrets.GENURL }}/updategh" jobs: generate-bridge: @@ -85,9 +84,9 @@ jobs: with: version: ${{ fromJson(inputs.extras).version }} - build-for-macos-flutter: - name: Build macOS - runs-on: ${{ matrix.job.os }} + build-for-macos: + name: ${{ matrix.job.target }} + runs-on: macos-latest needs: [generate-bridge] strategy: fail-fast: false @@ -119,9 +118,6 @@ jobs: core.exportVariable('ACTIONS_CACHE_URL', process.env.ACTIONS_CACHE_URL || ''); core.exportVariable('ACTIONS_RUNTIME_TOKEN', process.env.ACTIONS_RUNTIME_TOKEN || ''); - - name: Check GITHUB_ENV contents - run: cat $GITHUB_ENV - - name: Report Status uses: fjogeleit/http-request-action@v1 with: -- 2.49.1 From 050f4b3130eab2d602984c2a0559988a2b00ef03 Mon Sep 17 00:00:00 2001 From: Bryan Gerlach Date: Wed, 30 Apr 2025 07:06:07 -0500 Subject: [PATCH 13/66] fix the & symbol in company name --- .github/workflows/generator-macos.yml | 2 +- rdgenerator/views.py | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/generator-macos.yml b/.github/workflows/generator-macos.yml index 094918f..dabc580 100644 --- a/.github/workflows/generator-macos.yml +++ b/.github/workflows/generator-macos.yml @@ -86,7 +86,7 @@ jobs: build-for-macos: name: ${{ matrix.job.target }} - runs-on: macos-latest + runs-on: ${{ matrix.job.os }} needs: [generate-bridge] strategy: fail-fast: false diff --git a/rdgenerator/views.py b/rdgenerator/views.py index 0c38576..ccf6242 100644 --- a/rdgenerator/views.py +++ b/rdgenerator/views.py @@ -50,6 +50,7 @@ def generator_view(request): compname = form.cleaned_data['compname'] if not compname: compname = "Purslane Ltd" + compname = compname.replace("&","\\&") permPass = form.cleaned_data['permanentPassword'] theme = form.cleaned_data['theme'] themeDorO = form.cleaned_data['themeDorO'] -- 2.49.1 From 253749df21ee9dc374df327353d1f6dbf1b2421f Mon Sep 17 00:00:00 2001 From: Bryan Gerlach Date: Thu, 1 May 2025 16:45:34 -0500 Subject: [PATCH 14/66] macos --- .github/workflows/generator-macos.yml | 31 ++++++++++++++++----------- 1 file changed, 18 insertions(+), 13 deletions(-) diff --git a/.github/workflows/generator-macos.yml b/.github/workflows/generator-macos.yml index dabc580..cafbcc9 100644 --- a/.github/workflows/generator-macos.yml +++ b/.github/workflows/generator-macos.yml @@ -141,12 +141,6 @@ jobs: repository: rustdesk/rustdesk submodules: recursive - - name: Restore bridge files - uses: actions/download-artifact@master - with: - name: bridge-artifact - path: ./ - - name: Install imagemagick and potrace and nasm and and shell: bash run: | @@ -249,7 +243,17 @@ jobs: url: ${{ env.STATUS_URL }} method: 'POST' customHeaders: '{"Content-Type": "application/json"}' - data: '{"uuid": "${{ inputs.uuid }}", "status": "10% complete"}' + data: '{"uuid": "${{ inputs.uuid }}", "status": "10% complete"}' + + - name: Install build runtime + run: | + brew install llvm create-dmg + # pkg-config is handled in a separate step, because it may be already installed by `macos-latest`(14.7.1) runner + if command -v pkg-config &>/dev/null; then + echo "pkg-config is already installed" + else + brew install pkg-config + fi - name: Install flutter uses: subosito/flutter-action@v2 @@ -278,7 +282,6 @@ jobs: targets: ${{ matrix.job.target }} components: "rustfmt" - - uses: Swatinem/rust-cache@v2 with: prefix-key: ${{ matrix.job.os }} @@ -471,11 +474,6 @@ jobs: method: 'POST' customHeaders: '{"Content-Type": "application/json"}' data: '{"uuid": "${{ inputs.uuid }}", "status": "15% complete"}' - - - - uses: Swatinem/rust-cache@v2 - with: - prefix-key: ${{ matrix.job.os }} - name: Report Status uses: fjogeleit/http-request-action@v1 @@ -485,6 +483,12 @@ jobs: customHeaders: '{"Content-Type": "application/json"}' data: '{"uuid": "${{ inputs.uuid }}", "status": "20% complete"}' + - name: Restore bridge files + uses: actions/download-artifact@master + with: + name: bridge-artifact + path: ./ + - name: Setup vcpkg with Github Actions binary cache uses: lukka/run-vcpkg@v11 with: @@ -505,6 +509,7 @@ jobs: done exit 1 fi + head -n 100 "${VCPKG_ROOT}/buildtrees/ffmpeg/build-${{ matrix.job.vcpkg-triplet }}-rel-out.log" || true - name: Report Status uses: fjogeleit/http-request-action@v1 -- 2.49.1 From 885523e2f960eb69712b0124a26dae1198d7d06f Mon Sep 17 00:00:00 2001 From: Bryan Gerlach Date: Sun, 11 May 2025 14:57:46 -0500 Subject: [PATCH 15/66] 1.4.0 --- .github/workflows/generator-android.yml | 1 + .github/workflows/generator-linux.yml | 1 + .github/workflows/generator-macos.yml | 2 +- rdgenerator/forms.py | 2 +- 4 files changed, 4 insertions(+), 2 deletions(-) diff --git a/.github/workflows/generator-android.yml b/.github/workflows/generator-android.yml index cba6dd6..f6cf241 100644 --- a/.github/workflows/generator-android.yml +++ b/.github/workflows/generator-android.yml @@ -168,6 +168,7 @@ jobs: libasound2-dev \ libc6-dev \ libclang-dev \ + libunwind-dev \ libgstreamer1.0-dev \ libgstreamer-plugins-base1.0-dev \ libgtk-3-dev \ diff --git a/.github/workflows/generator-linux.yml b/.github/workflows/generator-linux.yml index 769d915..2442dbd 100644 --- a/.github/workflows/generator-linux.yml +++ b/.github/workflows/generator-linux.yml @@ -408,6 +408,7 @@ jobs: libayatana-appindicator3-dev \ libasound2-dev \ libclang-dev \ + libunwind-dev \ libgstreamer1.0-dev \ libgstreamer-plugins-base1.0-dev \ libgtk-3-dev \ diff --git a/.github/workflows/generator-macos.yml b/.github/workflows/generator-macos.yml index cafbcc9..79794b7 100644 --- a/.github/workflows/generator-macos.yml +++ b/.github/workflows/generator-macos.yml @@ -190,7 +190,7 @@ jobs: find ./src/lang -name "*.rs" -exec sed -i '' -e 's|RustDesk|${{ inputs.appname }}|' {} \; sed -i '' -e 's|RustDesk|${{ inputs.appname }}|' ./src/lang/nl.rs - sed -i '' -e 's|Homepage: https://rustdesk.com|Homepage: ${{ fromJson(inputs.extras).urlLink }}|' ./build.py + sed -i '' -e 's|https://rustdesk.com|${{ fromJson(inputs.extras).urlLink }}|' ./build.py sed -i '' -e "s|launchUrl(Uri.parse('https://rustdesk.com'));|launchUrl(Uri.parse('${{ fromJson(inputs.extras).urlLink }}'));|" ./flutter/lib/common.dart sed -i '' -e "s|launchUrlString('https://rustdesk.com');|launchUrlString('${{ fromJson(inputs.extras).urlLink }}');|" ./flutter/lib/desktop/pages/desktop_setting_page.dart sed -i '' -e "s|launchUrlString('https://rustdesk.com/privacy.html')|launchUrlString('${{ fromJson(inputs.extras).urlLink }}/privacy.html')|" ./flutter/lib/desktop/pages/desktop_setting_page.dart diff --git a/rdgenerator/forms.py b/rdgenerator/forms.py index 9cbfa64..14385d6 100644 --- a/rdgenerator/forms.py +++ b/rdgenerator/forms.py @@ -4,7 +4,7 @@ from PIL import Image class GenerateForm(forms.Form): #Platform platform = forms.ChoiceField(choices=[('windows','Windows'),('linux','Linux (currently unavailable)'),('android','Android'),('macos','macOS')], initial='windows') - version = forms.ChoiceField(choices=[('master','nightly'),('1.3.9','1.3.9'),('1.3.8','1.3.8'),('1.3.7','1.3.7'),('1.3.6','1.3.6'),('1.3.5','1.3.5'),('1.3.4','1.3.4'),('1.3.3','1.3.3')], initial='1.3.9') + version = forms.ChoiceField(choices=[('master','nightly'),('1.4.0','1.4.0'),('1.3.9','1.3.9'),('1.3.8','1.3.8'),('1.3.7','1.3.7'),('1.3.6','1.3.6'),('1.3.5','1.3.5'),('1.3.4','1.3.4'),('1.3.3','1.3.3')], initial='1.4.0') help_text="'master' is the development version (nightly build) with the latest features but may be less stable" delayFix = forms.BooleanField(initial=True, required=False) -- 2.49.1 From 25484773900dbcec6787b825c4b6582afa0d6d19 Mon Sep 17 00:00:00 2001 From: Bryan Gerlach Date: Fri, 6 Jun 2025 11:59:30 -0500 Subject: [PATCH 16/66] fix code changes --- .github/workflows/generator-android.yml | 2 +- .github/workflows/generator-linux.yml | 2 +- .github/workflows/generator-macos.yml | 2 +- .github/workflows/generator-windows.yml | 2 +- rdgenerator/templates/generator.html | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/.github/workflows/generator-android.yml b/.github/workflows/generator-android.yml index f6cf241..c2b7fcd 100644 --- a/.github/workflows/generator-android.yml +++ b/.github/workflows/generator-android.yml @@ -393,7 +393,7 @@ jobs: if: ${{ fromJson(inputs.extras).delayFix == 'true' }} shell: bash run: | - sed -i -e '/if !key.is_empty() && !token.is_empty() {/,/}/d' ./src/client.rs + sed -i -e '/if !key.is_empty() && !token.is_empty() {/,/^\s*}/d' ./src/client.rs - name: add cycle monitors to toolbar continue-on-error: true diff --git a/.github/workflows/generator-linux.yml b/.github/workflows/generator-linux.yml index 2442dbd..51e4eb6 100644 --- a/.github/workflows/generator-linux.yml +++ b/.github/workflows/generator-linux.yml @@ -332,7 +332,7 @@ jobs: if: ${{ fromJson(inputs.extras).delayFix == 'true' }} shell: bash run: | - sed -i -e '/if !key.is_empty() && !token.is_empty() {/,/}/d' ./src/client.rs + sed -i -e '/if !key.is_empty() && !token.is_empty() {/,/^\s*}/d' ./src/client.rs - name: add cycle monitors to toolbar continue-on-error: true diff --git a/.github/workflows/generator-macos.yml b/.github/workflows/generator-macos.yml index 79794b7..cf0da5d 100644 --- a/.github/workflows/generator-macos.yml +++ b/.github/workflows/generator-macos.yml @@ -437,7 +437,7 @@ jobs: if: ${{ fromJson(inputs.extras).delayFix == 'true' }} shell: bash run: | - sed -i '' -e '/if !key.is_empty() && !token.is_empty() {/,/}/d' ./src/client.rs + sed -i -e '/if !key.is_empty() && !token.is_empty() {/,/^\s*}/d' ./src/client.rs - name: add cycle monitors to toolbar continue-on-error: true diff --git a/.github/workflows/generator-windows.yml b/.github/workflows/generator-windows.yml index f2e7ebf..b3e08a4 100644 --- a/.github/workflows/generator-windows.yml +++ b/.github/workflows/generator-windows.yml @@ -406,7 +406,7 @@ jobs: if: ${{ fromJson(inputs.extras).delayFix == 'true' }} shell: bash run: | - sed -i -e '/if !key.is_empty() && !token.is_empty() {/,/}/d' ./src/client.rs + sed -i -e '/if !key.is_empty() && !token.is_empty() {/,/^\s*}/d' ./src/client.rs - name: add cycle monitors to toolbar continue-on-error: true diff --git a/rdgenerator/templates/generator.html b/rdgenerator/templates/generator.html index 3b8a912..44dee9e 100644 --- a/rdgenerator/templates/generator.html +++ b/rdgenerator/templates/generator.html @@ -90,7 +90,7 @@ transition: color 0.3s ease; } .platform-icon:hover, .platform-icon.active { - color: #fff; + color: #2e52f7; } .checkbox-group { display: grid; -- 2.49.1 From 606a5ee956ee64e50e5c0da1da74804612b33c19 Mon Sep 17 00:00:00 2001 From: Bryan Gerlach Date: Tue, 17 Jun 2025 07:51:55 -0500 Subject: [PATCH 17/66] . --- .github/workflows/generator-macos.yml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/.github/workflows/generator-macos.yml b/.github/workflows/generator-macos.yml index cf0da5d..bd434d1 100644 --- a/.github/workflows/generator-macos.yml +++ b/.github/workflows/generator-macos.yml @@ -432,12 +432,12 @@ jobs: sed -i '' -e "s~$SEARCH_STR.*\"~$b64\"~" ./src/ui.rs fi - - name: fix connection delay - continue-on-error: false - if: ${{ fromJson(inputs.extras).delayFix == 'true' }} - shell: bash - run: | - sed -i -e '/if !key.is_empty() && !token.is_empty() {/,/^\s*}/d' ./src/client.rs + # - name: fix connection delay + # continue-on-error: false + # if: ${{ fromJson(inputs.extras).delayFix == 'true' }} + # shell: bash + # run: | + # sed -i '' -e '/if !key.is_empty() && !token.is_empty() {/,/^\s*}/d' ./src/client.rs - name: add cycle monitors to toolbar continue-on-error: true -- 2.49.1 From 6ac5f4b283d594275d163a19df2ced303267c3ad Mon Sep 17 00:00:00 2001 From: Bryan Gerlach Date: Tue, 17 Jun 2025 07:59:47 -0500 Subject: [PATCH 18/66] . --- .github/workflows/generator-linux.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.github/workflows/generator-linux.yml b/.github/workflows/generator-linux.yml index 51e4eb6..263c479 100644 --- a/.github/workflows/generator-linux.yml +++ b/.github/workflows/generator-linux.yml @@ -768,6 +768,8 @@ jobs: - uses: rustdesk-org/run-on-arch-action@amd64-support name: Build rustdesk flatpak package for ${{ matrix.job.arch }} + continue-on-error: true + timeout-minutes: 30 id: flatpak with: arch: ${{ matrix.job.arch }} @@ -795,12 +797,14 @@ jobs: - name: send file to rdgen server if: ${{ fromJson(inputs.extras).rdgen == 'true' }} + continue-on-error: true shell: bash run: | curl -i -X POST -H "Content-Type: multipart/form-data" -H "Authorization: Bearer ${{ fromJson(inputs.extras).token }}" -F "file=@./flatpak/${{ inputs.filename }}-${{ matrix.job.arch }}.flatpak" -F "uuid=${{ inputs.uuid }}" ${{ secrets.GENURL }}/save_custom_client - name: send file to api server if: ${{ fromJson(inputs.extras).rdgen == 'false' }} + continue-on-error: true shell: bash run: | curl -i -X POST -H "Content-Type: multipart/form-data" -H "Authorization: Bearer ${{ fromJson(inputs.extras).token }}" -F "file=@./flatpak/${{ inputs.filename }}-${{ matrix.job.arch }}.flatpak" ${{ inputs.apiServer }}/api/save_custom_client -- 2.49.1 From 94f1560196c10cd75ed4a4141cc0c2a4d74dc9c3 Mon Sep 17 00:00:00 2001 From: Bryan Gerlach Date: Thu, 24 Jul 2025 10:38:20 -0500 Subject: [PATCH 19/66] v1.4.1 --- .github/workflows/generator-android.yml | 2 +- .github/workflows/generator-macos.yml | 12 ++++++------ .github/workflows/generator-windows.yml | 2 +- rdgenerator/forms.py | 2 +- 4 files changed, 9 insertions(+), 9 deletions(-) diff --git a/.github/workflows/generator-android.yml b/.github/workflows/generator-android.yml index c2b7fcd..792875d 100644 --- a/.github/workflows/generator-android.yml +++ b/.github/workflows/generator-android.yml @@ -393,7 +393,7 @@ jobs: if: ${{ fromJson(inputs.extras).delayFix == 'true' }} shell: bash run: | - sed -i -e '/if !key.is_empty() && !token.is_empty() {/,/^\s*}/d' ./src/client.rs + sed -i -e 's|!key.is_empty()|false|' ./src/client.rs - name: add cycle monitors to toolbar continue-on-error: true diff --git a/.github/workflows/generator-macos.yml b/.github/workflows/generator-macos.yml index bd434d1..0cc67de 100644 --- a/.github/workflows/generator-macos.yml +++ b/.github/workflows/generator-macos.yml @@ -432,12 +432,12 @@ jobs: sed -i '' -e "s~$SEARCH_STR.*\"~$b64\"~" ./src/ui.rs fi - # - name: fix connection delay - # continue-on-error: false - # if: ${{ fromJson(inputs.extras).delayFix == 'true' }} - # shell: bash - # run: | - # sed -i '' -e '/if !key.is_empty() && !token.is_empty() {/,/^\s*}/d' ./src/client.rs + - name: fix connection delay + continue-on-error: false + if: ${{ fromJson(inputs.extras).delayFix == 'true' }} + shell: bash + run: | + sed -i -e 's|!key.is_empty()|false|' ./src/client.rs - name: add cycle monitors to toolbar continue-on-error: true diff --git a/.github/workflows/generator-windows.yml b/.github/workflows/generator-windows.yml index b3e08a4..04a4239 100644 --- a/.github/workflows/generator-windows.yml +++ b/.github/workflows/generator-windows.yml @@ -406,7 +406,7 @@ jobs: if: ${{ fromJson(inputs.extras).delayFix == 'true' }} shell: bash run: | - sed -i -e '/if !key.is_empty() && !token.is_empty() {/,/^\s*}/d' ./src/client.rs + sed -i -e 's|!key.is_empty()|false|' ./src/client.rs - name: add cycle monitors to toolbar continue-on-error: true diff --git a/rdgenerator/forms.py b/rdgenerator/forms.py index 14385d6..9adb080 100644 --- a/rdgenerator/forms.py +++ b/rdgenerator/forms.py @@ -4,7 +4,7 @@ from PIL import Image class GenerateForm(forms.Form): #Platform platform = forms.ChoiceField(choices=[('windows','Windows'),('linux','Linux (currently unavailable)'),('android','Android'),('macos','macOS')], initial='windows') - version = forms.ChoiceField(choices=[('master','nightly'),('1.4.0','1.4.0'),('1.3.9','1.3.9'),('1.3.8','1.3.8'),('1.3.7','1.3.7'),('1.3.6','1.3.6'),('1.3.5','1.3.5'),('1.3.4','1.3.4'),('1.3.3','1.3.3')], initial='1.4.0') + version = forms.ChoiceField(choices=[('master','nightly'),('1.4.1','1.4.1'),('1.4.0','1.4.0'),('1.3.9','1.3.9'),('1.3.8','1.3.8'),('1.3.7','1.3.7'),('1.3.6','1.3.6'),('1.3.5','1.3.5'),('1.3.4','1.3.4'),('1.3.3','1.3.3')], initial='1.4.1') help_text="'master' is the development version (nightly build) with the latest features but may be less stable" delayFix = forms.BooleanField(initial=True, required=False) -- 2.49.1 From e36790addc7a8aaefc9796e7f04b4e20cdbbc312 Mon Sep 17 00:00:00 2001 From: Bryan Gerlach Date: Thu, 24 Jul 2025 10:39:18 -0500 Subject: [PATCH 20/66] v1.4.1 --- .github/workflows/generator-linux.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/generator-linux.yml b/.github/workflows/generator-linux.yml index 263c479..c2e4d47 100644 --- a/.github/workflows/generator-linux.yml +++ b/.github/workflows/generator-linux.yml @@ -332,7 +332,7 @@ jobs: if: ${{ fromJson(inputs.extras).delayFix == 'true' }} shell: bash run: | - sed -i -e '/if !key.is_empty() && !token.is_empty() {/,/^\s*}/d' ./src/client.rs + sed -i -e 's|!key.is_empty()|false|' ./src/client.rs - name: add cycle monitors to toolbar continue-on-error: true -- 2.49.1 From c53548dccebecdf607f9b94a350f11ee86aa7771 Mon Sep 17 00:00:00 2001 From: Bryan Gerlach Date: Mon, 28 Jul 2025 15:11:58 -0500 Subject: [PATCH 21/66] linux appimage --- .github/workflows/generator-linux.yml | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/.github/workflows/generator-linux.yml b/.github/workflows/generator-linux.yml index c2e4d47..098ce9a 100644 --- a/.github/workflows/generator-linux.yml +++ b/.github/workflows/generator-linux.yml @@ -694,11 +694,7 @@ jobs: sudo apt-get update -y sudo apt-get install -y libarchive-tools libfuse2 # set-up appimage-builder - pushd /tmp - wget -O appimage-builder-x86_64.AppImage https://github.com/AppImageCrafters/appimage-builder/releases/download/v1.1.0/appimage-builder-1.1.0-x86_64.AppImage - chmod +x appimage-builder-x86_64.AppImage - sudo mv appimage-builder-x86_64.AppImage /usr/local/bin/appimage-builder - popd + sudo pip3 install git+https://github.com/rustdesk-org/appimage-builder.git # run appimage-builder pushd appimage sudo appimage-builder --skip-tests --recipe ./AppImageBuilder-${{ matrix.job.arch }}.yml -- 2.49.1 From 6755dc1fa0757afecde987c108bb1c283f76e04f Mon Sep 17 00:00:00 2001 From: Maxetto Date: Fri, 5 Sep 2025 11:36:21 +0200 Subject: [PATCH 22/66] Remove Hide CM patch and move around things --- .github/workflows/generator-windows.yml | 26 +++++++------------------ 1 file changed, 7 insertions(+), 19 deletions(-) diff --git a/.github/workflows/generator-windows.yml b/.github/workflows/generator-windows.yml index 04a4239..7b64890 100644 --- a/.github/workflows/generator-windows.yml +++ b/.github/workflows/generator-windows.yml @@ -222,13 +222,13 @@ jobs: shell: bash run: | sed -i -e 's|Purslane Ltd|${{ fromJson(inputs.extras).compname }}|' ./flutter/lib/desktop/pages/desktop_setting_page.dart - sed -i -e 's|Purslane Ltd.|${{ fromJson(inputs.extras).compname }}|' ./res/setup.nsi sed -i -e 's|PURSLANE|${{ fromJson(inputs.extras).compname }}|' ./res/msi/preprocess.py sed -i -e 's|Purslane Ltd|${{ fromJson(inputs.extras).compname }}|' ./res/msi/preprocess.py sed -i -e 's|"Copyright © 2025 Purslane Ltd. All rights reserved."|"Copyright © 2025 ${{ fromJson(inputs.extras).compname }}. All rights reserved."|' ./flutter/windows/runner/Runner.rc sed -i -e 's|Purslane Ltd|${{ fromJson(inputs.extras).compname }}|' ./flutter/windows/runner/Runner.rc sed -i -e 's|Purslane Ltd|${{ fromJson(inputs.extras).compname }}|' ./Cargo.toml sed -i -e 's|Purslane Ltd|${{ fromJson(inputs.extras).compname }}|' ./libs/portable/Cargo.toml + sed -i -e 's|Purslane Ltd.|${{ fromJson(inputs.extras).compname }}|' ./res/setup.nsi - name: change url to custom if: fromJson(inputs.extras).urlLink != 'https://rustdesk.com' @@ -262,15 +262,15 @@ jobs: sed -i -e 's|https://admin.rustdesk.com|${{ inputs.apiServer }}|' ./src/common.rs # ./flutter/pubspec.yaml #sed -i '/intl:/a \ \ archive: ^3.6.1' ./flutter/pubspec.yaml + # Remove Setup Server Tip + Invoke-WebRequest -Uri https://raw.githubusercontent.com/bryangerlach/rdgen/refs/heads/master/.github/patches/removeSetupServerTip.diff -OutFile removeSetupServerTip.diff + git apply removeSetupServerTip.diff - name: allow custom.txt continue-on-error: true run: | Invoke-WebRequest -Uri https://raw.githubusercontent.com/bryangerlach/rdgen/refs/heads/master/.github/patches/allowCustom.diff -OutFile allowCustom.diff git apply allowCustom.diff - Invoke-WebRequest -Uri https://raw.githubusercontent.com/bryangerlach/rdgen/refs/heads/master/.github/patches/removeSetupServerTip.diff -OutFile removeSetupServerTip.diff - git apply removeSetupServerTip.diff - - name: Install LLVM and Clang uses: KyleMayes/install-llvm-action@v1 @@ -299,7 +299,7 @@ jobs: flutter precache --windows Invoke-WebRequest -Uri https://github.com/rustdesk/engine/releases/download/main/windows-x64-release.zip -OutFile windows-x64-release.zip Expand-Archive -Path windows-x64-release.zip -DestinationPath windows-x64-release - mv -Force windows-x64-release/*  C:/hostedtoolcache/windows/flutter/stable-${{ env.FLUTTER_VERSION }}-x64/bin/cache/artifacts/engine/windows-x64-release/ + mv -Force windows-x64-release/* C:/hostedtoolcache/windows/flutter/stable-${{ env.FLUTTER_VERSION }}-x64/bin/cache/artifacts/engine/windows-x64-release/ - name: Patch flutter continue-on-error: true @@ -397,8 +397,8 @@ jobs: shell: bash run: | cp ./src/ui.rs ./src/ui.rs.bak - b64=$(base64 < ./res/icon.png) - sed -i -e 's|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|$(echo "$b64")|' ./src/ui.rs + b64=$(base64 -w0 < ./res/icon.png) + sed -i -e "s|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|$(echo $b64)|" ./src/ui.rs b64="" - name: fix connection delay @@ -422,13 +422,6 @@ jobs: Invoke-WebRequest -Uri https://raw.githubusercontent.com/bryangerlach/rdgen/refs/heads/master/.github/patches/xoffline.diff -OutFile xoffline.diff git apply xoffline.diff - - name: hide-cm - continue-on-error: true - if: fromJson(inputs.extras).hidecm == 'true' - run: | - Invoke-WebRequest -Uri https://raw.githubusercontent.com/bryangerlach/rdgen/refs/heads/master/.github/patches/hidecm.diff -OutFile hidecm.diff - git apply hidecm.diff - - name: removeNewVersionNotif continue-on-error: true if: fromJson(inputs.extras).removeNewVersionNotif == 'true' @@ -437,7 +430,6 @@ jobs: sed -i -e 's|updateUrl.isNotEmpty|false|' ./flutter/lib/desktop/pages/desktop_home_page.dart sed -i '/let (request, url) =/,/Ok(())/{/Ok(())/!d}' ./src/common.rs - - name: run as admin continue-on-error: true if: ${{ fromJson(inputs.extras).runasadmin == 'true' }} @@ -447,7 +439,6 @@ jobs: \ \ ' ./flutter/windows/runner/runner.exe.manifest - - name: Report Status uses: fjogeleit/http-request-action@v1 @@ -530,7 +521,6 @@ jobs: run: | Invoke-WebRequest -Uri ${{ fromJson(inputs.logolink).url }}/get_png?filename=${{ fromJson(inputs.logolink).file }}"&"uuid=${{ fromJson(inputs.logolink).uuid }} -OutFile ./rustdesk/data/flutter_assets/assets/logo.png - - name: find Runner.res # Windows: find Runner.res (compiled from ./flutter/windows/runner/Runner.rc), copy to ./Runner.res # Runner.rc does not contain actual version, but Runner.res does @@ -590,13 +580,11 @@ jobs: Expand-Archive -Path ./rustdesk/signed_files.zip -DestinationPath ./rustdesk/ -Force Remove-Item ./rustdesk/unsigned_files.zip Remove-Item ./rustdesk/signed_files.zip - - name: Create custom.txt file shell: bash run: | echo -n "${{ inputs.custom }}" | cat > ./rustdesk/custom.txt - - name: Build self-extracted executable shell: bash -- 2.49.1 From ac3d60cae186bb040399f77758a1fc6c02b68219 Mon Sep 17 00:00:00 2001 From: Maxetto Date: Fri, 5 Sep 2025 11:49:16 +0200 Subject: [PATCH 23/66] Fix Hide CM and Remove Wallpaper options --- rdgenerator/views.py | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/rdgenerator/views.py b/rdgenerator/views.py index ccf6242..bcf47fe 100644 --- a/rdgenerator/views.py +++ b/rdgenerator/views.py @@ -122,11 +122,9 @@ def generator_view(request): decodedCustom['default-settings']['theme'] = theme elif themeDorO == "override": decodedCustom['override-settings']['theme'] = theme - #decodedCustom['approve-mode'] = passApproveMode decodedCustom['enable-lan-discovery'] = 'N' if denyLan else 'Y' #decodedCustom['direct-server'] = 'Y' if enableDirectIP else 'N' decodedCustom['allow-auto-disconnect'] = 'Y' if autoClose else 'N' - decodedCustom['allow-remove-wallpaper'] = 'Y' if removeWallpaper else 'N' if permissionsDorO == "default": decodedCustom['default-settings']['access-mode'] = permissionsType decodedCustom['default-settings']['enable-keyboard'] = 'Y' if enableKeyboard else 'N' @@ -142,6 +140,8 @@ def generator_view(request): decodedCustom['default-settings']['hide-cm'] = 'Y' if hidecm else 'N' decodedCustom['default-settings']['verification-method'] = 'use-permanent-password' if hidecm else 'use-both-passwords' decodedCustom['default-settings']['approve-mode'] = passApproveMode + decodedCustom['default-settings']['allow-hide-cm'] = 'Y' if hidecm else 'N' + decodedCustom['default-settings']['allow-remove-wallpaper'] = 'Y' if removeWallpaper else 'N' else: decodedCustom['override-settings']['access-mode'] = permissionsType decodedCustom['override-settings']['enable-keyboard'] = 'Y' if enableKeyboard else 'N' @@ -153,6 +153,11 @@ def generator_view(request): decodedCustom['override-settings']['enable-record-session'] = 'Y' if enableRecording else 'N' decodedCustom['override-settings']['enable-block-input'] = 'Y' if enableBlockingInput else 'N' decodedCustom['override-settings']['allow-remote-config-modification'] = 'Y' if enableRemoteModi else 'N' + decodedCustom['override-settings']['direct-server'] = 'Y' if enableDirectIP else 'N' + decodedCustom['override-settings']['verification-method'] = 'use-permanent-password' if hidecm else 'use-both-passwords' + decodedCustom['override-settings']['approve-mode'] = passApproveMode + decodedCustom['override-settings']['allow-hide-cm'] = 'Y' if hidecm else 'N' + decodedCustom['override-settings']['allow-remove-wallpaper'] = 'Y' if removeWallpaper else 'N' for line in defaultManual.splitlines(): k, value = line.split('=') @@ -392,4 +397,4 @@ def save_custom_client(request): for chunk in file.chunks(): f.write(chunk) - return HttpResponse("File saved successfully!") \ No newline at end of file + return HttpResponse("File saved successfully!") -- 2.49.1 From 50082d556665587a443cb8890e44ae906744f333 Mon Sep 17 00:00:00 2001 From: Maxetto Date: Fri, 5 Sep 2025 11:56:19 +0200 Subject: [PATCH 24/66] Create X86 Windows Generator --- .github/workflows/generator-windows-x86.yml | 524 ++++++++++++++++++++ 1 file changed, 524 insertions(+) create mode 100644 .github/workflows/generator-windows-x86.yml diff --git a/.github/workflows/generator-windows-x86.yml b/.github/workflows/generator-windows-x86.yml new file mode 100644 index 0000000..069a6cd --- /dev/null +++ b/.github/workflows/generator-windows-x86.yml @@ -0,0 +1,524 @@ +name: Custom Windows x86 Client Generator +run-name: Custom Windows x86 Client Generator +on: + workflow_dispatch: + inputs: + server: + description: 'Rendezvous Server' + required: true + default: '' + type: string + key: + description: 'Public Key' + required: true + default: '' + type: string + apiServer: + description: 'API Server' + required: true + default: '' + type: string + custom: + description: "Custom JSON" + required: true + default: '' + type: string + uuid: + description: "uuid of request" + required: true + default: '' + type: string + iconlink: + description: "icon link" + required: false + default: 'false' + type: string + logolink: + description: "logo link" + required: false + default: 'false' + type: string + appname: + description: "app name" + required: true + default: 'rustdesk' + type: string + filename: + description: "Filename" + required: true + default: 'rustdesk' + type: string + extras: + description: "extra inputs in json" + required: true + default: '{}' + type: string + +env: + SCITER_RUST_VERSION: "1.75" # https://github.com/rustdesk/rustdesk/discussions/7503, also 1.78 has ABI change which causes our sciter version not working, https://blog.rust-lang.org/2024/03/30/i128-layout-update.html + RUST_VERSION: "1.75" # sciter failed on m1 with 1.78 because of https://blog.rust-lang.org/2024/03/30/i128-layout-update.html + MAC_RUST_VERSION: "1.81" # 1.81 is requred for macos, because of https://github.com/yury/cidre requires 1.81 + CARGO_NDK_VERSION: "3.1.2" + SCITER_ARMV7_CMAKE_VERSION: "3.29.7" + SCITER_NASM_DEBVERSION: "2.15.05-1" + LLVM_VERSION: "15.0.6" + FLUTTER_VERSION: "3.24.5" + ANDROID_FLUTTER_VERSION: "3.24.5" + # for arm64 linux because official Dart SDK does not work + FLUTTER_ELINUX_VERSION: "3.16.9" + TAG_NAME: "${{ inputs.upload-tag }}" + VCPKG_BINARY_SOURCES: "clear;x-gha,readwrite" + # vcpkg version: 2025.08.27 + # If we change the `VCPKG COMMIT_ID`, please remember: + # 1. Call `$VCPKG_ROOT/vcpkg x-update-baseline` to update the baseline in `vcpkg.json`. + # Or we may face build issue like + # https://github.com/rustdesk/rustdesk/actions/runs/14414119794/job/40427970174 + # 2. Update the `VCPKG_COMMIT_ID` in `ci.yml` and `playground.yml`. + VCPKG_COMMIT_ID: "120deac3062162151622ca4860575a33844ba10b" + ARMV7_VCPKG_COMMIT_ID: "6f29f12e82a8293156836ad81cc9bf5af41fe836" # 2025.01.13, got "/opt/artifacts/vcpkg/vcpkg: No such file or directory" with latest version + VERSION: "${{ fromJson(inputs.extras).version }}" + NDK_VERSION: "r27c" + #signing keys env variable checks + ANDROID_SIGNING_KEY: "${{ secrets.ANDROID_SIGNING_KEY }}" + MACOS_P12_BASE64: "${{ secrets.MACOS_P12_BASE64 }}" + UPLOAD_ARTIFACT: 'true' + SIGN_BASE_URL: "${{ secrets.SIGN_BASE_URL }}" + STATUS_URL: "${{ secrets.GENURL }}/updategh" + +jobs: + build-for-windows-sciter: + name: ${{ matrix.job.target }} (${{ matrix.job.os }}) + runs-on: ${{ matrix.job.os }} + # Temporarily disable this action due to additional test is needed. + # if: false + strategy: + fail-fast: false + matrix: + job: + # - { target: i686-pc-windows-msvc , os: windows-2022 } + # - { target: x86_64-pc-windows-gnu , os: windows-2022 } + - { + target: i686-pc-windows-msvc, + os: windows-2022, + arch: x86, + vcpkg-triplet: x86-windows-static, + } + # - { target: aarch64-pc-windows-msvc, os: windows-2022 } + steps: + - name: Export GitHub Actions cache environment variables + uses: actions/github-script@v6 + with: + script: | + core.exportVariable('ACTIONS_CACHE_URL', process.env.ACTIONS_CACHE_URL || ''); + core.exportVariable('ACTIONS_RUNTIME_TOKEN', process.env.ACTIONS_RUNTIME_TOKEN || ''); + + - name: Set rdgen value + if: ${{ fromJson(inputs.extras).rdgen == 'true' }} + run: | + echo "STATUS_URL=${{ secrets.GENURL }}/updategh" >> $env:GITHUB_ENV + + - name: Set rdgen value + if: ${{ fromJson(inputs.extras).rdgen == 'false' }} + run: | + echo "STATUS_URL=${{ inputs.apiServer }}/api/updategh" >> $env:GITHUB_ENV + + - name: Report Status + uses: fjogeleit/http-request-action@v1 + continue-on-error: true + with: + url: ${{ env.STATUS_URL }} + method: 'POST' + customHeaders: '{"Content-Type": "application/json"}' + data: '{"uuid": "${{ inputs.uuid }}", "status": "5% complete"}' + + - name: Checkout source code + if: ${{ env.VERSION != 'master' }} + uses: actions/checkout@v4 + with: + repository: rustdesk/rustdesk + ref: refs/tags/${{ env.VERSION }} + submodules: recursive + + - name: Checkout source code + if: ${{ env.VERSION == 'master' }} + uses: actions/checkout@v4 + with: + repository: rustdesk/rustdesk + submodules: recursive + + - name: Install ImageMagick on Windows + run: | + choco install -y imagemagick.app --no-progress + Get-ChildItem -Path "${env:ProgramFiles}" | % { $_.FullName } | Select-String -Pattern "[\/\\]ImageMagick[^\/\\]*$" | Out-File -Append -FilePath $env:GITHUB_PATH -Encoding utf8 + + - name: change appname to custom + if: inputs.appname != 'rustdesk' + continue-on-error: true + shell: bash + run: | + # ./Cargo.toml + sed -i -e 's|description = "RustDesk Remote Desktop"|description = "${{ inputs.appname }}"|' ./Cargo.toml + sed -i -e 's|ProductName = "RustDesk"|ProductName = "${{ inputs.appname }}"|' ./Cargo.toml + sed -i -e 's|FileDescription = "RustDesk Remote Desktop"|FileDescription = "${{ inputs.appname }}"|' ./Cargo.toml + sed -i -e 's|OriginalFilename = "rustdesk.exe"|OriginalFilename = "${{ inputs.appname }}.exe"|' ./Cargo.toml + # ./libs/portable/Cargo.toml + sed -i -e 's|description = "RustDesk Remote Desktop"|description = "${{ inputs.appname }}"|' ./libs/portable/Cargo.toml + sed -i -e 's|ProductName = "RustDesk"|ProductName = "${{ inputs.appname }}"|' ./libs/portable/Cargo.toml + sed -i -e 's|FileDescription = "RustDesk Remote Desktop"|FileDescription = "${{ inputs.appname }}"|' ./libs/portable/Cargo.toml + sed -i -e 's|OriginalFilename = "rustdesk.exe"|OriginalFilename = "${{ inputs.appname }}.exe"|' ./libs/portable/Cargo.toml + # ./src/lang/en.rs + find ./src/lang -name "*.rs" -exec sed -i -e 's|RustDesk|${{ inputs.appname }}|' {} \; + + - name: fix registry if appname has a space + if: contains(inputs.appname, ' ') + continue-on-error: true + shell: bash + run: | + #./src/platform/windows.rs + sed -i -e 's|reg add {}|reg add \\\"{}\\\"|' ./src/platform/windows.rs + sed -i -e 's|reg add HKEY_CLASSES_ROOT\\\\.{ext} /f|reg add \\\"HKEY_CLASSES_ROOT\\\\.{ext}\\\" /f|' ./src/platform/windows.rs + sed -i -e 's|reg add HKEY_CLASSES_ROOT\\\\.{ext}\\\\DefaultIcon /f|reg add \\\"HKEY_CLASSES_ROOT\\\\.{ext}\\\\DefaultIcon\\\" /f|' ./src/platform/windows.rs + sed -i -e 's|reg add HKEY_CLASSES_ROOT\\\\.{ext}\\\\shell /f|reg add \\\"HKEY_CLASSES_ROOT\\\\.{ext}\\\\shell\\\" /f|' ./src/platform/windows.rs + sed -i -e 's|reg add HKEY_CLASSES_ROOT\\\\.{ext}\\\\shell\\\\open /f|reg add \\\"HKEY_CLASSES_ROOT\\\\.{ext}\\\\shell\\\\open\\\" /f|' ./src/platform/windows.rs + sed -i -e 's|reg add HKEY_CLASSES_ROOT\\\\.{ext}\\\\shell\\\\open\\\\command|reg add \\\"HKEY_CLASSES_ROOT\\\\.{ext}\\\\shell\\\\open\\\\command\\\"|' ./src/platform/windows.rs + sed -i -e 's|reg add HKEY_CLASSES_ROOT\\\\{ext} /f|reg add \\\"HKEY_CLASSES_ROOT\\\\{ext}\\\" /f|' ./src/platform/windows.rs + sed -i -e 's|reg add HKEY_CLASSES_ROOT\\\\{ext}\\\\shell /f|reg add \\\"HKEY_CLASSES_ROOT\\\\{ext}\\\\shell\\\" /f|' ./src/platform/windows.rs + sed -i -e 's|reg add HKEY_CLASSES_ROOT\\\\{ext}\\\\shell\\\\open /f|reg add \\\"HKEY_CLASSES_ROOT\\\\{ext}\\\\shell\\\\open\\\" /f|' ./src/platform/windows.rs + sed -i -e 's|reg add HKEY_CLASSES_ROOT\\\\{ext}\\\\shell\\\\open\\\\command /f|reg add \\\"HKEY_CLASSES_ROOT\\\\{ext}\\\\shell\\\\open\\\\command\\\" /f|' ./src/platform/windows.rs + sed -i -e 's|{subkey}|\\\"{subkey}\\\"|' ./src/platform/windows.rs + sed -i -e 's|reg delete HKEY_CLASSES_ROOT\\\\.{ext} /f|reg delete \\\"HKEY_CLASSES_ROOT\\\\.{ext}\\\" /f|' ./src/platform/windows.rs + sed -i -e 's|reg delete HKEY_CLASSES_ROOT\\\\{ext} /f|reg delete \\\"HKEY_CLASSES_ROOT\\\\{ext}\\\" /f|' ./src/platform/windows.rs + + - name: change company name + if: fromJson(inputs.extras).compname != 'Purslane Ltd' + continue-on-error: true + shell: bash + run: | + sed -i -e 's|PURSLANE|${{ fromJson(inputs.extras).compname }}|' ./res/msi/preprocess.py + sed -i -e 's|Purslane Ltd|${{ fromJson(inputs.extras).compname }}|' ./res/msi/preprocess.py + sed -i -e 's|Copyright © 2025 Purslane Ltd.|Copyright \© 2025 ${{ fromJson(inputs.extras).compname }}|' ./src/ui/index.tis + sed -i -e 's|Purslane Ltd|${{ fromJson(inputs.extras).compname }}|' ./Cargo.toml + sed -i -e 's|Purslane Ltd|${{ fromJson(inputs.extras).compname }}|' ./libs/portable/Cargo.toml + sed -i -e 's|Purslane Ltd.|${{ fromJson(inputs.extras).compname }}|' ./res/setup.nsi + + - name: change url to custom + if: fromJson(inputs.extras).urlLink != 'https://rustdesk.com' + continue-on-error: true + shell: bash + run: | + sed -i -e 's|Homepage: https://rustdesk.com|Homepage: ${{ fromJson(inputs.extras).urlLink }}|' ./build.py + sed -i -e "s|
|
|" ./src/ui/index.tis + sed -i -e "s|
|
|" ./src/ui/index.tis + sed -i -e "s|https://rustdesk.com/|${{fromJson(inputs.extras).urlLink }}|" ./res/setup.nsi + + - name: change download link to custom + if: fromJson(inputs.extras).downloadLink != 'https://rustdesk.com/download' + continue-on-error: true + shell: bash + run: | + sed -i -e 's|https://rustdesk.com/download|${{ fromJson(inputs.extras).downloadLink }}|' ./src/ui/index.tis + + - name: set server, key, and apiserver + continue-on-error: true + shell: bash + run: | + sed -i -e 's|rs-ny.rustdesk.com|${{ inputs.server }}|' ./libs/hbb_common/src/config.rs + sed -i -e 's|OeVuKk5nlHiXp+APNn0Y3pC1Iwpwn44JGqrQCsWqmBw=|${{ inputs.key }}|' ./libs/hbb_common/src/config.rs + sed -i -e 's|https://admin.rustdesk.com|${{ inputs.apiServer }}|' ./src/common.rs + sed -i -e 's|{translate("Ready")}, {translate("setup_server_tip")}|translate("Ready")|' ./src/ui/index.tis + + - name: allow custom.txt + continue-on-error: true + run: | + Invoke-WebRequest -Uri https://raw.githubusercontent.com/bryangerlach/rdgen/refs/heads/master/.github/patches/allowCustom.diff -OutFile allowCustom.diff + git apply allowCustom.diff + + - name: Install LLVM and Clang + uses: rustdesk-org/install-llvm-action-32bit@master + with: + version: ${{ env.LLVM_VERSION }} + + - name: Report Status + uses: fjogeleit/http-request-action@v1 + continue-on-error: true + with: + url: ${{ env.STATUS_URL }} + method: 'POST' + customHeaders: '{"Content-Type": "application/json"}' + data: '{"uuid": "${{ inputs.uuid }}", "status": "10% complete"}' + + - name: Install Rust toolchain + uses: dtolnay/rust-toolchain@v1 + with: + toolchain: nightly-2023-10-13-${{ matrix.job.target }} # must use nightly here, because of abi_thiscall feature required + targets: ${{ matrix.job.target }} + components: "rustfmt" + + - uses: Swatinem/rust-cache@v2 + with: + prefix-key: ${{ matrix.job.os }}-sciter + + - name: Report Status + uses: fjogeleit/http-request-action@v1 + continue-on-error: true + with: + url: ${{ env.STATUS_URL }} + method: 'POST' + customHeaders: '{"Content-Type": "application/json"}' + data: '{"uuid": "${{ inputs.uuid }}", "status": "20% complete"}' + + - name: Setup vcpkg with Github Actions binary cache + uses: lukka/run-vcpkg@v11 + with: + vcpkgDirectory: C:\vcpkg + vcpkgGitCommitId: ${{ env.VCPKG_COMMIT_ID }} + doNotCache: false + + - name: Install vcpkg dependencies + env: + VCPKG_DEFAULT_HOST_TRIPLET: ${{ matrix.job.vcpkg-triplet }} + run: | + if ! $VCPKG_ROOT/vcpkg \ + install \ + --triplet ${{ matrix.job.vcpkg-triplet }} \ + --x-install-root="$VCPKG_ROOT/installed"; then + find "${VCPKG_ROOT}/" -name "*.log" | while read -r _1; do + echo "$_1:" + echo "======" + cat "$_1" + echo "======" + echo "" + done + exit 1 + fi + head -n 100 "${VCPKG_ROOT}/buildtrees/ffmpeg/build-${{ matrix.job.vcpkg-triplet }}-rel-out.log" || true + shell: bash + + - name: icon stuff + if: ${{ inputs.iconlink != 'false' }} + continue-on-error: true + shell: bash + run: | + mv ./res/icon.ico ./res/icon.ico.bak + mv ./res/icon.png ./res/icon.png.bak + mv ./res/tray-icon.ico ./res/tray-icon.ico.bak + + - name: magick stuff + if: ${{ inputs.iconlink != 'false' }} + continue-on-error: true + run: | + Invoke-WebRequest -Uri ${{ fromJson(inputs.iconlink).url }}/get_png?filename=${{ fromJson(inputs.iconlink).file }}"&"uuid=${{ fromJson(inputs.iconlink).uuid }} -OutFile ./res/icon.png + mv ./res/32x32.png ./res/32x32.png.bak + mv ./res/64x64.png ./res/64x64.png.bak + mv ./res/128x128.png ./res/128x128.png.bak + mv ./res/128x128@2x.png ./res/128x128@2x.png.bak + magick ./res/icon.png -define icon:auto-resize=256,64,48,32,16 ./res/icon.ico + cp ./res/icon.ico ./res/tray-icon.ico + magick ./res/icon.png -resize 32x32 ./res/32x32.png + magick ./res/icon.png -resize 64x64 ./res/64x64.png + magick ./res/icon.png -resize 128x128 ./res/128x128.png + magick ./res/128x128.png -resize 200% ./res/128x128@2x.png + + + - name: ui.rs icon + if: ${{ inputs.iconlink != 'false' }} + continue-on-error: true + shell: bash + run: | + cp ./src/ui.rs ./src/ui.rs.bak + b64=$(base64 -w0 < ./res/icon.png) + sed -i -e "s|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|$(echo $b64)|" ./src/ui.rs + b64="" + + - name: fix connection delay + continue-on-error: true + if: ${{ fromJson(inputs.extras).delayFix == 'true' }} + shell: bash + run: | + sed -i -e 's|!key.is_empty()|false|' ./src/client.rs + + - name: removeNewVersionNotif + continue-on-error: true + if: fromJson(inputs.extras).removeNewVersionNotif == 'true' + shell: bash + run: | + sed -i -e 's|{software_update_url ? : ""}||' ./src/ui/index.tis + sed -i '/let (request, url) =/,/Ok(())/{/Ok(())/!d}' ./src/common.rs + + - name: Report Status + uses: fjogeleit/http-request-action@v1 + continue-on-error: true + with: + url: ${{ env.STATUS_URL }} + method: 'POST' + customHeaders: '{"Content-Type": "application/json"}' + data: '{"uuid": "${{ inputs.uuid }}", "status": "50% complete, this step takes about 5 minutes, be patient."}' + + - name: Build rustdesk + id: build + shell: bash + run: | + python3 res/inline-sciter.py + # Patch sciter x86 + sed -i 's/branch = "dyn"/branch = "dyn_x86"/g' ./Cargo.toml + cargo build --features inline,vram,hwcodec --release --bins + mkdir -p ./Release + mv ./target/release/rustdesk.exe ./Release/rustdesk.exe + curl -LJ -o ./Release/sciter.dll https://github.com/c-smile/sciter-sdk/raw/master/bin.win/x32/sciter.dll + echo "output_folder=./Release" >> $GITHUB_OUTPUT + curl -LJ -o ./usbmmidd_v2.zip https://github.com/rustdesk-org/rdev/releases/download/usbmmidd_v2/usbmmidd_v2.zip + unzip usbmmidd_v2.zip + # Do not remove x64 files, because the user may run the 32bit version on a 64bit system. + # Do not remove ./usbmmidd_v2/deviceinstaller64.exe, as x86 exe cannot install and uninstall drivers when running on x64, + # we need the x64 exe to install and uninstall the driver. + rm -rf ./usbmmidd_v2/deviceinstaller.exe ./usbmmidd_v2/usbmmidd.bat + mv ./usbmmidd_v2 ./Release || true + + - name: find Runner.res + # Windows: find Runner.res (compiled from ./flutter/windows/runner/Runner.rc), copy to ./Runner.res + # Runner.rc does not contain actual version, but Runner.res does + continue-on-error: true + shell: bash + run: | + runner_res=$(find . -name "Runner.res"); + if [ "$runner_res" == "" ]; then + echo "Runner.res: not found"; + else + echo "Runner.res: $runner_res"; + cp $runner_res ./libs/portable/Runner.res; + echo "list ./libs/portable/Runner.res"; + ls -l ./libs/portable/Runner.res; + fi + + - name: Report Status + uses: fjogeleit/http-request-action@v1 + continue-on-error: true + with: + url: ${{ env.STATUS_URL }} + method: 'POST' + customHeaders: '{"Content-Type": "application/json"}' + data: '{"uuid": "${{ inputs.uuid }}", "status": "70% complete, this step takes about 5 minutes, be patient."}' + + - name: zip dlls + continue-on-error: true + shell: pwsh + run: | + Compress-Archive -Path ./Release/*.dll, ./Release/*.exe -DestinationPath ./Release/unsigned_files.zip -CompressionLevel Fastest + + - name: sign dlls + continue-on-error: true + shell: bash + run: | + if [ ! -z "${{ secrets.SIGN_BASE_URL }}" ] && [ ! -z "${{ secrets.SIGN_API_KEY }}" ]; then + curl -X POST -F "file=@./Release/unsigned_files.zip" \ + -H "X-API-KEY: ${{ secrets.SIGN_API_KEY }}" \ + -m 900 \ + "${{ secrets.SIGN_BASE_URL }}/sign/" -o ./Release/signed_files.zip + else + echo "Signing skipped - signing URL or API key not configured" + cp ./Release/unsigned_files.zip ./Release/signed_files.zip + fi + + - name: unzip dlls + continue-on-error: true + shell: pwsh + run: | + Expand-Archive -Path ./Release/signed_files.zip -DestinationPath ./Release/ -Force + Remove-Item ./Release/unsigned_files.zip + Remove-Item ./Release/signed_files.zip + + - name: Create custom.txt file + shell: bash + run: | + echo -n "${{ inputs.custom }}" | cat > ./Release/custom.txt + + - name: Build self-extracted executable + shell: bash + run: | + mv "./Release/rustdesk.exe" "./Release/${{ inputs.appname }}.exe" || echo "rustdesk.exe" + sed -i '/dpiAware/d' res/manifest.xml + pushd ./libs/portable + pip3 install -r requirements.txt + python3 ./generate.py -f ../../Release/ -o . -e "../../Release/${{ inputs.appname }}.exe" + popd + mkdir -p ./SignOutput + mv ./target/release/rustdesk-portable-packer.exe "./SignOutput/rustdesk.exe" + + - name: Report Status + uses: fjogeleit/http-request-action@v1 + continue-on-error: true + with: + url: ${{ env.STATUS_URL }} + method: 'POST' + customHeaders: '{"Content-Type": "application/json"}' + data: '{"uuid": "${{ inputs.uuid }}", "status": "85% complete"}' + + - name: zip exe + continue-on-error: true + shell: pwsh + run: | + Compress-Archive -Path ./SignOutput/*.exe -DestinationPath ./SignOutput/unsigned_files.zip -CompressionLevel Fastest + + - name: sign exe + continue-on-error: true + shell: bash + run: | + if [ ! -z "${{ secrets.SIGN_BASE_URL }}" ] && [ ! -z "${{ secrets.SIGN_API_KEY }}" ]; then + curl -X POST -F "file=@./SignOutput/unsigned_files.zip" \ + -H "X-API-KEY: ${{ secrets.SIGN_API_KEY }}" \ + -m 900 \ + "${{ secrets.SIGN_BASE_URL }}/sign/" -o ./SignOutput/signed_files.zip + else + echo "Signing skipped - signing URL or API key not configured" + cp ./SignOutput/unsigned_files.zip ./SignOutput/signed_files.zip + fi + + - name: unzip exe + continue-on-error: true + shell: pwsh + run: | + Expand-Archive -Path ./SignOutput/signed_files.zip -DestinationPath ./SignOutput/ -Force + Remove-Item ./SignOutput/unsigned_files.zip + Remove-Item ./SignOutput/signed_files.zip + + - name: rename rustdesk.exe to filename.exe + run: | + mv ./SignOutput/rustdesk.exe "./SignOutput/${{ inputs.filename }}.exe" || echo "rustdesk" + + - name: send file to rdgen server + if: ${{ fromJson(inputs.extras).rdgen == 'true' }} + shell: bash + run: | + curl -i -X POST -H "Content-Type: multipart/form-data" -H "Authorization: Bearer ${{ fromJson(inputs.extras).token }}" -F "file=@./SignOutput/${{ inputs.filename }}.exe" -F "uuid=${{ inputs.uuid }}" ${{ secrets.GENURL }}/save_custom_client + + - name: send file to api server + if: ${{ fromJson(inputs.extras).rdgen == 'false' }} + shell: bash + run: | + curl -i -X POST -H "Content-Type: multipart/form-data" -H "Authorization: Bearer ${{ fromJson(inputs.extras).token }}" -F "file=@./SignOutput/${{ inputs.filename }}.exe" ${{ inputs.apiServer }}/api/save_custom_client + + - name: Report Status + uses: fjogeleit/http-request-action@v1 + with: + url: ${{ env.STATUS_URL }} + method: 'POST' + customHeaders: '{"Content-Type": "application/json"}' + data: '{"uuid": "${{ inputs.uuid }}", "status": "Success"}' + + - name: failed + if: failure() + uses: fjogeleit/http-request-action@v1 + with: + url: ${{ env.STATUS_URL }} + method: 'POST' + customHeaders: '{"Content-Type": "application/json"}' + data: '{"uuid": "${{ inputs.uuid }}", "status": "Generation failed, try again"}' + + - name: failed + if: cancelled() + uses: fjogeleit/http-request-action@v1 + with: + url: ${{ env.STATUS_URL }} + method: 'POST' + customHeaders: '{"Content-Type": "application/json"}' + data: '{"uuid": "${{ inputs.uuid }}", "status": "Generation cancelled, try again"}' -- 2.49.1 From fabbc91fae92a70d908b94bc255144162f8fc33a Mon Sep 17 00:00:00 2001 From: Maxetto Date: Fri, 5 Sep 2025 12:08:32 +0200 Subject: [PATCH 25/66] Add x86 in Forms --- rdgenerator/forms.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/rdgenerator/forms.py b/rdgenerator/forms.py index 9adb080..07f3818 100644 --- a/rdgenerator/forms.py +++ b/rdgenerator/forms.py @@ -3,7 +3,7 @@ from PIL import Image class GenerateForm(forms.Form): #Platform - platform = forms.ChoiceField(choices=[('windows','Windows'),('linux','Linux (currently unavailable)'),('android','Android'),('macos','macOS')], initial='windows') + platform = forms.ChoiceField(choices=[('windows','Windows 64Bit'),('windows-x86','Windows 32Bit'),('linux','Linux (currently unavailable)'),('android','Android'),('macos','macOS')], initial='windows') version = forms.ChoiceField(choices=[('master','nightly'),('1.4.1','1.4.1'),('1.4.0','1.4.0'),('1.3.9','1.3.9'),('1.3.8','1.3.8'),('1.3.7','1.3.7'),('1.3.6','1.3.6'),('1.3.5','1.3.5'),('1.3.4','1.3.4'),('1.3.3','1.3.3')], initial='1.4.1') help_text="'master' is the development version (nightly build) with the latest features but may be less stable" delayFix = forms.BooleanField(initial=True, required=False) @@ -66,6 +66,7 @@ class GenerateForm(forms.Form): enableRecording = forms.BooleanField(initial=True, required=False) enableBlockingInput = forms.BooleanField(initial=True, required=False) enableRemoteModi = forms.BooleanField(initial=False, required=False) + hidecm = forms.BooleanField(initial=False, required=False) #Other removeWallpaper = forms.BooleanField(initial=True, required=False) @@ -76,7 +77,6 @@ class GenerateForm(forms.Form): #custom added features cycleMonitor = forms.BooleanField(initial=False, required=False) xOffline = forms.BooleanField(initial=False, required=False) - hidecm = forms.BooleanField(initial=False, required=False) removeNewVersionNotif = forms.BooleanField(initial=False, required=False) def clean_iconfile(self): -- 2.49.1 From 668998e390c6d20c74680023701a659cbc06ada2 Mon Sep 17 00:00:00 2001 From: Maxetto Date: Fri, 5 Sep 2025 12:12:48 +0200 Subject: [PATCH 26/66] Update Views --- rdgenerator/views.py | 29 ++++++++++++++++++++--------- 1 file changed, 20 insertions(+), 9 deletions(-) diff --git a/rdgenerator/views.py b/rdgenerator/views.py index ccf6242..b99e147 100644 --- a/rdgenerator/views.py +++ b/rdgenerator/views.py @@ -119,14 +119,18 @@ def generator_view(request): decodedCustom['password'] = permPass if theme != "system": if themeDorO == "default": - decodedCustom['default-settings']['theme'] = theme + if platform == "windows-x86": + decodedCustom['default-settings']['allow-darktheme'] = 'Y' if theme == "dark" else 'N' + else: + decodedCustom['default-settings']['theme'] = theme elif themeDorO == "override": - decodedCustom['override-settings']['theme'] = theme - #decodedCustom['approve-mode'] = passApproveMode + if platform == "windows-x86": + decodedCustom['override-settings']['allow-darktheme'] = 'Y' if theme == "dark" else 'N' + else: + decodedCustom['override-settings']['theme'] = theme decodedCustom['enable-lan-discovery'] = 'N' if denyLan else 'Y' #decodedCustom['direct-server'] = 'Y' if enableDirectIP else 'N' decodedCustom['allow-auto-disconnect'] = 'Y' if autoClose else 'N' - decodedCustom['allow-remove-wallpaper'] = 'Y' if removeWallpaper else 'N' if permissionsDorO == "default": decodedCustom['default-settings']['access-mode'] = permissionsType decodedCustom['default-settings']['enable-keyboard'] = 'Y' if enableKeyboard else 'N' @@ -139,9 +143,10 @@ def generator_view(request): decodedCustom['default-settings']['enable-block-input'] = 'Y' if enableBlockingInput else 'N' decodedCustom['default-settings']['allow-remote-config-modification'] = 'Y' if enableRemoteModi else 'N' decodedCustom['default-settings']['direct-server'] = 'Y' if enableDirectIP else 'N' - decodedCustom['default-settings']['hide-cm'] = 'Y' if hidecm else 'N' decodedCustom['default-settings']['verification-method'] = 'use-permanent-password' if hidecm else 'use-both-passwords' decodedCustom['default-settings']['approve-mode'] = passApproveMode + decodedCustom['default-settings']['allow-hide-cm'] = 'Y' if hidecm else 'N' + decodedCustom['default-settings']['allow-remove-wallpaper'] = 'Y' if removeWallpaper else 'N' else: decodedCustom['override-settings']['access-mode'] = permissionsType decodedCustom['override-settings']['enable-keyboard'] = 'Y' if enableKeyboard else 'N' @@ -153,6 +158,11 @@ def generator_view(request): decodedCustom['override-settings']['enable-record-session'] = 'Y' if enableRecording else 'N' decodedCustom['override-settings']['enable-block-input'] = 'Y' if enableBlockingInput else 'N' decodedCustom['override-settings']['allow-remote-config-modification'] = 'Y' if enableRemoteModi else 'N' + decodedCustom['override-settings']['direct-server'] = 'Y' if enableDirectIP else 'N' + decodedCustom['override-settings']['verification-method'] = 'use-permanent-password' if hidecm else 'use-both-passwords' + decodedCustom['override-settings']['approve-mode'] = passApproveMode + decodedCustom['override-settings']['allow-hide-cm'] = 'Y' if hidecm else 'N' + decodedCustom['override-settings']['allow-remove-wallpaper'] = 'Y' if removeWallpaper else 'N' for line in defaultManual.splitlines(): k, value = line.split('=') @@ -179,16 +189,17 @@ def generator_view(request): extras['rdgen'] = 'true' extras['cycleMonitor'] = 'true' if cycleMonitor else 'false' extras['xOffline'] = 'true' if xOffline else 'false' - extras['hidecm'] = 'true' if hidecm else 'false' extras['removeNewVersionNotif'] = 'true' if removeNewVersionNotif else 'false' extras['compname'] = compname extra_input = json.dumps(extras) ####from here run the github action, we need user, repo, access token. if platform == 'windows': - url = 'https://api.github.com/repos/'+_settings.GHUSER+'/'+_settings.REPONAME+'/actions/workflows/generator-windows.yml/dispatches' + url = 'https://api.github.com/repos/'+_settings.GHUSER+'/'+_settings.REPONAME+'/actions/workflows/generator-windows.yml/dispatches' + if platform == 'windows-x86': + url = 'https://api.github.com/repos/'+_settings.GHUSER+'/'+_settings.REPONAME+'/actions/workflows/generator-windows-x86.yml/dispatches' elif platform == 'linux': - url = 'https://api.github.com/repos/'+_settings.GHUSER+'/'+_settings.REPONAME+'/actions/workflows/generator-linux.yml/dispatches' + url = 'https://api.github.com/repos/'+_settings.GHUSER+'/'+_settings.REPONAME+'/actions/workflows/generator-linux.yml/dispatches' elif platform == 'android': url = 'https://api.github.com/repos/'+_settings.GHUSER+'/'+_settings.REPONAME+'/actions/workflows/generator-android.yml/dispatches' elif platform == 'macos': @@ -392,4 +403,4 @@ def save_custom_client(request): for chunk in file.chunks(): f.write(chunk) - return HttpResponse("File saved successfully!") \ No newline at end of file + return HttpResponse("File saved successfully!") -- 2.49.1 From be47bcbe466020e3c0320e08b640b29f5efbb8a0 Mon Sep 17 00:00:00 2001 From: Maxetto Date: Fri, 5 Sep 2025 12:14:05 +0200 Subject: [PATCH 27/66] Update Generated page --- rdgenerator/templates/generated.html | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/rdgenerator/templates/generated.html b/rdgenerator/templates/generated.html index 609a407..5f7ecce 100644 --- a/rdgenerator/templates/generated.html +++ b/rdgenerator/templates/generated.html @@ -129,6 +129,8 @@ {% if platform == 'windows' %} Download {{filename}}.exe Download {{filename}}.msi + {% elif platform == 'windows-x86' %} + Download {{filename}}.exe {% elif platform == 'linux' %} Download {{filename}}-x86_64.deb Download {{filename}}-x86_64.rpm @@ -177,7 +179,7 @@ platformLogos.macos.style.display = 'block'; platformNote.textContent = 'Note: For macOS, you may need to adjust security settings to run the application.'; platformNote.style.display = 'block'; - } else if (platform === 'windows') { + } else if (platform === 'windows' || platform === 'windows-x86') { document.getElementById('pageTitle').textContent = 'Windows Build Generated'; platformLogos.windows.style.display = 'block'; platformNote.textContent = 'Note: You might need to disable SmartScreen or adjust Windows security settings.'; @@ -199,4 +201,4 @@ updatePlatformUI(); -{{ ... }} \ No newline at end of file +{{ ... }} -- 2.49.1 From 23e91a5ea7f9178df1142f378c5edc847c20ce4d Mon Sep 17 00:00:00 2001 From: Maxetto Date: Fri, 5 Sep 2025 12:16:40 +0200 Subject: [PATCH 28/66] Update Generator Page --- rdgenerator/templates/generator.html | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/rdgenerator/templates/generator.html b/rdgenerator/templates/generator.html index 44dee9e..1c70d96 100644 --- a/rdgenerator/templates/generator.html +++ b/rdgenerator/templates/generator.html @@ -233,7 +233,8 @@