From 902152b257b1eccad4ce0cf94b4a4f347dd6752e Mon Sep 17 00:00:00 2001 From: Allen Houchins <32207388+allenhouchins@users.noreply.github.com> Date: Mon, 1 Dec 2025 10:12:51 -0600 Subject: [PATCH] Add GitHub Desktop as a Windows FMA (#36444) --- cmd/maintained-apps/validate/windows.go | 7 ++++++ .../inputs/winget/github-desktop.json | 10 ++++++++ ee/maintained-apps/outputs/apps.json | 7 ++++++ .../outputs/github-desktop/windows.json | 22 ++++++++++++++++++ .../app-icon-github-desktop-60x60@2x.png | Bin 0 -> 15489 bytes 5 files changed, 46 insertions(+) create mode 100644 ee/maintained-apps/inputs/winget/github-desktop.json create mode 100644 ee/maintained-apps/outputs/github-desktop/windows.json create mode 100644 website/assets/images/app-icon-github-desktop-60x60@2x.png diff --git a/cmd/maintained-apps/validate/windows.go b/cmd/maintained-apps/validate/windows.go index b71ec19498..5e1332d926 100644 --- a/cmd/maintained-apps/validate/windows.go +++ b/cmd/maintained-apps/validate/windows.go @@ -9,6 +9,7 @@ import ( "os" "os/exec" "path/filepath" + "strings" "time" "github.com/fleetdm/fleet/v4/orbit/pkg/constant" @@ -75,9 +76,15 @@ func appExists(ctx context.Context, logger kitlog.Logger, appName, _, appVersion result.Name = software.Name level.Info(logger).Log("msg", fmt.Sprintf("Found app: '%s' at %s, Version: %s", result.Name, result.InstallLocation, result.Version)) + // Check exact match first if result.Version == appVersion { return true, nil } + // Check if found version starts with expected version (handles suffixes like ".0") + // This handles cases where the app version is "3.5.4.0" but expected is "3.5.4" + if strings.HasPrefix(result.Version, appVersion+".") { + return true, nil + } } } diff --git a/ee/maintained-apps/inputs/winget/github-desktop.json b/ee/maintained-apps/inputs/winget/github-desktop.json new file mode 100644 index 0000000000..0e19934730 --- /dev/null +++ b/ee/maintained-apps/inputs/winget/github-desktop.json @@ -0,0 +1,10 @@ +{ + "name": "GitHub Desktop", + "slug": "github-desktop/windows", + "package_identifier": "GitHub.GitHubDesktop", + "unique_identifier": "GitHub Desktop", + "installer_arch": "x64", + "installer_type": "msi", + "installer_scope": "machine", + "default_categories": ["Developer tools"] +} diff --git a/ee/maintained-apps/outputs/apps.json b/ee/maintained-apps/outputs/apps.json index 4d075a5ebb..8b060bb1a7 100644 --- a/ee/maintained-apps/outputs/apps.json +++ b/ee/maintained-apps/outputs/apps.json @@ -309,6 +309,13 @@ "unique_identifier": "Mozilla Firefox (x64 en-US)", "description": "Firefox is a powerful, open-source web browser built for speed, privacy, and customization." }, + { + "name": "GitHub Desktop", + "slug": "github-desktop/windows", + "platform": "windows", + "unique_identifier": "GitHub Desktop", + "description": "GitHub Desktop is a desktop client for GitHub repositories." + }, { "name": "GitHub Desktop", "slug": "github/darwin", diff --git a/ee/maintained-apps/outputs/github-desktop/windows.json b/ee/maintained-apps/outputs/github-desktop/windows.json new file mode 100644 index 0000000000..ede2ec0055 --- /dev/null +++ b/ee/maintained-apps/outputs/github-desktop/windows.json @@ -0,0 +1,22 @@ +{ + "versions": [ + { + "version": "3.5.4", + "queries": { + "exists": "SELECT 1 FROM programs WHERE name = 'GitHub Desktop' AND publisher = 'GitHub, Inc.';" + }, + "installer_url": "https://desktop.githubusercontent.com/releases/3.5.4-9dfb8d8d/GitHubDesktopSetup-x64.msi", + "install_script_ref": "8959087b", + "uninstall_script_ref": "b336b955", + "sha256": "ecf65cb2074b5b4be2f1c7e087de7551d38d57fdefc68a6c0697e708d6cf8eab", + "default_categories": [ + "Developer tools" + ], + "upgrade_code": "{00D8E2EE-13EA-5BEB-87F0-70EFC46A7D4A}" + } + ], + "refs": { + "8959087b": "$logFile = \"${env:TEMP}/fleet-install-software.log\"\n\ntry {\n\n$installProcess = Start-Process msiexec.exe `\n -ArgumentList \"/quiet /norestart /lv ${logFile} /i `\"${env:INSTALLER_PATH}`\"\" `\n -PassThru -Verb RunAs -Wait\n\nGet-Content $logFile -Tail 500\n\nExit $installProcess.ExitCode\n\n} catch {\n Write-Host \"Error: $_\"\n Exit 1\n}\n", + "b336b955": "# Fleet uninstalls app by finding all related product codes for the specified upgrade code\n$inst = New-Object -ComObject \"WindowsInstaller.Installer\"\n$timeoutSeconds = 300 # 5 minute timeout per product\n\nforeach ($product_code in $inst.RelatedProducts(\"{00D8E2EE-13EA-5BEB-87F0-70EFC46A7D4A}\")) {\n $process = Start-Process msiexec -ArgumentList @(\"/quiet\", \"/x\", $product_code, \"/norestart\") -PassThru\n \n # Wait for process with timeout\n $completed = $process.WaitForExit($timeoutSeconds * 1000)\n \n if (-not $completed) {\n Stop-Process -Id $process.Id -Force -ErrorAction SilentlyContinue\n Exit 1603 # ERROR_UNINSTALL_FAILURE\n }\n \n # If the uninstall failed, bail\n if ($process.ExitCode -ne 0) {\n Write-Output \"Uninstall for $($product_code) exited $($process.ExitCode)\"\n Exit $process.ExitCode\n }\n}\n\n# All uninstalls succeeded; exit success\nExit 0\n" + } +} diff --git a/website/assets/images/app-icon-github-desktop-60x60@2x.png b/website/assets/images/app-icon-github-desktop-60x60@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..af753942176468129bd206bf0fe22c257b987a49 GIT binary patch literal 15489 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 literal 0 HcmV?d00001