From e494df784604f474447e7a05a71fa4f0d62b66ab Mon Sep 17 00:00:00 2001 From: Allen Houchins <32207388+allenhouchins@users.noreply.github.com> Date: Thu, 20 Nov 2025 17:30:50 -0600 Subject: [PATCH] Add GitHub Desktop to macOS FMA library (#36066) **Related issue:** Resolves # # Checklist for submitter If some of the following don't apply, delete the relevant line. - [ ] Changes file added for user-visible changes in `changes/`, `orbit/changes/` or `ee/fleetd-chrome/changes`. See [Changes files](https://github.com/fleetdm/fleet/blob/main/docs/Contributing/guides/committing-changes.md#changes-files) for more information. - [ ] Input data is properly validated, `SELECT *` is avoided, SQL injection is prevented (using placeholders for values in statements) - [ ] If paths of existing endpoints are modified without backwards compatibility, checked the frontend/CLI for any necessary changes ## Testing - [ ] Added/updated automated tests - [ ] Where appropriate, [automated tests simulate multiple hosts and test for host isolation](https://github.com/fleetdm/fleet/blob/main/docs/Contributing/reference/patterns-backend.md#unit-testing) (updates to one hosts's records do not affect another) - [ ] QA'd all new/changed functionality manually For unreleased bug fixes in a release candidate, one of: - [ ] Confirmed that the fix is not expected to adversely impact load test results - [ ] Alerted the release DRI if additional load testing is needed ## Database migrations - [ ] Checked schema for all modified table for columns that will auto-update timestamps during migration. - [ ] Confirmed that updating the timestamps is acceptable, and will not cause unwanted side effects. - [ ] Ensured the correct collation is explicitly set for character columns (`COLLATE utf8mb4_unicode_ci`). ## New Fleet configuration settings - [ ] Setting(s) is/are explicitly excluded from GitOps If you didn't check the box above, follow this checklist for GitOps-enabled settings: - [ ] Verified that the setting is exported via `fleetctl generate-gitops` - [ ] Verified the setting is documented in a separate PR to [the GitOps documentation](https://github.com/fleetdm/fleet/blob/main/docs/Configuration/yaml-files.md#L485) - [ ] Verified that the setting is cleared on the server if it is not supplied in a YAML file (or that it is documented as being optional) - [ ] Verified that any relevant UI is disabled when GitOps mode is enabled ## fleetd/orbit/Fleet Desktop - [ ] Verified compatibility with the latest released version of Fleet (see [Must rule](https://github.com/fleetdm/fleet/blob/main/docs/Contributing/workflows/fleetd-development-and-release-strategy.md)) - [ ] If the change applies to only one platform, confirmed that `runtime.GOOS` is used as needed to isolate changes - [ ] Verified that fleetd runs on macOS, Linux and Windows - [ ] Verified auto-update works from the released version of component to the new version (see [tools/tuf/test](../tools/tuf/test/README.md)) --- .../github_desktop_version_shortener.go | 25 ++++++++++++++++++ .../ingesters/homebrew/external_refs/main.go | 1 + .../inputs/homebrew/github.json | 8 ++++++ ee/maintained-apps/outputs/apps.json | 7 +++++ ee/maintained-apps/outputs/github/darwin.json | 21 +++++++++++++++ .../components/icons/GitHubDesktop.tsx | 14 ++++++++++ .../images/app-icon-github-60x60@2x.png | Bin 15056 -> 15489 bytes 7 files changed, 76 insertions(+) create mode 100644 ee/maintained-apps/ingesters/homebrew/external_refs/github_desktop_version_shortener.go create mode 100644 ee/maintained-apps/inputs/homebrew/github.json create mode 100644 ee/maintained-apps/outputs/github/darwin.json create mode 100644 frontend/pages/SoftwarePage/components/icons/GitHubDesktop.tsx diff --git a/ee/maintained-apps/ingesters/homebrew/external_refs/github_desktop_version_shortener.go b/ee/maintained-apps/ingesters/homebrew/external_refs/github_desktop_version_shortener.go new file mode 100644 index 0000000000..cc864f52e0 --- /dev/null +++ b/ee/maintained-apps/ingesters/homebrew/external_refs/github_desktop_version_shortener.go @@ -0,0 +1,25 @@ +package externalrefs + +import ( + "fmt" + "strings" + + maintained_apps "github.com/fleetdm/fleet/v4/ee/maintained-apps" +) + +// GitHubDesktopVersionShortener strips the git commit hash from GitHub Desktop versions. +// Homebrew provides versions like "3.5.4-9dfb8d8d", but osquery reports "3.5.4". +// This transformer extracts just the semantic version part. +func GitHubDesktopVersionShortener(app *maintained_apps.FMAManifestApp) (*maintained_apps.FMAManifestApp, error) { + homebrewVersion := app.Version + + // Split on '-' and take the first part (the semantic version) + parts := strings.Split(homebrewVersion, "-") + if len(parts) > 0 && parts[0] != "" { + app.Version = parts[0] + } else { + return app, fmt.Errorf("Expected GitHub Desktop version to contain a semantic version but found '%s'", homebrewVersion) + } + + return app, nil +} diff --git a/ee/maintained-apps/ingesters/homebrew/external_refs/main.go b/ee/maintained-apps/ingesters/homebrew/external_refs/main.go index e247da70ff..2197463eca 100644 --- a/ee/maintained-apps/ingesters/homebrew/external_refs/main.go +++ b/ee/maintained-apps/ingesters/homebrew/external_refs/main.go @@ -15,6 +15,7 @@ var Funcs = map[string][]func(*maintained_apps.FMAManifestApp) (*maintained_apps "omnissa-horizon-client/darwin": {OmnissaHorizonVersionShortener}, "cisco-jabber/darwin": {CiscoJabberVersionTransformer}, "parallels/darwin": {ParallelsVersionShortener}, + "github/darwin": {GitHubDesktopVersionShortener}, } func ChromePKGInstaller(app *maintained_apps.FMAManifestApp) (*maintained_apps.FMAManifestApp, error) { diff --git a/ee/maintained-apps/inputs/homebrew/github.json b/ee/maintained-apps/inputs/homebrew/github.json new file mode 100644 index 0000000000..6a8bfa2aba --- /dev/null +++ b/ee/maintained-apps/inputs/homebrew/github.json @@ -0,0 +1,8 @@ +{ + "name": "GitHub Desktop", + "unique_identifier": "com.github.GitHubClient", + "token": "github", + "installer_format": "zip", + "slug": "github/darwin", + "default_categories": ["Developer tools"] +} diff --git a/ee/maintained-apps/outputs/apps.json b/ee/maintained-apps/outputs/apps.json index a051307c9a..64c2d6d908 100644 --- a/ee/maintained-apps/outputs/apps.json +++ b/ee/maintained-apps/outputs/apps.json @@ -240,6 +240,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/darwin", + "platform": "darwin", + "unique_identifier": "com.github.GitHubClient", + "description": "GitHub Desktop is a desktop client for GitHub repositories." + }, { "name": "GitKraken", "slug": "gitkraken/darwin", diff --git a/ee/maintained-apps/outputs/github/darwin.json b/ee/maintained-apps/outputs/github/darwin.json new file mode 100644 index 0000000000..482ea691d0 --- /dev/null +++ b/ee/maintained-apps/outputs/github/darwin.json @@ -0,0 +1,21 @@ +{ + "versions": [ + { + "version": "3.5.4", + "queries": { + "exists": "SELECT 1 FROM apps WHERE bundle_identifier = 'com.github.GitHubClient';" + }, + "installer_url": "https://desktop.githubusercontent.com/releases/3.5.4-9dfb8d8d/GitHubDesktop-arm64.zip", + "install_script_ref": "8992a57a", + "uninstall_script_ref": "e8252f2a", + "sha256": "34c76f8cbd58771ce7c9e4b7440708502cf9c6921fe099261ec08a413d72de8b", + "default_categories": [ + "Developer tools" + ] + } + ], + "refs": { + "8992a57a": "#!/bin/sh\n\n# variables\nAPPDIR=\"/Applications/\"\nTMPDIR=$(dirname \"$(realpath $INSTALLER_PATH)\")\n# functions\n\nquit_application() {\n local bundle_id=\"$1\"\n local timeout_duration=10\n\n # check if the application is running\n if ! osascript -e \"application id \\\"$bundle_id\\\" is running\" 2>/dev/null; then\n return\n fi\n\n local console_user\n console_user=$(stat -f \"%Su\" /dev/console)\n if [[ $EUID -eq 0 && \"$console_user\" == \"root\" ]]; then\n echo \"Not logged into a non-root GUI; skipping quitting application ID '$bundle_id'.\"\n return\n fi\n\n echo \"Quitting application '$bundle_id'...\"\n\n # try to quit the application within the timeout period\n local quit_success=false\n SECONDS=0\n while (( SECONDS < timeout_duration )); do\n if osascript -e \"tell application id \\\"$bundle_id\\\" to quit\" >/dev/null 2>&1; then\n if ! pgrep -f \"$bundle_id\" >/dev/null 2>&1; then\n echo \"Application '$bundle_id' quit successfully.\"\n quit_success=true\n break\n fi\n fi\n sleep 1\n done\n\n if [[ \"$quit_success\" = false ]]; then\n echo \"Application '$bundle_id' did not quit.\"\n fi\n}\n\n\n# extract contents\nunzip \"$INSTALLER_PATH\" -d \"$TMPDIR\"\n# copy to the applications folder\nquit_application 'com.github.GitHubClient'\nif [ -d \"$APPDIR/GitHub Desktop.app\" ]; then\n\tsudo mv \"$APPDIR/GitHub Desktop.app\" \"$TMPDIR/GitHub Desktop.app.bkp\"\nfi\nsudo cp -R \"$TMPDIR/GitHub Desktop.app\" \"$APPDIR\"\nmkdir -p .\n/bin/ln -h -f -s -- \"$APPDIR/GitHub Desktop.app/Contents/Resources/app/static/github.sh\" \"github\"\n", + "e8252f2a": "#!/bin/sh\n\n# variables\nAPPDIR=\"/Applications/\"\nLOGGED_IN_USER=$(scutil <<< \"show State:/Users/ConsoleUser\" | awk '/Name :/ { print $3 }')\n# functions\n\ntrash() {\n local logged_in_user=\"$1\"\n local target_file=\"$2\"\n local timestamp=\"$(date +%Y-%m-%d-%s)\"\n local rand=\"$(jot -r 1 0 99999)\"\n\n # replace ~ with /Users/$logged_in_user\n if [[ \"$target_file\" == ~* ]]; then\n target_file=\"/Users/$logged_in_user${target_file:1}\"\n fi\n\n local trash=\"/Users/$logged_in_user/.Trash\"\n local file_name=\"$(basename \"${target_file}\")\"\n\n if [[ -e \"$target_file\" ]]; then\n echo \"removing $target_file.\"\n mv -f \"$target_file\" \"$trash/${file_name}_${timestamp}_${rand}\"\n else\n echo \"$target_file doesn't exist.\"\n fi\n}\n\nsudo rm -rf \"$APPDIR/GitHub Desktop.app\"\nsudo rm -rf 'github'\nsudo rmdir '~/.config/git'\ntrash $LOGGED_IN_USER '~/Library/Application Support/com.apple.sharedfilelist/com.apple.LSSharedFileList.ApplicationRecentDocuments/com.github.GitHubClient.sfl*'\ntrash $LOGGED_IN_USER '~/Library/Application Support/com.github.GitHubClient'\ntrash $LOGGED_IN_USER '~/Library/Application Support/com.github.GitHubClient.ShipIt'\ntrash $LOGGED_IN_USER '~/Library/Application Support/GitHub Desktop'\ntrash $LOGGED_IN_USER '~/Library/Application Support/ShipIt_stderr.log'\ntrash $LOGGED_IN_USER '~/Library/Application Support/ShipIt_stdout.log'\ntrash $LOGGED_IN_USER '~/Library/Caches/com.github.GitHubClient'\ntrash $LOGGED_IN_USER '~/Library/Caches/com.github.GitHubClient.ShipIt'\ntrash $LOGGED_IN_USER '~/Library/HTTPStorages/com.github.GitHubClient'\ntrash $LOGGED_IN_USER '~/Library/Logs/GitHub Desktop'\ntrash $LOGGED_IN_USER '~/Library/Preferences/ByHost/com.github.GitHubClient.ShipIt.*.plist'\ntrash $LOGGED_IN_USER '~/Library/Preferences/com.github.GitHubClient.helper.plist'\ntrash $LOGGED_IN_USER '~/Library/Preferences/com.github.GitHubClient.plist'\ntrash $LOGGED_IN_USER '~/Library/Saved Application State/com.github.GitHubClient.savedState'\n" + } +} diff --git a/frontend/pages/SoftwarePage/components/icons/GitHubDesktop.tsx b/frontend/pages/SoftwarePage/components/icons/GitHubDesktop.tsx new file mode 100644 index 0000000000..6bec6f3b2d --- /dev/null +++ b/frontend/pages/SoftwarePage/components/icons/GitHubDesktop.tsx @@ -0,0 +1,14 @@ +import * as React from "react"; + +import type { SVGProps } from "react"; + +const GitHubDesktop = (props: SVGProps) => ( + + + +); +export default GitHubDesktop; diff --git a/website/assets/images/app-icon-github-60x60@2x.png b/website/assets/images/app-icon-github-60x60@2x.png index 413634a6a3bb1c503c1f241a5703592a25bcf283..af753942176468129bd206bf0fe22c257b987a49 100644 GIT binary patch literal 15489 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 literal 15056 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