diff --git a/ee/maintained-apps/ingesters/homebrew/external_refs/camtasia_version_transformer.go b/ee/maintained-apps/ingesters/homebrew/external_refs/camtasia_version_transformer.go index 493bbe85311..2c3f383aa7e 100644 --- a/ee/maintained-apps/ingesters/homebrew/external_refs/camtasia_version_transformer.go +++ b/ee/maintained-apps/ingesters/homebrew/external_refs/camtasia_version_transformer.go @@ -1,13 +1,24 @@ package externalrefs import ( + "regexp" + maintained_apps "github.com/fleetdm/fleet/v4/ee/maintained-apps" ) +// yearPrefixedCamtasiaVersion matches bundle_short_version values osquery reports +// for recent Camtasia releases (e.g. 2026.1.0). Homebrew historically reported +// two-digit year segments (26.1.0); newer cask metadata uses the full year +// (2026.1.0). Only prepend "20" when the version is not already year-prefixed. +var yearPrefixedCamtasiaVersion = regexp.MustCompile(`^20\d{2}\.`) + // CamtasiaVersionTransformer prepends "20" to the version to match what osquery reports. // Homebrew reports "26.0.2" but osquery reports "2026.0.2" (year-based versioning). -// This ensures the output always contains the real version that osquery reports. +// When Homebrew already reports "2026.1.0", leave the version unchanged. func CamtasiaVersionTransformer(app *maintained_apps.FMAManifestApp) (*maintained_apps.FMAManifestApp, error) { + if yearPrefixedCamtasiaVersion.MatchString(app.Version) { + return app, nil + } app.Version = "20" + app.Version return app, nil } diff --git a/ee/maintained-apps/ingesters/homebrew/external_refs/camtasia_version_transformer_test.go b/ee/maintained-apps/ingesters/homebrew/external_refs/camtasia_version_transformer_test.go new file mode 100644 index 00000000000..db8c3e9d3a1 --- /dev/null +++ b/ee/maintained-apps/ingesters/homebrew/external_refs/camtasia_version_transformer_test.go @@ -0,0 +1,27 @@ +package externalrefs + +import ( + "testing" + + maintained_apps "github.com/fleetdm/fleet/v4/ee/maintained-apps" + "github.com/stretchr/testify/assert" +) + +func TestCamtasiaVersionTransformer(t *testing.T) { + tests := []struct { + in, want string + }{ + {"26.1.0", "2026.1.0"}, + {"26.0.2", "2026.0.2"}, + {"2026.1.0", "2026.1.0"}, + {"2025.12.0", "2025.12.0"}, + } + for _, tt := range tests { + t.Run(tt.in, func(t *testing.T) { + app := &maintained_apps.FMAManifestApp{Version: tt.in} + out, err := CamtasiaVersionTransformer(app) + assert.NoError(t, err) + assert.Equal(t, tt.want, out.Version) + }) + } +} diff --git a/ee/maintained-apps/inputs/homebrew/camtasia.json b/ee/maintained-apps/inputs/homebrew/camtasia.json index c1414c9981e..97ec1f2af55 100644 --- a/ee/maintained-apps/inputs/homebrew/camtasia.json +++ b/ee/maintained-apps/inputs/homebrew/camtasia.json @@ -4,5 +4,6 @@ "token": "camtasia", "installer_format": "dmg", "slug": "camtasia/darwin", + "uninstall_script_path": "ee/maintained-apps/inputs/homebrew/scripts/camtasia_uninstall.sh", "default_categories": ["Productivity"] } diff --git a/ee/maintained-apps/inputs/homebrew/scripts/camtasia_uninstall.sh b/ee/maintained-apps/inputs/homebrew/scripts/camtasia_uninstall.sh new file mode 100644 index 00000000000..830cf2c6aab --- /dev/null +++ b/ee/maintained-apps/inputs/homebrew/scripts/camtasia_uninstall.sh @@ -0,0 +1,41 @@ +#!/bin/bash + +# variables +APPDIR="/Applications/" +LOGGED_IN_USER=$(scutil <<< "show State:/Users/ConsoleUser" | awk '/Name :/ { print $3 }') +# functions + +trash() { + local logged_in_user="$1" + local target_file="$2" + local timestamp="$(date +%Y-%m-%d-%s)" + local rand="$(jot -r 1 0 99999)" + + # replace ~ with /Users/$logged_in_user + if [[ "$target_file" == ~* ]]; then + target_file="/Users/$logged_in_user${target_file:1}" + fi + + local trash="/Users/$logged_in_user/.Trash" + local file_name="$(basename "${target_file}")" + + if [[ -e "$target_file" ]]; then + echo "removing $target_file." + mv -f "$target_file" "$trash/${file_name}_${timestamp}_${rand}" + else + echo "$target_file doesn't exist." + fi +} + +sudo rm -rf "$APPDIR/Camtasia.app" +trash $LOGGED_IN_USER '/Users/Shared/TechSmith/Camtasia' +trash $LOGGED_IN_USER '~/Library/Application Support/com.apple.sharedfilelist/com.apple.LSSharedFileList.ApplicationRecentDocuments/com.techsmith.camtasia26.sfl*' +trash $LOGGED_IN_USER '~/Library/Application Support/com.apple.sharedfilelist/com.apple.LSSharedFileList.ApplicationRecentDocuments/com.techsmith.camtasia2026.sfl*' +trash $LOGGED_IN_USER '~/Library/Application Support/TechSmith/Camtasia*' +trash $LOGGED_IN_USER '~/Library/Caches/com.plausiblelabs.crashreporter.data/com.techsmith.camtasia*' +trash $LOGGED_IN_USER '~/Library/Caches/com.techsmith.camtasia*' +trash $LOGGED_IN_USER '~/Library/HTTPStorages/com.techsmith.camtasia*' +trash $LOGGED_IN_USER '~/Library/HTTPStorages/com.techsmith.camtasia*.binarycookies' +trash $LOGGED_IN_USER '~/Library/Preferences/com.techsmith.camtasia*.plist' +trash $LOGGED_IN_USER '~/Library/Saved Application State/com.techsmith.camtasia*.savedState' +trash $LOGGED_IN_USER '~/Library/WebKit/com.techsmith.camtasia*' diff --git a/ee/maintained-apps/inputs/winget/scripts/docker_install.ps1 b/ee/maintained-apps/inputs/winget/scripts/docker_install.ps1 index 784f28b1d4b..4019be4c04a 100644 --- a/ee/maintained-apps/inputs/winget/scripts/docker_install.ps1 +++ b/ee/maintained-apps/inputs/winget/scripts/docker_install.ps1 @@ -4,26 +4,31 @@ $exeFilePath = "${env:INSTALLER_PATH}" try { + # Docker Desktop 4.72+ added a per-user vs all-user install choice for + # Windows. All-user silent installs hang on Windows Server runners + # (Docker Desktop is not officially supported on Windows Server). Install + # per-user with --user instead: no admin needed, target is + # %LOCALAPPDATA%\Programs\DockerDesktop, and uninstall info is written to + # HKCU. --accept-license suppresses the subscription agreement prompt. + Start-Process -FilePath "$exeFilePath" -ArgumentList "install","--user","--accept-license","--quiet" | Out-Null -# Add argument to install silently -# Argument to make install silent depends on installer, -# each installer might use different argument (usually it's "/S" or "/s") -$processOptions = @{ - FilePath = "$exeFilePath" - ArgumentList = "install --quiet" - PassThru = $true - Wait = $true -} - -# Start process and track exit code -$process = Start-Process @processOptions -$exitCode = $process.ExitCode - -# Prints the exit code -Write-Host "Install exit code: $exitCode" -Exit $exitCode + # The installer process can keep running for several minutes after the + # app is registered with Windows. Poll the HKCU uninstall key (osquery's + # programs table reads both HKLM and HKU) to detect when the core install + # has completed, rather than blocking on Start-Process -Wait. + $registryKey = "HKCU:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Docker Desktop" + $deadline = (Get-Date).AddMinutes(4) + while ((Get-Date) -lt $deadline) { + if (Get-ItemProperty -Path $registryKey -ErrorAction SilentlyContinue) { + Write-Host "Docker Desktop registered in HKCU." + Exit 0 + } + Start-Sleep -Seconds 10 + } + Write-Host "Docker Desktop did not register within timeout." + Exit 1 } catch { - Write-Host "Error: $_" - Exit 1 + Write-Host "Error: $_" + Exit 1 } diff --git a/ee/maintained-apps/inputs/winget/scripts/docker_uninstall.ps1 b/ee/maintained-apps/inputs/winget/scripts/docker_uninstall.ps1 index 4b1d52e237d..09c0cd8e624 100644 --- a/ee/maintained-apps/inputs/winget/scripts/docker_uninstall.ps1 +++ b/ee/maintained-apps/inputs/winget/scripts/docker_uninstall.ps1 @@ -1,14 +1,29 @@ # Define acceptable/expected exit codes $ExpectedExitCodes = @(0, 19) -# Uninstall Registry Key -$machineKey = 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Docker Desktop' +# Docker Desktop can be installed per-user (HKCU, %LOCALAPPDATA%) or +# all-users (HKLM, C:\Program Files). Check HKCU first, then HKLM. +$registryPaths = @( + 'HKCU:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Docker Desktop', + 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Docker Desktop' +) # Initialize exit code $exitCode = 0 try { - $key = Get-ItemProperty -Path $machineKey -ErrorAction Stop + $key = $null + foreach ($path in $registryPaths) { + $candidate = Get-ItemProperty -Path $path -ErrorAction SilentlyContinue + if ($candidate) { + Write-Host "Found Docker Desktop registry at: $path" + $key = $candidate + break + } + } + if (-not $key) { + Throw "Docker Desktop registry entry not found in HKCU or HKLM." + } # Get the uninstall command. Some uninstallers do not include 'QuietUninstallString' $uninstallCommand = if ($key.QuietUninstallString) { @@ -17,7 +32,7 @@ try { $key.UninstallString } - # The expected uninstall command value is "C:\Program Files\Docker\Docker\Docker Desktop Installer.exe" "uninstall" + # The expected uninstall command value is "\Docker Desktop Installer.exe" "uninstall" $splitArgs = $uninstallCommand.Split('"') if ($splitArgs.Length -ne 5) { Throw "Unexpected uninstall command. Please update the uninstall script.`nUninstall command: $uninstallCommand" diff --git a/ee/maintained-apps/outputs/camtasia/darwin.json b/ee/maintained-apps/outputs/camtasia/darwin.json index f76efb1ac9b..827f611ef4e 100644 --- a/ee/maintained-apps/outputs/camtasia/darwin.json +++ b/ee/maintained-apps/outputs/camtasia/darwin.json @@ -1,15 +1,15 @@ { "versions": [ { - "version": "2026.0.7", + "version": "2026.1.0", "queries": { "exists": "SELECT 1 FROM apps WHERE bundle_identifier = 'com.techsmith.camtasia';", - "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'com.techsmith.camtasia' AND version_compare(bundle_short_version, '2026.0.7') < 0);" + "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'com.techsmith.camtasia' AND version_compare(bundle_short_version, '2026.1.0') < 0);" }, - "installer_url": "https://download.techsmith.com/camtasiamac/releases/2607/Camtasia.dmg", + "installer_url": "https://download.techsmith.com/camtasiamac/releases/2026.1.0/Camtasia.dmg", "install_script_ref": "2fda011f", - "uninstall_script_ref": "4603b920", - "sha256": "e5bbf9500bef6d3caac3a58eebf54695784af6bf5c04548dd6320a5c728da74d", + "uninstall_script_ref": "a83239bb", + "sha256": "edf947b8689dc9f6209059f05c29ea39f172b0f028b6f5fd9717754d9ceb64d5", "default_categories": [ "Productivity" ] @@ -17,6 +17,6 @@ ], "refs": { "2fda011f": "#!/bin/bash\n\n# variables\nAPPDIR=\"/Applications/\"\nTMPDIR=$(dirname \"$(realpath \"$INSTALLER_PATH\")\")\n# functions\n\nquit_and_track_application() {\n local bundle_id=\"$1\"\n local var_name=\"APP_WAS_RUNNING_$(echo \"$bundle_id\" | tr '.-' '__')\"\n local timeout_duration=10\n\n # check if the application is running\n local app_running\n app_running=$(osascript -e \"application id \\\"$bundle_id\\\" is running\" 2>/dev/null)\n if [[ \"$app_running\" != \"true\" ]]; then\n eval \"export $var_name=0\"\n return\n fi\n\n local console_user\n console_user=$(stat -f \"%Su\" /dev/console)\n if [[ -z \"$console_user\" || \"$console_user\" == \"root\" || \"$console_user\" == \"loginwindow\" ]]; then\n echo \"Not logged into a non-root GUI; skipping quitting application ID '$bundle_id'.\"\n eval \"export $var_name=0\"\n return\n fi\n\n # App was running, mark it for relaunch\n eval \"export $var_name=1\"\n echo \"Application '$bundle_id' was running; will relaunch after installation.\"\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\nrelaunch_application() {\n local bundle_id=\"$1\"\n local var_name=\"APP_WAS_RUNNING_$(echo \"$bundle_id\" | tr '.-' '__')\"\n local was_running\n\n # Check if the app was running before installation\n eval \"was_running=\\$$var_name\"\n if [[ \"$was_running\" != \"1\" ]]; then\n return\n fi\n\n local console_user\n console_user=$(stat -f \"%Su\" /dev/console)\n if [[ -z \"$console_user\" || \"$console_user\" == \"root\" || \"$console_user\" == \"loginwindow\" ]]; then\n echo \"Not logged into a non-root GUI; skipping relaunching application ID '$bundle_id'.\"\n return\n fi\n\n echo \"Relaunching application '$bundle_id'...\"\n\n # Launch the app in the logged-in user's GUI session. Apps launched by root\n # won't register with the user's Dock/GUI, so run 'open' as the console user.\n # Use 'launchctl asuser' to bootstrap into the console user's Mach namespace\n # and GUI session — 'sudo -u' alone doesn't do this, which can cause\n # LSOpenURLsWithRole() failures even when 'open' exits 0.\n local open_status=0\n if [[ $EUID -eq 0 ]]; then\n local console_uid\n console_uid=$(id -u \"$console_user\")\n /bin/launchctl asuser \"$console_uid\" sudo -u \"$console_user\" open -b \"$bundle_id\" >/dev/null 2>&1 || open_status=$?\n else\n open -b \"$bundle_id\" >/dev/null 2>&1 || open_status=$?\n fi\n\n if [[ $open_status -eq 0 ]]; then\n echo \"Application '$bundle_id' relaunched successfully.\"\n else\n echo \"Failed to relaunch application '$bundle_id'.\"\n fi\n}\n\n\n# extract contents\nMOUNT_POINT=$(mktemp -d /tmp/dmg_mount_XXXXXX)\nhdiutil attach -plist -nobrowse -readonly -mountpoint \"$MOUNT_POINT\" \"$INSTALLER_PATH\"\nsudo cp -R \"$MOUNT_POINT\"/* \"$TMPDIR\"\nhdiutil detach \"$MOUNT_POINT\"\n# copy to the applications folder\nquit_and_track_application 'com.techsmith.camtasia'\nif [ -d \"$APPDIR/Camtasia.app\" ]; then\n\tsudo mv \"$APPDIR/Camtasia.app\" \"$TMPDIR/Camtasia.app.bkp\"\nfi\nsudo cp -R \"$TMPDIR/Camtasia.app\" \"$APPDIR\"\nrelaunch_application 'com.techsmith.camtasia'\n", - "4603b920": "#!/bin/bash\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/Camtasia.app\"\ntrash $LOGGED_IN_USER '/Users/Shared/TechSmith/Camtasia'\ntrash $LOGGED_IN_USER '~/Library/Application Support/com.apple.sharedfilelist/com.apple.LSSharedFileList.ApplicationRecentDocuments/com.techsmith.camtasia26.sfl*'\ntrash $LOGGED_IN_USER '~/Library/Application Support/TechSmith/Camtasia*'\ntrash $LOGGED_IN_USER '~/Library/Caches/com.plausiblelabs.crashreporter.data/com.techsmith.camtasia*'\ntrash $LOGGED_IN_USER '~/Library/Caches/com.techsmith.camtasia*'\ntrash $LOGGED_IN_USER '~/Library/HTTPStorages/com.techsmith.camtasia*'\ntrash $LOGGED_IN_USER '~/Library/HTTPStorages/com.techsmith.camtasia*.binarycookies'\ntrash $LOGGED_IN_USER '~/Library/Preferences/com.techsmith.camtasia*.plist'\ntrash $LOGGED_IN_USER '~/Library/Saved Application State/com.techsmith.camtasia*.savedState'\ntrash $LOGGED_IN_USER '~/Library/WebKit/com.techsmith.camtasia*'\n" + "a83239bb": "#!/bin/bash\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/Camtasia.app\"\ntrash $LOGGED_IN_USER '/Users/Shared/TechSmith/Camtasia'\ntrash $LOGGED_IN_USER '~/Library/Application Support/com.apple.sharedfilelist/com.apple.LSSharedFileList.ApplicationRecentDocuments/com.techsmith.camtasia26.sfl*'\ntrash $LOGGED_IN_USER '~/Library/Application Support/com.apple.sharedfilelist/com.apple.LSSharedFileList.ApplicationRecentDocuments/com.techsmith.camtasia2026.sfl*'\ntrash $LOGGED_IN_USER '~/Library/Application Support/TechSmith/Camtasia*'\ntrash $LOGGED_IN_USER '~/Library/Caches/com.plausiblelabs.crashreporter.data/com.techsmith.camtasia*'\ntrash $LOGGED_IN_USER '~/Library/Caches/com.techsmith.camtasia*'\ntrash $LOGGED_IN_USER '~/Library/HTTPStorages/com.techsmith.camtasia*'\ntrash $LOGGED_IN_USER '~/Library/HTTPStorages/com.techsmith.camtasia*.binarycookies'\ntrash $LOGGED_IN_USER '~/Library/Preferences/com.techsmith.camtasia*.plist'\ntrash $LOGGED_IN_USER '~/Library/Saved Application State/com.techsmith.camtasia*.savedState'\ntrash $LOGGED_IN_USER '~/Library/WebKit/com.techsmith.camtasia*'\n" } } diff --git a/ee/maintained-apps/outputs/coteditor/darwin.json b/ee/maintained-apps/outputs/coteditor/darwin.json index f0ddc7a6631..0efa062ed96 100644 --- a/ee/maintained-apps/outputs/coteditor/darwin.json +++ b/ee/maintained-apps/outputs/coteditor/darwin.json @@ -1,15 +1,15 @@ { "versions": [ { - "version": "7.0.2", + "version": "7.0.3", "queries": { "exists": "SELECT 1 FROM apps WHERE bundle_identifier = 'com.coteditor.CotEditor';", - "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'com.coteditor.CotEditor' AND version_compare(bundle_short_version, '7.0.2') < 0);" + "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'com.coteditor.CotEditor' AND version_compare(bundle_short_version, '7.0.3') < 0);" }, - "installer_url": "https://github.com/coteditor/CotEditor/releases/download/7.0.2/CotEditor_7.0.2.dmg", + "installer_url": "https://github.com/coteditor/CotEditor/releases/download/7.0.3/CotEditor_7.0.3.dmg", "install_script_ref": "25436bc3", "uninstall_script_ref": "51c19b9f", - "sha256": "8c3c8811f1a95dd8bc3f2e1f6cdbc53c237aad128432a82f669ba256a679272f", + "sha256": "e90f3414324ad163403b20965d454697f90fbd580559c3c89c443579cd720d57", "default_categories": [ "Developer tools" ] diff --git a/ee/maintained-apps/outputs/cursor/darwin.json b/ee/maintained-apps/outputs/cursor/darwin.json index fbe42c87060..a8895e49158 100644 --- a/ee/maintained-apps/outputs/cursor/darwin.json +++ b/ee/maintained-apps/outputs/cursor/darwin.json @@ -1,15 +1,15 @@ { "versions": [ { - "version": "3.4.16", + "version": "3.4.17", "queries": { "exists": "SELECT 1 FROM apps WHERE bundle_identifier = 'com.todesktop.230313mzl4w4u92';", - "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'com.todesktop.230313mzl4w4u92' AND version_compare(bundle_short_version, '3.4.16') < 0);" + "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'com.todesktop.230313mzl4w4u92' AND version_compare(bundle_short_version, '3.4.17') < 0);" }, - "installer_url": "https://downloads.cursor.com/production/f736016b0aa20ba1f99b7eec1dda48579fa4c295/darwin/arm64/Cursor-darwin-arm64.zip", + "installer_url": "https://downloads.cursor.com/production/93e603f703cd553a6bb3644711a3379bbbb3118f/darwin/arm64/Cursor-darwin-arm64.zip", "install_script_ref": "5147ff0b", "uninstall_script_ref": "a4458d81", - "sha256": "7ee203ec15606d2754a9ffffac38601b606fd492f88885e0ac491e081727ee4c", + "sha256": "00a3f53183e1964b938b4abfc722d735613a15aa39546e1c072685e066ada30c", "default_categories": [ "Developer tools" ] diff --git a/ee/maintained-apps/outputs/docker/windows.json b/ee/maintained-apps/outputs/docker/windows.json index d7dad520530..f19cdeef097 100644 --- a/ee/maintained-apps/outputs/docker/windows.json +++ b/ee/maintained-apps/outputs/docker/windows.json @@ -1,22 +1,22 @@ { "versions": [ { - "version": "4.71.0", + "version": "4.73.0", "queries": { "exists": "SELECT 1 FROM programs WHERE name = 'Docker Desktop' AND publisher = 'Docker Inc.';", - "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM programs WHERE name = 'Docker Desktop' AND publisher = 'Docker Inc.' AND version_compare(version, '4.71.0') < 0);" + "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM programs WHERE name = 'Docker Desktop' AND publisher = 'Docker Inc.' AND version_compare(version, '4.73.0') < 0);" }, - "installer_url": "https://desktop.docker.com/win/main/amd64/225177/Docker%20Desktop%20Installer.exe", - "install_script_ref": "f938db79", - "uninstall_script_ref": "000be0a3", - "sha256": "72f5ae091b90ffda86bbe721b484342b34e347586111e049e7c157d3e37d7e27", + "installer_url": "https://desktop.docker.com/win/main/amd64/226246/Docker%20Desktop%20Installer.exe", + "install_script_ref": "b06042dd", + "uninstall_script_ref": "0b74af50", + "sha256": "61a86a760caa54dc80bef92bb61b5acadbd7f2f423528e4b0ded6ddd69746a4d", "default_categories": [ "Developer tools" ] } ], "refs": { - "000be0a3": "# Define acceptable/expected exit codes\n$ExpectedExitCodes = @(0, 19)\n\n# Uninstall Registry Key\n$machineKey = 'HKLM:\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\Docker Desktop'\n\n# Initialize exit code\n$exitCode = 0\n\ntry {\n $key = Get-ItemProperty -Path $machineKey -ErrorAction Stop\n\n # Get the uninstall command. Some uninstallers do not include 'QuietUninstallString'\n $uninstallCommand = if ($key.QuietUninstallString) {\n $key.QuietUninstallString\n } else {\n $key.UninstallString\n }\n\n # The expected uninstall command value is \"C:\\Program Files\\Docker\\Docker\\Docker Desktop Installer.exe\" \"uninstall\"\n $splitArgs = $uninstallCommand.Split('\"')\n if ($splitArgs.Length -ne 5) {\n Throw \"Unexpected uninstall command. Please update the uninstall script.`nUninstall command: $uninstallCommand\"\n }\n $uninstallCommand = $splitArgs[1]\n $uninstallArgs = $splitArgs[3]\n\n Write-Host \"Uninstall command: $uninstallCommand\"\n Write-Host \"Uninstall args: $uninstallArgs\"\n\n $processOptions = @{\n FilePath = $uninstallCommand\n PassThru = $true\n Wait = $true\n }\n if ($uninstallArgs -ne '') {\n $processOptions.ArgumentList = \"$uninstallArgs --quiet\"\n } else {\n $processOptions.ArgumentList = \"--quiet\"\n }\n\n # Start uninstall process\n $process = Start-Process @processOptions\n $exitCode = $process.ExitCode\n Write-Host \"Uninstall exit code: $exitCode\"\n\n} catch {\n Write-Host \"Error: $_\"\n $exitCode = 1\n}\n\n# Treat acceptable exit codes as success\nif ($ExpectedExitCodes -contains $exitCode) {\n Exit 0\n} else {\n Exit $exitCode\n}\n", - "f938db79": "# Learn more about .exe install scripts:\n# http://fleetdm.com/learn-more-about/exe-install-scripts\n\n$exeFilePath = \"${env:INSTALLER_PATH}\"\n\ntry {\n\n# Add argument to install silently\n# Argument to make install silent depends on installer,\n# each installer might use different argument (usually it's \"/S\" or \"/s\")\n$processOptions = @{\n FilePath = \"$exeFilePath\"\n ArgumentList = \"install --quiet\"\n PassThru = $true\n Wait = $true\n}\n \n# Start process and track exit code\n$process = Start-Process @processOptions\n$exitCode = $process.ExitCode\n\n# Prints the exit code\nWrite-Host \"Install exit code: $exitCode\"\nExit $exitCode\n\n} catch {\n Write-Host \"Error: $_\"\n Exit 1\n}\n" + "0b74af50": "# Define acceptable/expected exit codes\n$ExpectedExitCodes = @(0, 19)\n\n# Docker Desktop can be installed per-user (HKCU, %LOCALAPPDATA%) or\n# all-users (HKLM, C:\\Program Files). Check HKCU first, then HKLM.\n$registryPaths = @(\n 'HKCU:\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\Docker Desktop',\n 'HKLM:\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\Docker Desktop'\n)\n\n# Initialize exit code\n$exitCode = 0\n\ntry {\n $key = $null\n foreach ($path in $registryPaths) {\n $candidate = Get-ItemProperty -Path $path -ErrorAction SilentlyContinue\n if ($candidate) {\n Write-Host \"Found Docker Desktop registry at: $path\"\n $key = $candidate\n break\n }\n }\n if (-not $key) {\n Throw \"Docker Desktop registry entry not found in HKCU or HKLM.\"\n }\n\n # Get the uninstall command. Some uninstallers do not include 'QuietUninstallString'\n $uninstallCommand = if ($key.QuietUninstallString) {\n $key.QuietUninstallString\n } else {\n $key.UninstallString\n }\n\n # The expected uninstall command value is \"\\Docker Desktop Installer.exe\" \"uninstall\"\n $splitArgs = $uninstallCommand.Split('\"')\n if ($splitArgs.Length -ne 5) {\n Throw \"Unexpected uninstall command. Please update the uninstall script.`nUninstall command: $uninstallCommand\"\n }\n $uninstallCommand = $splitArgs[1]\n $uninstallArgs = $splitArgs[3]\n\n Write-Host \"Uninstall command: $uninstallCommand\"\n Write-Host \"Uninstall args: $uninstallArgs\"\n\n $processOptions = @{\n FilePath = $uninstallCommand\n PassThru = $true\n Wait = $true\n }\n if ($uninstallArgs -ne '') {\n $processOptions.ArgumentList = \"$uninstallArgs --quiet\"\n } else {\n $processOptions.ArgumentList = \"--quiet\"\n }\n\n # Start uninstall process\n $process = Start-Process @processOptions\n $exitCode = $process.ExitCode\n Write-Host \"Uninstall exit code: $exitCode\"\n\n} catch {\n Write-Host \"Error: $_\"\n $exitCode = 1\n}\n\n# Treat acceptable exit codes as success\nif ($ExpectedExitCodes -contains $exitCode) {\n Exit 0\n} else {\n Exit $exitCode\n}\n", + "b06042dd": "# Learn more about .exe install scripts:\n# http://fleetdm.com/learn-more-about/exe-install-scripts\n\n$exeFilePath = \"${env:INSTALLER_PATH}\"\n\ntry {\n # Docker Desktop 4.72+ added a per-user vs all-user install choice for\n # Windows. All-user silent installs hang on Windows Server runners\n # (Docker Desktop is not officially supported on Windows Server). Install\n # per-user with --user instead: no admin needed, target is\n # %LOCALAPPDATA%\\Programs\\DockerDesktop, and uninstall info is written to\n # HKCU. --accept-license suppresses the subscription agreement prompt.\n Start-Process -FilePath \"$exeFilePath\" -ArgumentList \"install\",\"--user\",\"--accept-license\",\"--quiet\" | Out-Null\n\n # The installer process can keep running for several minutes after the\n # app is registered with Windows. Poll the HKCU uninstall key (osquery's\n # programs table reads both HKLM and HKU) to detect when the core install\n # has completed, rather than blocking on Start-Process -Wait.\n $registryKey = \"HKCU:\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\Docker Desktop\"\n $deadline = (Get-Date).AddMinutes(4)\n while ((Get-Date) -lt $deadline) {\n if (Get-ItemProperty -Path $registryKey -ErrorAction SilentlyContinue) {\n Write-Host \"Docker Desktop registered in HKCU.\"\n Exit 0\n }\n Start-Sleep -Seconds 10\n }\n\n Write-Host \"Docker Desktop did not register within timeout.\"\n Exit 1\n} catch {\n Write-Host \"Error: $_\"\n Exit 1\n}\n" } } diff --git a/ee/maintained-apps/outputs/granola/darwin.json b/ee/maintained-apps/outputs/granola/darwin.json index d19ab46d824..39e4674d61b 100644 --- a/ee/maintained-apps/outputs/granola/darwin.json +++ b/ee/maintained-apps/outputs/granola/darwin.json @@ -1,15 +1,15 @@ { "versions": [ { - "version": "7.205.1", + "version": "7.220.0", "queries": { "exists": "SELECT 1 FROM apps WHERE bundle_identifier = 'com.granola.app';", - "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'com.granola.app' AND version_compare(bundle_short_version, '7.205.1') < 0);" + "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'com.granola.app' AND version_compare(bundle_short_version, '7.220.0') < 0);" }, - "installer_url": "https://dr2v7l5emb758.cloudfront.net/7.205.1/Granola-7.205.1-mac-universal.dmg", + "installer_url": "https://dr2v7l5emb758.cloudfront.net/7.220.0/Granola-7.220.0-mac-universal.dmg", "install_script_ref": "08986ac7", "uninstall_script_ref": "67249f33", - "sha256": "b563c80e0a0e6cab1c460b47360577fbae435ae832a3efb41a9913f400864264", + "sha256": "536e7fe1a6e453c61c886426d135c57508c5d3f563d9f92e265ececeaf14418f", "default_categories": [ "Productivity" ] diff --git a/ee/maintained-apps/outputs/granola/windows.json b/ee/maintained-apps/outputs/granola/windows.json index 26a84c6099e..d0c16969795 100644 --- a/ee/maintained-apps/outputs/granola/windows.json +++ b/ee/maintained-apps/outputs/granola/windows.json @@ -1,15 +1,15 @@ { "versions": [ { - "version": "7.205.1", + "version": "7.220.0", "queries": { "exists": "SELECT 1 FROM programs WHERE name LIKE 'Granola %' AND publisher = 'Granola';", - "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM programs WHERE name LIKE 'Granola %' AND publisher = 'Granola' AND version_compare(version, '7.205.1') < 0);" + "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM programs WHERE name LIKE 'Granola %' AND publisher = 'Granola' AND version_compare(version, '7.220.0') < 0);" }, - "installer_url": "https://api.granola.ai/v1/check-for-update/Granola-7.205.1-win-x64.exe", + "installer_url": "https://api.granola.ai/v1/check-for-update/Granola-7.220.0-win-x64.exe", "install_script_ref": "3f66ac53", "uninstall_script_ref": "a4fab3f5", - "sha256": "c1b34c35fe83cc5852a2bdc9f079029368ed19be49ebffff2a7c965523ebe9cd", + "sha256": "9d2c2e59379be7dc1351965b9e33a24adba4b0dbf46146bdafb0e2edc76f5a8a", "default_categories": [ "Productivity" ] diff --git a/ee/maintained-apps/outputs/miro/darwin.json b/ee/maintained-apps/outputs/miro/darwin.json index 73ee4f9d7da..47e6e226126 100644 --- a/ee/maintained-apps/outputs/miro/darwin.json +++ b/ee/maintained-apps/outputs/miro/darwin.json @@ -1,10 +1,10 @@ { "versions": [ { - "version": "0.11.139", + "version": "0.11.140", "queries": { "exists": "SELECT 1 FROM apps WHERE bundle_identifier = 'com.electron.realtimeboard';", - "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'com.electron.realtimeboard' AND version_compare(bundle_short_version, '0.11.139') < 0);" + "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'com.electron.realtimeboard' AND version_compare(bundle_short_version, '0.11.140') < 0);" }, "installer_url": "https://desktop.miro.com/platforms/darwin-arm64/Install-Miro.dmg", "install_script_ref": "6933c518", diff --git a/ee/maintained-apps/outputs/nordvpn/darwin.json b/ee/maintained-apps/outputs/nordvpn/darwin.json index 881cce27150..575d19493e7 100644 --- a/ee/maintained-apps/outputs/nordvpn/darwin.json +++ b/ee/maintained-apps/outputs/nordvpn/darwin.json @@ -1,15 +1,15 @@ { "versions": [ { - "version": "10.1.0", + "version": "10.2.0", "queries": { "exists": "SELECT 1 FROM apps WHERE bundle_identifier = 'com.nordvpn.macos';", - "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'com.nordvpn.macos' AND version_compare(bundle_short_version, '10.1.0') < 0);" + "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'com.nordvpn.macos' AND version_compare(bundle_short_version, '10.2.0') < 0);" }, - "installer_url": "https://downloads.nordcdn.com/apps/macos/generic/NordVPN-OpenVPN/10.1.0/NordVPN.pkg", + "installer_url": "https://downloads.nordcdn.com/apps/macos/generic/NordVPN-OpenVPN/10.2.0/NordVPN.pkg", "install_script_ref": "60b24e24", "uninstall_script_ref": "70d47f9b", - "sha256": "15f21c3724e2e535cc1bebdb8f6bae6b75f9a5ea6f07811b016e83febb0e5b1e", + "sha256": "6eb85dc88a50dec2d9b58473e95153dad80a169a53ec1281315f36948be0d7f2", "default_categories": [ "Productivity" ] diff --git a/ee/maintained-apps/outputs/ollama/darwin.json b/ee/maintained-apps/outputs/ollama/darwin.json index 806f677b15c..87013da7dd4 100644 --- a/ee/maintained-apps/outputs/ollama/darwin.json +++ b/ee/maintained-apps/outputs/ollama/darwin.json @@ -1,15 +1,15 @@ { "versions": [ { - "version": "0.23.3", + "version": "0.23.4", "queries": { "exists": "SELECT 1 FROM apps WHERE bundle_identifier = 'com.electron.ollama';", - "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'com.electron.ollama' AND version_compare(bundle_short_version, '0.23.3') < 0);" + "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'com.electron.ollama' AND version_compare(bundle_short_version, '0.23.4') < 0);" }, - "installer_url": "https://github.com/ollama/ollama/releases/download/v0.23.3/Ollama-darwin.zip", + "installer_url": "https://github.com/ollama/ollama/releases/download/v0.23.4/Ollama-darwin.zip", "install_script_ref": "9f174559", "uninstall_script_ref": "f6ad7a9e", - "sha256": "bd6e914598d3b4b429201807c67e3d1d42b1e736d4be4dfeebcd3eddcf9741de", + "sha256": "6770f08770d8f1d643abccc6dfafcc6d0e72bffb8ac87bab96e7a94a0c805dd8", "default_categories": [ "Developer tools" ] diff --git a/ee/maintained-apps/outputs/opera/darwin.json b/ee/maintained-apps/outputs/opera/darwin.json index 3bb062914f0..7324e8a7d14 100644 --- a/ee/maintained-apps/outputs/opera/darwin.json +++ b/ee/maintained-apps/outputs/opera/darwin.json @@ -6,10 +6,10 @@ "exists": "SELECT 1 FROM apps WHERE bundle_identifier = 'com.operasoftware.Opera';", "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'com.operasoftware.Opera' AND version_compare(bundle_short_version, '131.0') < 0);" }, - "installer_url": "https://get.geo.opera.com/pub/opera/desktop/131.0.5877.24/mac/Opera_131.0.5877.24_Setup.dmg", + "installer_url": "https://get.geo.opera.com/pub/opera/desktop/131.0.5877.55/mac/Opera_131.0.5877.55_Setup.dmg", "install_script_ref": "3b931dc9", "uninstall_script_ref": "ac88c6f3", - "sha256": "fc05898c6afc0b1d76ac33c7deb9d5a85261b6e05d1d8777865ce630f1fc79a3", + "sha256": "1f3799a920178d36aed82ee799f40f9920b3a5a1ab8904f6e3aafe11ae61ea8d", "default_categories": [ "Browsers" ] diff --git a/ee/maintained-apps/outputs/postman/darwin.json b/ee/maintained-apps/outputs/postman/darwin.json index 8d646a0a0f6..7f241973aab 100644 --- a/ee/maintained-apps/outputs/postman/darwin.json +++ b/ee/maintained-apps/outputs/postman/darwin.json @@ -1,15 +1,15 @@ { "versions": [ { - "version": "12.10.0", + "version": "12.10.5", "queries": { "exists": "SELECT 1 FROM apps WHERE bundle_identifier = 'com.postmanlabs.mac';", - "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'com.postmanlabs.mac' AND version_compare(bundle_short_version, '12.10.0') < 0);" + "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'com.postmanlabs.mac' AND version_compare(bundle_short_version, '12.10.5') < 0);" }, - "installer_url": "https://dl.pstmn.io/download/version/12.10.0/osx_arm64", + "installer_url": "https://dl.pstmn.io/download/version/12.10.5/osx_arm64", "install_script_ref": "96d73870", "uninstall_script_ref": "5b41187d", - "sha256": "503b32d86b847be7ec482c2e832c5d334c15829a25e9d1071cc147b83c60662e", + "sha256": "7e1703e62bf634075845bc5fe639098ec81d7ba99d5da078d14071f90c2fad16", "default_categories": [ "Developer tools" ] diff --git a/ee/maintained-apps/outputs/raycast/darwin.json b/ee/maintained-apps/outputs/raycast/darwin.json index 2d9afe0da76..bae116fb822 100644 --- a/ee/maintained-apps/outputs/raycast/darwin.json +++ b/ee/maintained-apps/outputs/raycast/darwin.json @@ -1,15 +1,15 @@ { "versions": [ { - "version": "1.104.16", + "version": "1.104.17", "queries": { "exists": "SELECT 1 FROM apps WHERE bundle_identifier = 'com.raycast.macos';", - "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'com.raycast.macos' AND version_compare(bundle_short_version, '1.104.16') < 0);" + "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'com.raycast.macos' AND version_compare(bundle_short_version, '1.104.17') < 0);" }, - "installer_url": "https://releases.raycast.com/releases/1.104.16/download?build=arm", + "installer_url": "https://releases.raycast.com/releases/1.104.17/download?build=arm", "install_script_ref": "8461608e", "uninstall_script_ref": "c3d6f210", - "sha256": "cbf30f3a8e889257fd84e1ff4510433a3757ef1f2dbdf205f4d078da0adf3c2f", + "sha256": "9ae5fa3cf6a78d4f8494242121fa3b63b70285b4cef10fe01f5d942ef04ae37b", "default_categories": [ "Productivity" ] diff --git a/ee/maintained-apps/outputs/snagit/darwin.json b/ee/maintained-apps/outputs/snagit/darwin.json index a1b1ac59ecd..6f69addf062 100644 --- a/ee/maintained-apps/outputs/snagit/darwin.json +++ b/ee/maintained-apps/outputs/snagit/darwin.json @@ -1,15 +1,15 @@ { "versions": [ { - "version": "2026.0.1", + "version": "2026.1.0", "queries": { "exists": "SELECT 1 FROM apps WHERE bundle_identifier = 'com.TechSmith.Snagit';", - "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'com.TechSmith.Snagit' AND version_compare(bundle_short_version, '2026.0.1') < 0);" + "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'com.TechSmith.Snagit' AND version_compare(bundle_short_version, '2026.1.0') < 0);" }, - "installer_url": "https://download.techsmith.com/snagitmac/releases/2601/snagit.dmg", + "installer_url": "https://download.techsmith.com/snagitmac/releases/2026.1.0/snagit.dmg", "install_script_ref": "38b5a841", "uninstall_script_ref": "f4ef3015", - "sha256": "2dd08df41232b4791e8e727185e15e568dd9bf644f665625ffc3e9f5a189c4d1", + "sha256": "7c94366e49f270783882eb499db08db095ff04df8792a63bcd53ea887d42969a", "default_categories": [ "Productivity" ] diff --git a/ee/maintained-apps/outputs/splashtop-business/darwin.json b/ee/maintained-apps/outputs/splashtop-business/darwin.json index a459f3c6412..d35d5de4ae3 100644 --- a/ee/maintained-apps/outputs/splashtop-business/darwin.json +++ b/ee/maintained-apps/outputs/splashtop-business/darwin.json @@ -1,15 +1,15 @@ { "versions": [ { - "version": "3.8.2.0", + "version": "3.8.4.0", "queries": { "exists": "SELECT 1 FROM apps WHERE bundle_identifier = 'com.splashtop.stb.macosx';", - "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'com.splashtop.stb.macosx' AND version_compare(bundle_short_version, '3.8.2.0') < 0);" + "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'com.splashtop.stb.macosx' AND version_compare(bundle_short_version, '3.8.4.0') < 0);" }, - "installer_url": "https://d17kmd0va0f0mp.cloudfront.net/macclient/STB/Splashtop_Business_Mac_INSTALLER_v3.8.2.0.dmg", + "installer_url": "https://d17kmd0va0f0mp.cloudfront.net/macclient/STB/Splashtop_Business_Mac_INSTALLER_v3.8.4.0.dmg", "install_script_ref": "4013dae8", "uninstall_script_ref": "217e1dc3", - "sha256": "ca7921340792f96cf6fb4999886b9957b2755fe11ff20457f5378d56e63101c9", + "sha256": "a06c5616bc8c6a4f1c238d2fb22d71da0c1e8ded2fc621f2cab9ddddaca90d34", "default_categories": [ "Productivity" ]