From aa0994c52c8cd23d73c041b15eec0739a306adf9 Mon Sep 17 00:00:00 2001 From: allenhouchins <32207388+allenhouchins@users.noreply.github.com> Date: Wed, 9 Sep 2026 08:08:08 +0000 Subject: [PATCH] Update Fleet-maintained apps. Generated automatically with cmd/maintained-apps. --- ee/maintained-apps/outputs/1password/windows.json | 12 ++++++------ ee/maintained-apps/outputs/7-zip/windows.json | 8 ++++---- ee/maintained-apps/outputs/8x8-work/windows.json | 8 ++++---- ee/maintained-apps/outputs/aws-cli/windows.json | 8 ++++---- .../outputs/bettertouchtool/darwin.json | 8 ++++---- ee/maintained-apps/outputs/bezel/darwin.json | 4 ++-- ee/maintained-apps/outputs/canva/darwin.json | 8 ++++---- ee/maintained-apps/outputs/canva/windows.json | 8 ++++---- ee/maintained-apps/outputs/chatgpt/darwin.json | 8 ++++---- ee/maintained-apps/outputs/clickshare/darwin.json | 8 ++++---- .../outputs/devin-desktop/darwin.json | 8 ++++---- ee/maintained-apps/outputs/drawio/darwin.json | 8 ++++---- ee/maintained-apps/outputs/drawio/windows.json | 8 ++++---- ee/maintained-apps/outputs/duo-desktop/darwin.json | 12 ++++++------ ee/maintained-apps/outputs/figma/windows.json | 8 ++++---- .../outputs/firefox@developer-edition/windows.json | 8 ++++---- .../outputs/firefox@nightly/darwin.json | 4 ++-- .../outputs/foxit-pdf-editor/windows.json | 8 ++++---- .../outputs/google-chrome/darwin.json | 4 ++-- .../outputs/google-chrome/windows.json | 4 ++-- .../outputs/google-drive/darwin.json | 4 ++-- ee/maintained-apps/outputs/gyazo/darwin.json | 8 ++++---- .../outputs/highlight-ai/darwin.json | 8 ++++---- ee/maintained-apps/outputs/iterm2/darwin.json | 12 ++++++------ ee/maintained-apps/outputs/jellyfin/darwin.json | 4 ++-- ee/maintained-apps/outputs/kiro-cli/darwin.json | 8 ++++---- .../outputs/lenovo-dock-manager/windows.json | 8 ++++---- .../outputs/malwarebytes/darwin.json | 12 ++++++------ ee/maintained-apps/outputs/melodics/darwin.json | 8 ++++---- .../windows.json | 12 ++++++------ .../microsoft-dotnet-runtime-10/windows.json | 12 ++++++------ .../microsoft-dotnet-runtime-8/windows.json | 12 ++++++------ ee/maintained-apps/outputs/milanote/darwin.json | 8 ++++---- ee/maintained-apps/outputs/modern-csv/darwin.json | 12 ++++++------ ee/maintained-apps/outputs/notion/darwin.json | 8 ++++---- ee/maintained-apps/outputs/notion/windows.json | 8 ++++---- ee/maintained-apps/outputs/ocenaudio/windows.json | 6 +++--- .../outputs/opencode-desktop/darwin.json | 8 ++++---- ee/maintained-apps/outputs/postman/darwin.json | 8 ++++---- ee/maintained-apps/outputs/powershell/windows.json | 14 +++++++------- .../outputs/reminders-menubar/darwin.json | 8 ++++---- ee/maintained-apps/outputs/slack/windows.json | 8 ++++---- ee/maintained-apps/outputs/snagit/windows.json | 8 ++++---- .../sql-server-management-studio/windows.json | 8 ++++---- .../outputs/standard-notes/windows.json | 8 ++++---- ee/maintained-apps/outputs/superhuman/darwin.json | 8 ++++---- ee/maintained-apps/outputs/teamviewer/windows.json | 6 +++--- ee/maintained-apps/outputs/tor-browser/darwin.json | 8 ++++---- .../visual-studio-2022-community/windows.json | 8 ++++---- .../visual-studio-2022-enterprise/windows.json | 8 ++++---- .../visual-studio-2022-professional/windows.json | 8 ++++---- .../outputs/visual-studio-code/darwin.json | 6 +++--- 52 files changed, 212 insertions(+), 212 deletions(-) diff --git a/ee/maintained-apps/outputs/1password/windows.json b/ee/maintained-apps/outputs/1password/windows.json index 1c50239179d..e3b4074a2da 100644 --- a/ee/maintained-apps/outputs/1password/windows.json +++ b/ee/maintained-apps/outputs/1password/windows.json @@ -1,16 +1,16 @@ { "versions": [ { - "version": "8.12.34", + "version": "8.12.36", "queries": { "exists": "SELECT 1 FROM programs WHERE name = '1Password' AND publisher = 'Agilebits Inc.';", - "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM programs WHERE name = '1Password' AND publisher = 'Agilebits Inc.' AND version_compare(version, '8.12.34') < 0);", + "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM programs WHERE name = '1Password' AND publisher = 'Agilebits Inc.' AND version_compare(version, '8.12.36') < 0);", "open": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM processes WHERE LOWER(name) LIKE '1password%');" }, - "installer_url": "https://c.1password.com/dist/1P/win8/1PasswordSetup-8.12.34.msi", + "installer_url": "https://c.1password.com/dist/1P/win8/1PasswordSetup-8.12.36.msi", "install_script_ref": "22e48c46", - "uninstall_script_ref": "939b405b", - "sha256": "038702f3035ca13c81970318219bc8a29e001198bdd4a2cae639cc059a30d7e4", + "uninstall_script_ref": "fcfda4d1", + "sha256": "ee86b2d92a6d0b49861da14fe7ee89dc27390b6b6d29a1c74b013a3507dee54d", "default_categories": [ "Productivity" ] @@ -18,6 +18,6 @@ ], "refs": { "22e48c46": "$logFile = \"${env:TEMP}/fleet-install-software.log\"\n\n# MSI exit codes that indicate success. 3010 = ERROR_SUCCESS_REBOOT_REQUIRED,\n# 1641 = ERROR_SUCCESS_REBOOT_INITIATED. Treat these as success rather than failure.\n$successCodes = @(0, 3010, 1641)\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\nif ($successCodes -contains $installProcess.ExitCode) {\n Exit 0\n}\n\nExit $installProcess.ExitCode\n\n} catch {\n Write-Host \"Error: $_\"\n Exit 1\n}\n", - "939b405b": "# 1Password Uninstall Script\n# Closes running processes before uninstalling to prevent hangs\n\n$product_code = '{23DFC039-723C-4F38-9446-712CCB3F8268}'\n$timeoutSeconds = 300 # 5 minute timeout\n\n# Close any running 1Password processes\nGet-Process -Name \"1Password*\" -ErrorAction SilentlyContinue | Stop-Process -Force -ErrorAction SilentlyContinue\nStart-Sleep -Seconds 2\n\n# Fleet uninstalls app using product code that's extracted on upload\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\nif (-not $completed) {\n Stop-Process -Id $process.Id -Force -ErrorAction SilentlyContinue\n Exit 1603 # ERROR_INSTALL_FAILURE\n}\n\n# Check exit code and output result\nif ($process.ExitCode -eq 0) {\n Write-Output \"Exit 0\"\n Exit 0\n} else {\n Write-Output \"Exit $($process.ExitCode)\"\n Exit $process.ExitCode\n}\n\n" + "fcfda4d1": "# 1Password Uninstall Script\n# Closes running processes before uninstalling to prevent hangs\n\n$product_code = '{6C72938F-8309-40C2-8D5A-6C80900EC752}'\n$timeoutSeconds = 300 # 5 minute timeout\n\n# Close any running 1Password processes\nGet-Process -Name \"1Password*\" -ErrorAction SilentlyContinue | Stop-Process -Force -ErrorAction SilentlyContinue\nStart-Sleep -Seconds 2\n\n# Fleet uninstalls app using product code that's extracted on upload\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\nif (-not $completed) {\n Stop-Process -Id $process.Id -Force -ErrorAction SilentlyContinue\n Exit 1603 # ERROR_INSTALL_FAILURE\n}\n\n# Check exit code and output result\nif ($process.ExitCode -eq 0) {\n Write-Output \"Exit 0\"\n Exit 0\n} else {\n Write-Output \"Exit $($process.ExitCode)\"\n Exit $process.ExitCode\n}\n\n" } } diff --git a/ee/maintained-apps/outputs/7-zip/windows.json b/ee/maintained-apps/outputs/7-zip/windows.json index 5ed970288a4..8cfa6db8c75 100644 --- a/ee/maintained-apps/outputs/7-zip/windows.json +++ b/ee/maintained-apps/outputs/7-zip/windows.json @@ -1,16 +1,16 @@ { "versions": [ { - "version": "26.02", + "version": "26.03", "queries": { "exists": "SELECT 1 FROM programs WHERE name LIKE '7-Zip %' AND publisher = 'Igor Pavlov';", - "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM programs WHERE name LIKE '7-Zip %' AND publisher = 'Igor Pavlov' AND version_compare(version, '26.02') < 0);", + "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM programs WHERE name LIKE '7-Zip %' AND publisher = 'Igor Pavlov' AND version_compare(version, '26.03') < 0);", "open": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM processes WHERE LOWER(name) IN ('7zfm.exe','7zg.exe'));" }, - "installer_url": "https://github.com/ip7z/7zip/releases/download/26.02/7z2602-x64.msi", + "installer_url": "https://www.7-zip.org/a/7z2603-x64.msi", "install_script_ref": "22e48c46", "uninstall_script_ref": "cd80dc1f", - "sha256": "db407a4f6d4999e5c7bc00ce8a882be94717b56e7fa68140fe3f12605d91643e", + "sha256": "c0680064d698a62dd4a5a47f403db356a6531a5473e4c4b1d090ea2590513926", "default_categories": [ "Productivity" ], diff --git a/ee/maintained-apps/outputs/8x8-work/windows.json b/ee/maintained-apps/outputs/8x8-work/windows.json index f1ba8234ae2..335ef00781b 100644 --- a/ee/maintained-apps/outputs/8x8-work/windows.json +++ b/ee/maintained-apps/outputs/8x8-work/windows.json @@ -1,16 +1,16 @@ { "versions": [ { - "version": "8.36.2", + "version": "8.37.2", "queries": { "exists": "SELECT 1 FROM programs WHERE name = '8x8 Work' AND publisher = '8x8 Inc.';", - "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM programs WHERE name = '8x8 Work' AND publisher = '8x8 Inc.' AND version_compare(version, '8.36.2') < 0);", + "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM programs WHERE name = '8x8 Work' AND publisher = '8x8 Inc.' AND version_compare(version, '8.37.2') < 0);", "open": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM processes WHERE LOWER(name) = '8x8 work.exe');" }, - "installer_url": "https://work-desktop-assets.8x8.com/prod-publish/ga/work-64-msi-v8.36.2-3.msi", + "installer_url": "https://work-desktop-assets.8x8.com/prod-publish/ga/work-64-msi-v8.37.2-1.msi", "install_script_ref": "22e48c46", "uninstall_script_ref": "3f17b97d", - "sha256": "b6046af99d8784950967b778c167e16e75cfcbe0b4e92b60921507dad35430ff", + "sha256": "dab13696c2b2b77352cc050abfca38248519c57d3bdd69f9e53c6d6126afbe4a", "default_categories": [ "Communication" ], diff --git a/ee/maintained-apps/outputs/aws-cli/windows.json b/ee/maintained-apps/outputs/aws-cli/windows.json index 1093098264b..1883da429d5 100644 --- a/ee/maintained-apps/outputs/aws-cli/windows.json +++ b/ee/maintained-apps/outputs/aws-cli/windows.json @@ -1,16 +1,16 @@ { "versions": [ { - "version": "2.36.40", + "version": "2.36.41", "queries": { "exists": "SELECT 1 FROM programs WHERE name LIKE 'AWS Command Line Interface v2 %' AND publisher = 'Amazon Web Services';", - "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM programs WHERE name LIKE 'AWS Command Line Interface v2 %' AND publisher = 'Amazon Web Services' AND version_compare(version, '2.36.40') < 0);", + "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM programs WHERE name LIKE 'AWS Command Line Interface v2 %' AND publisher = 'Amazon Web Services' AND version_compare(version, '2.36.41') < 0);", "open": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM processes WHERE LOWER(name) = 'aws command line interface v2.exe');" }, - "installer_url": "https://awscli.amazonaws.com/AWSCLIV2-2.36.40.msi", + "installer_url": "https://awscli.amazonaws.com/AWSCLIV2-2.36.41.msi", "install_script_ref": "22e48c46", "uninstall_script_ref": "58bcd016", - "sha256": "3fbc882f079ed0954240cdc62d42f3381283ba73ef34888cad8157f2e77c8685", + "sha256": "59b2ba5a34ca54e7831621491d5e4ee7ed9bae4c12c43973ada524a8c6deb1fd", "default_categories": [ "Developer tools" ], diff --git a/ee/maintained-apps/outputs/bettertouchtool/darwin.json b/ee/maintained-apps/outputs/bettertouchtool/darwin.json index 2da2be98fa9..3475de1b708 100644 --- a/ee/maintained-apps/outputs/bettertouchtool/darwin.json +++ b/ee/maintained-apps/outputs/bettertouchtool/darwin.json @@ -1,16 +1,16 @@ { "versions": [ { - "version": "6.791", + "version": "6.800", "queries": { "exists": "SELECT 1 FROM apps WHERE bundle_identifier = 'com.hegenberg.BetterTouchTool';", - "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'com.hegenberg.BetterTouchTool' AND version_compare(bundle_short_version, '6.791') < 0);", + "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'com.hegenberg.BetterTouchTool' AND version_compare(bundle_short_version, '6.800') < 0);", "open": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps a JOIN processes p ON p.path = concat(a.path, '/Contents/MacOS/', a.bundle_executable) WHERE a.bundle_identifier = 'com.hegenberg.BetterTouchTool' AND a.bundle_executable != '');" }, - "installer_url": "https://folivora.ai/releases/btt6.791-2026090802.zip", + "installer_url": "https://folivora.ai/releases/btt6.800-2026090806.zip", "install_script_ref": "17a00450", "uninstall_script_ref": "aef4d4fc", - "sha256": "d5d165718743bfe55a7ee2e80ec8e4f3836ea68799a3599760a0ab937e8492b1", + "sha256": "a3d3ecc849ece6a7d1ea58a708d3b77b6d7873175a0308a0e08fda168fe7abbc", "default_categories": [ "Productivity" ] diff --git a/ee/maintained-apps/outputs/bezel/darwin.json b/ee/maintained-apps/outputs/bezel/darwin.json index 025f36160ee..bcbffcdc644 100644 --- a/ee/maintained-apps/outputs/bezel/darwin.json +++ b/ee/maintained-apps/outputs/bezel/darwin.json @@ -9,7 +9,7 @@ }, "installer_url": "https://download.nonstrict.eu/bezel/Bezel-4.7.1.zip", "install_script_ref": "d8080b2a", - "uninstall_script_ref": "539e1578", + "uninstall_script_ref": "d6d5608b", "sha256": "a4c63645eddc34d1cefd8a949aaf9565b2f8ad5c72a84ac5e5420e9616fea00a", "default_categories": [ "Productivity" @@ -17,7 +17,7 @@ } ], "refs": { - "539e1578": "#!/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\n # If the target contains glob characters, expand it and move each match.\n if [[ \"$target_file\" == *[*?[]* ]]; then\n local file file_name\n local matched=false\n local i=0\n # compgen -G expands the (quoted) pattern itself, so paths containing\n # spaces glob correctly; reading line by line keeps each match intact.\n while IFS= read -r file; do\n [[ -n \"$file\" ]] || continue\n [[ -e \"$file\" || -L \"$file\" ]] || continue\n matched=true\n i=$((i + 1))\n file_name=\"$(basename \"$file\")\"\n echo \"removing $file.\"\n # The per-match counter keeps matches that share a basename from\n # overwriting each other in the trash.\n mv -f \"$file\" \"$trash/${file_name}_${timestamp}_${rand}_${i}\"\n done < <(compgen -G \"$target_file\" 2>/dev/null)\n if [[ \"$matched\" == false ]]; then\n echo \"$target_file doesn't exist.\"\n fi\n return\n fi\n\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/Bezel.app\"\ntrash $LOGGED_IN_USER '~/Library/Caches/com.nonstrict.Bezel-direct'\ntrash $LOGGED_IN_USER '~/Library/HTTPStorages/com.nonstrict.Bezel-direct'\ntrash $LOGGED_IN_USER '~/Library/Preferences/com.nonstrict.Bezel-direct.plist'\n", + "d6d5608b": "#!/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\n # If the target contains glob characters, expand it and move each match.\n if [[ \"$target_file\" == *[*?[]* ]]; then\n local file file_name\n local matched=false\n local i=0\n # compgen -G expands the (quoted) pattern itself, so paths containing\n # spaces glob correctly; reading line by line keeps each match intact.\n while IFS= read -r file; do\n [[ -n \"$file\" ]] || continue\n [[ -e \"$file\" || -L \"$file\" ]] || continue\n matched=true\n i=$((i + 1))\n file_name=\"$(basename \"$file\")\"\n echo \"removing $file.\"\n # The per-match counter keeps matches that share a basename from\n # overwriting each other in the trash.\n mv -f \"$file\" \"$trash/${file_name}_${timestamp}_${rand}_${i}\"\n done < <(compgen -G \"$target_file\" 2>/dev/null)\n if [[ \"$matched\" == false ]]; then\n echo \"$target_file doesn't exist.\"\n fi\n return\n fi\n\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/Bezel.app\"\ntrash $LOGGED_IN_USER '/Library/Preferences/com.apple.BezelServices.plist'\ntrash $LOGGED_IN_USER '~/Library/Application Scripts/com.nonstrict.BezelAppleTVHelper'\ntrash $LOGGED_IN_USER '~/Library/Application Scripts/com.nonstrict.BezelDALService'\ntrash $LOGGED_IN_USER '~/Library/Application Support/com.apple.sharedfilelist/com.apple.LSSharedFileList.ApplicationRecentDocuments/com.nonstrict.bezel-direct.sfl*'\ntrash $LOGGED_IN_USER '~/Library/Application Support/com.nonstrict.Bezel-direct'\ntrash $LOGGED_IN_USER '~/Library/Caches/com.nonstrict.Bezel-direct'\ntrash $LOGGED_IN_USER '~/Library/Containers/com.nonstrict.BezelAppleTVHelper'\ntrash $LOGGED_IN_USER '~/Library/Containers/com.nonstrict.BezelDALService'\ntrash $LOGGED_IN_USER '~/Library/HTTPStorages/com.nonstrict.Bezel-direct'\ntrash $LOGGED_IN_USER '~/Library/Preferences/com.apple.BezelServices.plist'\ntrash $LOGGED_IN_USER '~/Library/Preferences/com.nonstrict.Bezel-direct.plist'\n", "d8080b2a": "#!/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\nunzip \"$INSTALLER_PATH\" -d \"$TMPDIR\"\n# copy to the applications folder\nquit_and_track_application 'com.nonstrict.Bezel-direct'\nif [ -d \"$APPDIR/Bezel.app\" ]; then\n\tsudo mv \"$APPDIR/Bezel.app\" \"$TMPDIR/Bezel.app.bkp\" || exit $?\nfi\nif ! sudo cp -R \"$TMPDIR/Bezel.app\" \"$APPDIR\"; then\n\t# remove the partial copy so a failed install isn't inventoried as the new\n\t# version, then restore the previous version if there was one\n\tsudo rm -rf \"$APPDIR/Bezel.app\"\n\tif [ -d \"$TMPDIR/Bezel.app.bkp\" ]; then\n\t\tsudo mv \"$TMPDIR/Bezel.app.bkp\" \"$APPDIR/Bezel.app\"\n\tfi\n\texit 1\nfi\nrelaunch_application 'com.nonstrict.Bezel-direct'\n" } } diff --git a/ee/maintained-apps/outputs/canva/darwin.json b/ee/maintained-apps/outputs/canva/darwin.json index 1d6eac9fe9e..04d9da7bdb5 100644 --- a/ee/maintained-apps/outputs/canva/darwin.json +++ b/ee/maintained-apps/outputs/canva/darwin.json @@ -1,16 +1,16 @@ { "versions": [ { - "version": "1.124.1", + "version": "1.125.0", "queries": { "exists": "SELECT 1 FROM apps WHERE bundle_identifier = 'com.canva.CanvaDesktop';", - "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'com.canva.CanvaDesktop' AND version_compare(bundle_short_version, '1.124.1') < 0);", + "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'com.canva.CanvaDesktop' AND version_compare(bundle_short_version, '1.125.0') < 0);", "open": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps a JOIN processes p ON p.path = concat(a.path, '/Contents/MacOS/', a.bundle_executable) WHERE a.bundle_identifier = 'com.canva.CanvaDesktop' AND a.bundle_executable != '');" }, - "installer_url": "https://desktop-release.canva.com/Canva-1.124.1-universal.dmg", + "installer_url": "https://desktop-release.canva.com/Canva-1.125.0-universal.dmg", "install_script_ref": "c3a04904", "uninstall_script_ref": "8588c4f7", - "sha256": "d5772b5bed2da9dadabd256beb92ecd70617013a1fbf2844fc2ff78cdbea3266", + "sha256": "50b997c17d9ce00fe32de108039d423d255c530e0e52410fcd41a9f462e76ac3", "default_categories": [ "Productivity" ] diff --git a/ee/maintained-apps/outputs/canva/windows.json b/ee/maintained-apps/outputs/canva/windows.json index 3c9c061499f..966e8cf9a72 100644 --- a/ee/maintained-apps/outputs/canva/windows.json +++ b/ee/maintained-apps/outputs/canva/windows.json @@ -1,16 +1,16 @@ { "versions": [ { - "version": "1.124.1", + "version": "1.125.0", "queries": { "exists": "SELECT 1 FROM programs WHERE name = 'Canva' AND publisher = 'Canva Pty Ltd';", - "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM programs WHERE name = 'Canva' AND publisher = 'Canva Pty Ltd' AND version_compare(version, '1.124.1') < 0);", + "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM programs WHERE name = 'Canva' AND publisher = 'Canva Pty Ltd' AND version_compare(version, '1.125.0') < 0);", "open": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM processes WHERE LOWER(name) = 'canva.exe');" }, - "installer_url": "https://desktop-release.canva.com/Canva%20Setup%201.124.1.exe", + "installer_url": "https://desktop-release.canva.com/Canva%20Setup%201.125.0.exe", "install_script_ref": "fe9d2e65", "uninstall_script_ref": "9ae967f0", - "sha256": "04acf793e958b2fc50ec7d437986bb3c6d9f81359b8e7d34f3adb5ed4ac715ba", + "sha256": "f2a5d273d107052d54707b9ff6f3b4c4fdbb34d75ea9cf3442e0da097b0cfa96", "default_categories": [ "Productivity" ] diff --git a/ee/maintained-apps/outputs/chatgpt/darwin.json b/ee/maintained-apps/outputs/chatgpt/darwin.json index 658de5440a5..5a8e5bc0517 100644 --- a/ee/maintained-apps/outputs/chatgpt/darwin.json +++ b/ee/maintained-apps/outputs/chatgpt/darwin.json @@ -1,16 +1,16 @@ { "versions": [ { - "version": "26.901.51231", + "version": "26.903.61454", "queries": { "exists": "SELECT 1 FROM apps WHERE bundle_identifier = 'com.openai.chat';", - "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'com.openai.chat' AND version_compare(bundle_short_version, '26.901.51231') < 0);", + "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'com.openai.chat' AND version_compare(bundle_short_version, '26.903.61454') < 0);", "open": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps a JOIN processes p ON p.path = concat(a.path, '/Contents/MacOS/', a.bundle_executable) WHERE a.bundle_identifier = 'com.openai.chat' AND a.bundle_executable != '');" }, - "installer_url": "https://persistent.oaistatic.com/codex-app-prod/ChatGPT-darwin-arm64-26.901.51231.zip", + "installer_url": "https://persistent.oaistatic.com/codex-app-prod/ChatGPT-darwin-arm64-26.903.61454.zip", "install_script_ref": "cbce2d7d", "uninstall_script_ref": "678e6cf0", - "sha256": "8ddc4e0f0e7c8024d64169f84cf54c544778d1d8bfea1ffd3c2b0d2e3ea85934", + "sha256": "28d00cdf540522bdf8f100fcfe1a64f3cda81d2a5cd8e0ae6f1f3382caae9f7f", "default_categories": [ "Productivity" ] diff --git a/ee/maintained-apps/outputs/clickshare/darwin.json b/ee/maintained-apps/outputs/clickshare/darwin.json index f964f001752..bf5dee74bb5 100644 --- a/ee/maintained-apps/outputs/clickshare/darwin.json +++ b/ee/maintained-apps/outputs/clickshare/darwin.json @@ -1,16 +1,16 @@ { "versions": [ { - "version": "4.51.0", + "version": "4.51.1", "queries": { "exists": "SELECT 1 FROM apps WHERE bundle_identifier = 'com.barco.clickshare.updater';", - "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'com.barco.clickshare.updater' AND version_compare(bundle_short_version, '4.51.0') < 0);", + "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'com.barco.clickshare.updater' AND version_compare(bundle_short_version, '4.51.1') < 0);", "open": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps a JOIN processes p ON p.path = concat(a.path, '/Contents/MacOS/', a.bundle_executable) WHERE a.bundle_identifier = 'com.barco.clickshare.updater' AND a.bundle_executable != '');" }, - "installer_url": "https://assets.cloud.barco.com/clickshare/release/ClickShare-4.51.0-b7_mac.zip", + "installer_url": "https://assets.cloud.barco.com/clickshare/release/ClickShare-4.51.1-b4_mac.zip", "install_script_ref": "2723b00c", "uninstall_script_ref": "99373f02", - "sha256": "aa52fe1338b821a8fc56432c8a8d599d3264f1b715734908e33a3fa5290892bf", + "sha256": "c819d03dd1c19ef4d3a8f26bce7f30fa259c00d9262c4adced93afdeb5206dd2", "default_categories": [ "Communication" ] diff --git a/ee/maintained-apps/outputs/devin-desktop/darwin.json b/ee/maintained-apps/outputs/devin-desktop/darwin.json index 7ec9cc53de2..b4256c0a01e 100644 --- a/ee/maintained-apps/outputs/devin-desktop/darwin.json +++ b/ee/maintained-apps/outputs/devin-desktop/darwin.json @@ -1,16 +1,16 @@ { "versions": [ { - "version": "3.8.20", + "version": "3.9.19", "queries": { "exists": "SELECT 1 FROM apps WHERE bundle_identifier = 'com.exafunction.windsurf';", - "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'com.exafunction.windsurf' AND version_compare(bundle_short_version, '3.8.20') < 0);", + "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'com.exafunction.windsurf' AND version_compare(bundle_short_version, '3.9.19') < 0);", "open": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps a JOIN processes p ON p.path = concat(a.path, '/Contents/MacOS/', a.bundle_executable) WHERE a.bundle_identifier = 'com.exafunction.windsurf' AND a.bundle_executable != '');" }, - "installer_url": "https://windsurf-stable.codeiumdata.com/darwin-arm64-dmg/stable/2d9020110aa91587b3c3b0fcf7d1faaf601fc7b8/Devin-darwin-arm64-3.8.20.dmg", + "installer_url": "https://windsurf-stable.codeiumdata.com/darwin-arm64-dmg/stable/e2b252e21dd5cdfd88fce58f49477260e90294bc/Devin-darwin-arm64-3.9.19.dmg", "install_script_ref": "cea2287e", "uninstall_script_ref": "4fdaa2d1", - "sha256": "2d606a3cf77b0d7da96b68e22edd5a353731c6aec772f41e9724c83f74897a0e", + "sha256": "6d1b779fde24388b4e336f27b62439ed6784080cc0cc9464072e9425da7bdb4f", "default_categories": [ "Developer tools" ] diff --git a/ee/maintained-apps/outputs/drawio/darwin.json b/ee/maintained-apps/outputs/drawio/darwin.json index bbdae06f0e0..d62b96c572b 100644 --- a/ee/maintained-apps/outputs/drawio/darwin.json +++ b/ee/maintained-apps/outputs/drawio/darwin.json @@ -1,16 +1,16 @@ { "versions": [ { - "version": "31.4.4", + "version": "31.4.5", "queries": { "exists": "SELECT 1 FROM apps WHERE bundle_identifier = 'com.jgraph.drawio.desktop';", - "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'com.jgraph.drawio.desktop' AND version_compare(bundle_short_version, '31.4.4') < 0);", + "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'com.jgraph.drawio.desktop' AND version_compare(bundle_short_version, '31.4.5') < 0);", "open": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps a JOIN processes p ON p.path = concat(a.path, '/Contents/MacOS/', a.bundle_executable) WHERE a.bundle_identifier = 'com.jgraph.drawio.desktop' AND a.bundle_executable != '');" }, - "installer_url": "https://github.com/jgraph/drawio-desktop/releases/download/v31.4.4/draw.io-arm64-31.4.4.dmg", + "installer_url": "https://github.com/jgraph/drawio-desktop/releases/download/v31.4.5/draw.io-arm64-31.4.5.dmg", "install_script_ref": "dfbabf21", "uninstall_script_ref": "870cb348", - "sha256": "46d8f352d51ec8a036e4ad2a166e4b00eb9a6d2aec758619cddaa1fae16b7929", + "sha256": "9f73e9970f0a720c1b9a553c7caf0c1160cabbb03c7b90e968ff3b704aaf56a9", "default_categories": [ "Productivity" ] diff --git a/ee/maintained-apps/outputs/drawio/windows.json b/ee/maintained-apps/outputs/drawio/windows.json index 2cfc39c6f43..6bda90b084a 100644 --- a/ee/maintained-apps/outputs/drawio/windows.json +++ b/ee/maintained-apps/outputs/drawio/windows.json @@ -1,16 +1,16 @@ { "versions": [ { - "version": "31.3.2", + "version": "31.4.4", "queries": { "exists": "SELECT 1 FROM programs WHERE name = 'draw.io' AND publisher = 'JGraph';", - "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM programs WHERE name = 'draw.io' AND publisher = 'JGraph' AND version_compare(version, '31.3.2') < 0);", + "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM programs WHERE name = 'draw.io' AND publisher = 'JGraph' AND version_compare(version, '31.4.4') < 0);", "open": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM processes WHERE LOWER(name) = 'draw.io.exe');" }, - "installer_url": "https://github.com/jgraph/drawio-desktop/releases/download/v31.3.2/draw.io-31.3.2-windows-installer.exe", + "installer_url": "https://github.com/jgraph/drawio-desktop/releases/download/v31.4.4/draw.io-31.4.4-windows-installer.exe", "install_script_ref": "51038703", "uninstall_script_ref": "63a061f9", - "sha256": "4ce9f1d4b6cc058caecd1423b3f7a94c7520e2c743fc203841b738e002ac75d6", + "sha256": "48dc9dd739dbddc0ce892dd34be3bfc6e13dbe1a454529178fe1197e7acddbb3", "default_categories": [ "Productivity" ] diff --git a/ee/maintained-apps/outputs/duo-desktop/darwin.json b/ee/maintained-apps/outputs/duo-desktop/darwin.json index b8fccb421c7..2c14d4268fe 100644 --- a/ee/maintained-apps/outputs/duo-desktop/darwin.json +++ b/ee/maintained-apps/outputs/duo-desktop/darwin.json @@ -1,16 +1,16 @@ { "versions": [ { - "version": "7.20.0.0", + "version": "7.21.0.0", "queries": { "exists": "SELECT 1 FROM apps WHERE bundle_identifier = 'com.duosecurity.duo-device-health';", - "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'com.duosecurity.duo-device-health' AND version_compare(bundle_short_version, '7.20.0.0') < 0);", + "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'com.duosecurity.duo-device-health' AND version_compare(bundle_short_version, '7.21.0.0') < 0);", "open": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps a JOIN processes p ON p.path = concat(a.path, '/Contents/MacOS/', a.bundle_executable) WHERE a.bundle_identifier = 'com.duosecurity.duo-device-health' AND a.bundle_executable != '');" }, - "installer_url": "https://dl.duosecurity.com/DuoDesktop-7.20.0.0.pkg", - "install_script_ref": "96c63e5c", + "installer_url": "https://dl.duosecurity.com/DuoDesktop-7.21.0.0.pkg", + "install_script_ref": "f38b6211", "uninstall_script_ref": "7d07a79c", - "sha256": "47b29b0080bcab38a513e334f94d6930b21a9b69c273a2b32c63af341727095d", + "sha256": "fc23141655d460ebb6bde84adc995cb5f8aa30763fdb70d1805b1b91123c412c", "default_categories": [ "Productivity" ] @@ -18,6 +18,6 @@ ], "refs": { "7d07a79c": "#!/bin/bash\n\n# variables\nLOGGED_IN_USER=$(scutil <<< \"show State:/Users/ConsoleUser\" | awk '/Name :/ { print $3 }')\n# functions\n\nexpand_pkgid_and_map() {\n local PKGID=\"$1\"\n local FUNC=\"$2\"\n if [[ \"$PKGID\" == *\"*\" ]]; then\n local prefix=\"${PKGID%\\*}\"\n echo \"Expanding wildcard for PKGID: $PKGID\"\n for receipt in $(pkgutil --pkgs | grep \"^${prefix}\"); do\n echo \"Processing $receipt\"\n \"$FUNC\" \"$receipt\"\n done\n else\n \"$FUNC\" \"$PKGID\"\n fi\n}\n\nforget_pkg() {\n local PKGID=\"$1\"\n expand_pkgid_and_map \"$PKGID\" forget_receipt\n}\n\nforget_receipt() {\n local PKGID=\"$1\"\n sudo pkgutil --forget \"$PKGID\"\n}\n\nquit_application() {\n local bundle_id=\"$1\"\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 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 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\nremove_launchctl_service() {\n local service=\"$1\"\n local booleans=(\"true\" \"false\")\n local plist_status\n local paths\n local should_sudo\n\n echo \"Removing launchctl service ${service}\"\n\n # A wildcard label can't be used with launchctl or as a plist name, so expand\n # it to the labels of currently loaded services that match the pattern.\n local services=(\"$service\")\n if [[ \"$service\" == *\"*\"* ]]; then\n local regex\n # Escape regex metacharacters, turn '*' into '.*', and anchor the pattern so\n # it matches a full label rather than a substring.\n regex=$(printf '%s' \"$service\" | sed -e 's/[][(){}.^$+?|\\\\]/\\\\&/g' -e 's/\\*/.*/g')\n regex=\"^${regex}$\"\n services=()\n local id\n # Match every loaded job by label regardless of PID; launchctl list reports\n # loaded-but-not-running jobs with a \"-\" in the PID column.\n while read -r _ _ id; do\n [[ \"$id\" =~ $regex ]] && services+=(\"$id\")\n done < <(launchctl list 2>/dev/null | tail -n +2)\n if [[ ${#services[@]} -eq 0 ]]; then\n echo \"No loaded launchctl service matches ${service}\"\n return\n fi\n fi\n\n local service_label\n for service_label in \"${services[@]}\"; do\n for should_sudo in \"${booleans[@]}\"; do\n plist_status=$(launchctl list \"${service_label}\" 2>/dev/null)\n\n if [[ $plist_status == \\{* ]]; then\n if [[ $should_sudo == \"true\" ]]; then\n sudo launchctl remove \"${service_label}\"\n else\n launchctl remove \"${service_label}\"\n fi\n sleep 1\n fi\n\n paths=(\n \"/Library/LaunchAgents/${service_label}.plist\"\n \"/Library/LaunchDaemons/${service_label}.plist\"\n )\n\n # if not using sudo, prepend the home directory to the paths\n if [[ $should_sudo == \"false\" ]]; then\n for i in \"${!paths[@]}\"; do\n paths[i]=\"${HOME}${paths[i]}\"\n done\n fi\n\n for path in \"${paths[@]}\"; do\n if [[ -e \"$path\" ]]; then\n if [[ $should_sudo == \"true\" ]]; then\n sudo rm -f -- \"$path\"\n else\n rm -f -- \"$path\"\n fi\n fi\n done\n done\n done\n}\n\nremove_pkg_files() {\n local PKGID=\"$1\"\n expand_pkgid_and_map \"$PKGID\" remove_receipt_files\n}\n\nremove_receipt_files() {\n local PKGID=\"$1\"\n local PKGINFO VOLUME INSTALL_LOCATION FULL_INSTALL_LOCATION\n\n echo \"pkgutil --pkg-info-plist \\\"$PKGID\\\"\"\n PKGINFO=$(pkgutil --pkg-info-plist \"$PKGID\")\n VOLUME=$(echo \"$PKGINFO\" | awk '/volume<\\/key>/ {getline; gsub(/.*|<\\/string>.*/, \"\"); print}')\n INSTALL_LOCATION=$(echo \"$PKGINFO\" | awk '/install-location<\\/key>/ {getline; gsub(/.*|<\\/string>.*/, \"\"); print}')\n\n if [ -z \"$INSTALL_LOCATION\" ] || [ \"$INSTALL_LOCATION\" = \"/\" ]; then\n FULL_INSTALL_LOCATION=\"$VOLUME\"\n else\n FULL_INSTALL_LOCATION=\"$VOLUME/$INSTALL_LOCATION\"\n FULL_INSTALL_LOCATION=$(echo \"$FULL_INSTALL_LOCATION\" | sed 's|//|/|g')\n fi\n\n echo \"sudo pkgutil --only-files --files \\\"$PKGID\\\" | sed \\\"s|^|${FULL_INSTALL_LOCATION}/|\\\" | tr '\\\\\\\\n' '\\\\\\\\0' | /usr/bin/sudo -u root -E -- /usr/bin/xargs -0 -- /bin/rm -rf\"\n sudo pkgutil --only-files --files \"$PKGID\" | sed \"s|^|/${INSTALL_LOCATION}/|\" | tr '\\n' '\\0' | /usr/bin/sudo -u root -E -- /usr/bin/xargs -0 -- /bin/rm -rf\n\n echo \"sudo pkgutil --only-dirs --files \\\"$PKGID\\\" | sed \\\"s|^|${FULL_INSTALL_LOCATION}/|\\\" | grep '\\\\.app$' | tr '\\\\\\\\n' '\\\\\\\\0' | /usr/bin/sudo -u root -E -- /usr/bin/xargs -0 -- /bin/rm -rf\"\n sudo pkgutil --only-dirs --files \"$PKGID\" | sed \"s|^|${FULL_INSTALL_LOCATION}/|\" | grep '\\.app$' | tr '\\n' '\\0' | /usr/bin/sudo -u root -E -- /usr/bin/xargs -0 -- /bin/rm -rf\n\n root_app_dir=$(\n sudo pkgutil --only-dirs --files \"$PKGID\" \\\n | sed \"s|^|${FULL_INSTALL_LOCATION}/|\" \\\n | grep 'Applications' \\\n | awk '{ print length, $0 }' \\\n | sort -n \\\n | head -n1 \\\n | cut -d' ' -f2-\n )\n if [ -n \"$root_app_dir\" ]; then\n echo \"sudo rmdir -p \\\"$root_app_dir\\\" 2>/dev/null || :\"\n sudo rmdir -p \"$root_app_dir\" 2>/dev/null || :\n fi\n}\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\n # If the target contains glob characters, expand it and move each match.\n if [[ \"$target_file\" == *[*?[]* ]]; then\n local file file_name\n local matched=false\n local i=0\n # compgen -G expands the (quoted) pattern itself, so paths containing\n # spaces glob correctly; reading line by line keeps each match intact.\n while IFS= read -r file; do\n [[ -n \"$file\" ]] || continue\n [[ -e \"$file\" || -L \"$file\" ]] || continue\n matched=true\n i=$((i + 1))\n file_name=\"$(basename \"$file\")\"\n echo \"removing $file.\"\n # The per-match counter keeps matches that share a basename from\n # overwriting each other in the trash.\n mv -f \"$file\" \"$trash/${file_name}_${timestamp}_${rand}_${i}\"\n done < <(compgen -G \"$target_file\" 2>/dev/null)\n if [[ \"$matched\" == false ]]; then\n echo \"$target_file doesn't exist.\"\n fi\n return\n fi\n\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\nremove_launchctl_service 'com.duosecurity.duoappupdater'\nremove_launchctl_service 'com.duosecurity.DuoDesktopService'\nremove_launchctl_service 'com.duosecurity.ForceLaunchDuoDesktop'\nremove_launchctl_service 'com.duosecurity.LaunchDuoDesktop'\nremove_launchctl_service 'com.duosecurity.trustedpeermessagebroker'\nquit_application 'com.duosecurity.duo-device-health'\nremove_pkg_files 'com.duosecurity.duo-device-health'\nforget_pkg 'com.duosecurity.duo-device-health'\nsudo rm -rf '/Applications/Duo Desktop.app'\nsudo rm -rf '/Library/LaunchAgents/com.duosecurity.ForceLaunchDuoDesktop.plist'\nsudo rm -rf '/Library/LaunchAgents/com.duosecurity.LaunchDuoDesktop.plist'\nsudo rm -rf '/Library/LaunchDaemons/com.duosecurity.duoappupdater.plist'\nsudo rm -rf '/Library/LaunchDaemons/com.duosecurity.DuoDesktopService.plist'\nsudo rm -rf '/Library/LaunchDaemons/com.duosecurity.trustedpeermessagebroker.plist'\ntrash $LOGGED_IN_USER '/Library/Logs/Duo'\ntrash $LOGGED_IN_USER '~/Library/Caches/com.duosecurity.duo-device-health'\ntrash $LOGGED_IN_USER '~/Library/Logs/Duo Desktop'\ntrash $LOGGED_IN_USER '~/Library/Preferences/com.duosecurity.devicehealth.localdata.plist'\ntrash $LOGGED_IN_USER '~/Library/Preferences/com.duosecurity.duo-device-health.plist'\n", - "96c63e5c": "#!/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# install pkg files\nquit_and_track_application 'com.duosecurity.duo-device-health'\nsudo installer -pkg \"$TMPDIR/DuoDesktop-7.20.0.0.pkg\" -target / || exit $?\nrelaunch_application 'com.duosecurity.duo-device-health'\n" + "f38b6211": "#!/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# install pkg files\nquit_and_track_application 'com.duosecurity.duo-device-health'\nsudo installer -pkg \"$TMPDIR/DuoDesktop-7.21.0.0.pkg\" -target / || exit $?\nrelaunch_application 'com.duosecurity.duo-device-health'\n" } } diff --git a/ee/maintained-apps/outputs/figma/windows.json b/ee/maintained-apps/outputs/figma/windows.json index 0e17e2a4433..6478a2d66fb 100644 --- a/ee/maintained-apps/outputs/figma/windows.json +++ b/ee/maintained-apps/outputs/figma/windows.json @@ -1,16 +1,16 @@ { "versions": [ { - "version": "126.8.16", + "version": "126.8.18", "queries": { "exists": "SELECT 1 FROM programs WHERE name = 'Figma' AND publisher = 'Figma, Inc.';", - "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM programs WHERE name = 'Figma' AND publisher = 'Figma, Inc.' AND version_compare(version, '126.8.16') < 0);", + "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM programs WHERE name = 'Figma' AND publisher = 'Figma, Inc.' AND version_compare(version, '126.8.18') < 0);", "open": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM processes WHERE LOWER(name) = 'figma.exe');" }, - "installer_url": "https://desktop.figma.com/win/build/Figma-126.8.16.exe", + "installer_url": "https://desktop.figma.com/win/build/Figma-126.8.18.exe", "install_script_ref": "442d71b3", "uninstall_script_ref": "e33afd6b", - "sha256": "4d1b3b2fc08e8b55e5700f55e08ef44719ac2e45269e48875fda87b3f46a6750", + "sha256": "3522da7b9666b20c08698043ff306c5b89b634cf7ef8acc7337ae3e7e9b3d538", "default_categories": [ "Productivity" ] diff --git a/ee/maintained-apps/outputs/firefox@developer-edition/windows.json b/ee/maintained-apps/outputs/firefox@developer-edition/windows.json index 03bebcea92f..da211cd12f3 100644 --- a/ee/maintained-apps/outputs/firefox@developer-edition/windows.json +++ b/ee/maintained-apps/outputs/firefox@developer-edition/windows.json @@ -1,16 +1,16 @@ { "versions": [ { - "version": "151.0", + "version": "156.0", "queries": { "exists": "SELECT 1 FROM programs WHERE name = 'Firefox Developer Edition (x64 en-US)' AND publisher = 'Mozilla';", - "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM programs WHERE name = 'Firefox Developer Edition (x64 en-US)' AND publisher = 'Mozilla' AND version_compare(version, '151.0') < 0);", + "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM programs WHERE name = 'Firefox Developer Edition (x64 en-US)' AND publisher = 'Mozilla' AND version_compare(version, '156.0') < 0);", "open": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM processes WHERE LOWER(name) = 'mozilla firefox developer edition.exe');" }, - "installer_url": "https://download-installer.cdn.mozilla.net/pub/devedition/releases/151.0b10/win64/en-US/Firefox%20Setup%20151.0b10.exe", + "installer_url": "https://download-installer.cdn.mozilla.net/pub/devedition/releases/156.0b2/win64/en-US/Firefox%20Setup%20156.0b2.exe", "install_script_ref": "8c6800a6", "uninstall_script_ref": "cc59b3f5", - "sha256": "ef21f97a29de39f55882368e22189c32c289518e9063acf89d1eb28b12f31023", + "sha256": "16474c74b4c8456f283e2bbdc53ce1689582a816ae100555c459d6aebbecce8d", "default_categories": [ "Browsers" ] diff --git a/ee/maintained-apps/outputs/firefox@nightly/darwin.json b/ee/maintained-apps/outputs/firefox@nightly/darwin.json index d0b5b593128..864d93a375b 100644 --- a/ee/maintained-apps/outputs/firefox@nightly/darwin.json +++ b/ee/maintained-apps/outputs/firefox@nightly/darwin.json @@ -7,10 +7,10 @@ "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'org.mozilla.nightly' AND version_compare(bundle_version, '15726.9.8') < 0);", "open": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps a JOIN processes p ON p.path = concat(a.path, '/Contents/MacOS/', a.bundle_executable) WHERE a.bundle_identifier = 'org.mozilla.nightly' AND a.bundle_executable != '');" }, - "installer_url": "https://ftp.mozilla.org/pub/firefox/nightly/2026/09/2026-09-08-04-21-39-mozilla-central/firefox-157.0a1.en-US.mac.dmg", + "installer_url": "https://ftp.mozilla.org/pub/firefox/nightly/2026/09/2026-09-08-21-54-17-mozilla-central/firefox-157.0a1.en-US.mac.dmg", "install_script_ref": "d9c4cf87", "uninstall_script_ref": "0661f848", - "sha256": "edae4362a46f51fb45e77435516df3ed9c831aa281cb8b2834e8c71876debc00", + "sha256": "2de5209d14f4713e23f72fd8556ac64c007f8502c1330de67323ae98b1318ca1", "default_categories": [ "Browsers" ] diff --git a/ee/maintained-apps/outputs/foxit-pdf-editor/windows.json b/ee/maintained-apps/outputs/foxit-pdf-editor/windows.json index be848091191..ce4103ec4f8 100644 --- a/ee/maintained-apps/outputs/foxit-pdf-editor/windows.json +++ b/ee/maintained-apps/outputs/foxit-pdf-editor/windows.json @@ -1,16 +1,16 @@ { "versions": [ { - "version": "14.0.6.33584", + "version": "14.0.7.33751", "queries": { "exists": "SELECT 1 FROM programs WHERE name = 'Foxit PDF Editor' AND publisher = 'Foxit Software Inc.';", - "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM programs WHERE name = 'Foxit PDF Editor' AND publisher = 'Foxit Software Inc.' AND version_compare(version, '14.0.6.33584') < 0);", + "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM programs WHERE name = 'Foxit PDF Editor' AND publisher = 'Foxit Software Inc.' AND version_compare(version, '14.0.7.33751') < 0);", "open": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM processes WHERE LOWER(name) = 'foxit pdf editor.exe');" }, - "installer_url": "https://cdn01.foxitsoftware.com/product/Editor/desktop/win/14.0.6/FoxitPDFEditor1406_L10N_Setup_x64.exe", + "installer_url": "https://cdn01.foxitsoftware.com/product/Editor/desktop/win/14.0.7/FoxitPDFEditor1407_L10N_Setup_x64.exe", "install_script_ref": "a6208245", "uninstall_script_ref": "5d55608a", - "sha256": "e62e746cfadb8288a5c2887bfbb25a88d75b8498709eefaa61f00dea74321f8e", + "sha256": "d8444d2996c7574857a7e928d072b61fbc5ddb5a2cfeb15f71cea0c5e0aad05f", "default_categories": [ "Productivity" ] diff --git a/ee/maintained-apps/outputs/google-chrome/darwin.json b/ee/maintained-apps/outputs/google-chrome/darwin.json index 30b6e6e2240..6254b9d8f79 100644 --- a/ee/maintained-apps/outputs/google-chrome/darwin.json +++ b/ee/maintained-apps/outputs/google-chrome/darwin.json @@ -1,10 +1,10 @@ { "versions": [ { - "version": "152.0.7977.83", + "version": "153.0.8010.37", "queries": { "exists": "SELECT 1 FROM apps WHERE bundle_identifier = 'com.google.Chrome';", - "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'com.google.Chrome' AND version_compare(bundle_short_version, '152.0.7977.83') < 0);", + "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'com.google.Chrome' AND version_compare(bundle_short_version, '153.0.8010.37') < 0);", "open": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps a JOIN processes p ON p.path = concat(a.path, '/Contents/MacOS/', a.bundle_executable) WHERE a.bundle_identifier = 'com.google.Chrome' AND a.bundle_executable != '');" }, "installer_url": "https://dl.google.com/dl/chrome/mac/universal/stable/gcem/GoogleChrome.pkg", diff --git a/ee/maintained-apps/outputs/google-chrome/windows.json b/ee/maintained-apps/outputs/google-chrome/windows.json index eff6ee2455e..738f808c7b0 100644 --- a/ee/maintained-apps/outputs/google-chrome/windows.json +++ b/ee/maintained-apps/outputs/google-chrome/windows.json @@ -1,10 +1,10 @@ { "versions": [ { - "version": "152.0.7977.83", + "version": "153.0.8010.37", "queries": { "exists": "SELECT 1 FROM programs WHERE name = 'Google Chrome' AND publisher = 'Google LLC';", - "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM programs WHERE name = 'Google Chrome' AND publisher = 'Google LLC' AND version_compare(version, '152.0.7977.83') < 0);", + "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM programs WHERE name = 'Google Chrome' AND publisher = 'Google LLC' AND version_compare(version, '153.0.8010.37') < 0);", "open": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM processes WHERE LOWER(name) = 'chrome.exe');" }, "installer_url": "https://dl.google.com/dl/chrome/install/googlechromestandaloneenterprise64.msi", diff --git a/ee/maintained-apps/outputs/google-drive/darwin.json b/ee/maintained-apps/outputs/google-drive/darwin.json index b55604d0e2d..2b4529c1386 100644 --- a/ee/maintained-apps/outputs/google-drive/darwin.json +++ b/ee/maintained-apps/outputs/google-drive/darwin.json @@ -1,10 +1,10 @@ { "versions": [ { - "version": "130.0", + "version": "131.0", "queries": { "exists": "SELECT 1 FROM apps WHERE bundle_identifier = 'com.google.drivefs';", - "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'com.google.drivefs' AND version_compare(bundle_short_version, '130.0') < 0);", + "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'com.google.drivefs' AND version_compare(bundle_short_version, '131.0') < 0);", "open": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps a JOIN processes p ON p.path = concat(a.path, '/Contents/MacOS/', a.bundle_executable) WHERE a.bundle_identifier = 'com.google.drivefs' AND a.bundle_executable != '');" }, "installer_url": "https://dl.google.com/drive-file-stream/5-percent/GoogleDrive.dmg", diff --git a/ee/maintained-apps/outputs/gyazo/darwin.json b/ee/maintained-apps/outputs/gyazo/darwin.json index 139bfc308e8..ed226e18f2a 100644 --- a/ee/maintained-apps/outputs/gyazo/darwin.json +++ b/ee/maintained-apps/outputs/gyazo/darwin.json @@ -1,16 +1,16 @@ { "versions": [ { - "version": "11.1.0", + "version": "11.2.0", "queries": { "exists": "SELECT 1 FROM apps WHERE bundle_identifier = 'com.gyazo.menu';", - "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'com.gyazo.menu' AND version_compare(bundle_short_version, '11.1.0') < 0);", + "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'com.gyazo.menu' AND version_compare(bundle_short_version, '11.2.0') < 0);", "open": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps a JOIN processes p ON p.path = concat(a.path, '/Contents/MacOS/', a.bundle_executable) WHERE a.bundle_identifier = 'com.gyazo.menu' AND a.bundle_executable != '');" }, - "installer_url": "https://files.gyazo.com/setup/Gyazo-11.1.0.pkg", + "installer_url": "https://files.gyazo.com/setup/Gyazo-11.2.0.pkg", "install_script_ref": "0ea4a9bb", "uninstall_script_ref": "290484a1", - "sha256": "9386f93eba4991847850bc1935a53d0337c97713c5a6114c70c9a292aa3dd02e", + "sha256": "c201ad45449c560a4e00d0c2bc79abbde9e9289c5b2b4fe31ddd101ef9e6a9e9", "default_categories": [ "Productivity" ] diff --git a/ee/maintained-apps/outputs/highlight-ai/darwin.json b/ee/maintained-apps/outputs/highlight-ai/darwin.json index 61ed3149352..fcd8eb35802 100644 --- a/ee/maintained-apps/outputs/highlight-ai/darwin.json +++ b/ee/maintained-apps/outputs/highlight-ai/darwin.json @@ -1,16 +1,16 @@ { "versions": [ { - "version": "1.3.282", + "version": "1.3.284", "queries": { "exists": "SELECT 1 FROM apps WHERE bundle_identifier = 'tv.medal.highlight';", - "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'tv.medal.highlight' AND version_compare(bundle_short_version, '1.3.282') < 0);", + "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'tv.medal.highlight' AND version_compare(bundle_short_version, '1.3.284') < 0);", "open": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps a JOIN processes p ON p.path = concat(a.path, '/Contents/MacOS/', a.bundle_executable) WHERE a.bundle_identifier = 'tv.medal.highlight' AND a.bundle_executable != '');" }, - "installer_url": "https://cdn.highlightai.com/releases/darwin/arm64/Highlight-1.3.282-arm64.dmg", + "installer_url": "https://cdn.highlightai.com/releases/darwin/arm64/Highlight-1.3.284-arm64.dmg", "install_script_ref": "2c254002", "uninstall_script_ref": "49c63a27", - "sha256": "e2de8a71cbe58f8891740d99e12ceba87ecc16a1d50ae7450b4302ac78aec9e9", + "sha256": "6ae6babcbec2860991e1aa18fd028f5cdf9b604a5b45bcd412097919d21b3908", "default_categories": [ "Productivity" ] diff --git a/ee/maintained-apps/outputs/iterm2/darwin.json b/ee/maintained-apps/outputs/iterm2/darwin.json index ba969581c9e..13053395ffa 100644 --- a/ee/maintained-apps/outputs/iterm2/darwin.json +++ b/ee/maintained-apps/outputs/iterm2/darwin.json @@ -1,16 +1,16 @@ { "versions": [ { - "version": "3.6.11", + "version": "3.7.0", "queries": { "exists": "SELECT 1 FROM apps WHERE bundle_identifier = 'com.googlecode.iterm2';", - "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'com.googlecode.iterm2' AND version_compare(bundle_short_version, '3.6.11') < 0);", + "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'com.googlecode.iterm2' AND version_compare(bundle_short_version, '3.7.0') < 0);", "open": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps a JOIN processes p ON p.path = concat(a.path, '/Contents/MacOS/', a.bundle_executable) WHERE a.bundle_identifier = 'com.googlecode.iterm2' AND a.bundle_executable != '');" }, - "installer_url": "https://iterm2.com/downloads/stable/iTerm2-3_6_11.zip", + "installer_url": "https://iterm2.com/downloads/stable/iTerm2-3_7_0.zip", "install_script_ref": "ca42742a", - "uninstall_script_ref": "d49e0980", - "sha256": "36e78c5049560eaa8e122224f6652eb4b229c61cd5e7332d6d25b5c36f7398e7", + "uninstall_script_ref": "df7c075c", + "sha256": "14b5131e9134d0012466574fba6d69fb9ef84eee66660ee861e2da483089574a", "default_categories": [ "Developer tools" ] @@ -18,6 +18,6 @@ ], "refs": { "ca42742a": "#!/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\nunzip \"$INSTALLER_PATH\" -d \"$TMPDIR\"\n# copy to the applications folder\nquit_and_track_application 'com.googlecode.iterm2'\nif [ -d \"$APPDIR/iTerm.app\" ]; then\n\tsudo mv \"$APPDIR/iTerm.app\" \"$TMPDIR/iTerm.app.bkp\" || exit $?\nfi\nif ! sudo cp -R \"$TMPDIR/iTerm.app\" \"$APPDIR\"; then\n\t# remove the partial copy so a failed install isn't inventoried as the new\n\t# version, then restore the previous version if there was one\n\tsudo rm -rf \"$APPDIR/iTerm.app\"\n\tif [ -d \"$TMPDIR/iTerm.app.bkp\" ]; then\n\t\tsudo mv \"$TMPDIR/iTerm.app.bkp\" \"$APPDIR/iTerm.app\"\n\tfi\n\texit 1\nfi\nrelaunch_application 'com.googlecode.iterm2'\n", - "d49e0980": "#!/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\n # If the target contains glob characters, expand it and move each match.\n if [[ \"$target_file\" == *[*?[]* ]]; then\n local file file_name\n local matched=false\n local i=0\n # compgen -G expands the (quoted) pattern itself, so paths containing\n # spaces glob correctly; reading line by line keeps each match intact.\n while IFS= read -r file; do\n [[ -n \"$file\" ]] || continue\n [[ -e \"$file\" || -L \"$file\" ]] || continue\n matched=true\n i=$((i + 1))\n file_name=\"$(basename \"$file\")\"\n echo \"removing $file.\"\n # The per-match counter keeps matches that share a basename from\n # overwriting each other in the trash.\n mv -f \"$file\" \"$trash/${file_name}_${timestamp}_${rand}_${i}\"\n done < <(compgen -G \"$target_file\" 2>/dev/null)\n if [[ \"$matched\" == false ]]; then\n echo \"$target_file doesn't exist.\"\n fi\n return\n fi\n\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/iTerm.app\"\ntrash $LOGGED_IN_USER '~/Library/Application Scripts/com.googlecode.iterm2.iTermFileProvider'\ntrash $LOGGED_IN_USER '~/Library/Application Support/com.apple.sharedfilelist/com.apple.LSSharedFileList.ApplicationRecentDocuments/com.googlecode.iterm2.itermai.sfl*'\ntrash $LOGGED_IN_USER '~/Library/Application Support/com.apple.sharedfilelist/com.apple.LSSharedFileList.ApplicationRecentDocuments/com.googlecode.iterm2.sfl*'\ntrash $LOGGED_IN_USER '~/Library/Application Support/iTerm'\ntrash $LOGGED_IN_USER '~/Library/Application Support/iTerm2'\ntrash $LOGGED_IN_USER '~/Library/Caches/com.googlecode.iterm2'\ntrash $LOGGED_IN_USER '~/Library/Containers/com.googlecode.iterm2.iTermFileProvider'\ntrash $LOGGED_IN_USER '~/Library/Containers/iTermAI'\ntrash $LOGGED_IN_USER '~/Library/Cookies/com.googlecode.iterm2.binarycookies'\ntrash $LOGGED_IN_USER '~/Library/HTTPStorages/com.googlecode.iterm2'\ntrash $LOGGED_IN_USER '~/Library/HTTPStorages/com.googlecode.iterm2.binarycookies'\ntrash $LOGGED_IN_USER '~/Library/Preferences/com.googlecode.iterm2.plist'\ntrash $LOGGED_IN_USER '~/Library/Preferences/com.googlecode.iterm2.private.plist'\ntrash $LOGGED_IN_USER '~/Library/Saved Application State/com.googlecode.iterm2*.savedState'\ntrash $LOGGED_IN_USER '~/Library/WebKit/com.googlecode.iterm2'\n" + "df7c075c": "#!/bin/bash\n\n# variables\nAPPDIR=\"/Applications/\"\nLOGGED_IN_USER=$(scutil <<< \"show State:/Users/ConsoleUser\" | awk '/Name :/ { print $3 }')\n# functions\n\nquit_application() {\n local bundle_id=\"$1\"\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 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 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\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\n # If the target contains glob characters, expand it and move each match.\n if [[ \"$target_file\" == *[*?[]* ]]; then\n local file file_name\n local matched=false\n local i=0\n # compgen -G expands the (quoted) pattern itself, so paths containing\n # spaces glob correctly; reading line by line keeps each match intact.\n while IFS= read -r file; do\n [[ -n \"$file\" ]] || continue\n [[ -e \"$file\" || -L \"$file\" ]] || continue\n matched=true\n i=$((i + 1))\n file_name=\"$(basename \"$file\")\"\n echo \"removing $file.\"\n # The per-match counter keeps matches that share a basename from\n # overwriting each other in the trash.\n mv -f \"$file\" \"$trash/${file_name}_${timestamp}_${rand}_${i}\"\n done < <(compgen -G \"$target_file\" 2>/dev/null)\n if [[ \"$matched\" == false ]]; then\n echo \"$target_file doesn't exist.\"\n fi\n return\n fi\n\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\nquit_application 'com.googlecode.iterm2'\nsudo rm -rf \"$APPDIR/iTerm.app\"\ntrash $LOGGED_IN_USER '~/Library/Application Scripts/com.googlecode.iterm2.iTermFileProvider'\ntrash $LOGGED_IN_USER '~/Library/Application Support/com.apple.sharedfilelist/com.apple.LSSharedFileList.ApplicationRecentDocuments/com.googlecode.iterm2.itermai.sfl*'\ntrash $LOGGED_IN_USER '~/Library/Application Support/com.apple.sharedfilelist/com.apple.LSSharedFileList.ApplicationRecentDocuments/com.googlecode.iterm2.sfl*'\ntrash $LOGGED_IN_USER '~/Library/Application Support/iTerm'\ntrash $LOGGED_IN_USER '~/Library/Application Support/iTerm2'\ntrash $LOGGED_IN_USER '~/Library/Caches/com.googlecode.iterm2'\ntrash $LOGGED_IN_USER '~/Library/Containers/com.googlecode.iterm2.iTermFileProvider'\ntrash $LOGGED_IN_USER '~/Library/Containers/iTermAI'\ntrash $LOGGED_IN_USER '~/Library/Cookies/com.googlecode.iterm2.binarycookies'\ntrash $LOGGED_IN_USER '~/Library/HTTPStorages/com.googlecode.iterm2'\ntrash $LOGGED_IN_USER '~/Library/HTTPStorages/com.googlecode.iterm2.binarycookies'\ntrash $LOGGED_IN_USER '~/Library/Preferences/com.googlecode.iterm2.plist'\ntrash $LOGGED_IN_USER '~/Library/Preferences/com.googlecode.iterm2.private.plist'\ntrash $LOGGED_IN_USER '~/Library/Saved Application State/com.googlecode.iterm2*.savedState'\ntrash $LOGGED_IN_USER '~/Library/WebKit/com.googlecode.iterm2'\n" } } diff --git a/ee/maintained-apps/outputs/jellyfin/darwin.json b/ee/maintained-apps/outputs/jellyfin/darwin.json index 0cd13510858..9f2f054deaa 100644 --- a/ee/maintained-apps/outputs/jellyfin/darwin.json +++ b/ee/maintained-apps/outputs/jellyfin/darwin.json @@ -9,7 +9,7 @@ }, "installer_url": "https://repo.jellyfin.org/files/server/macos/stable/v12.0/arm64/jellyfin_12.0-arm64.dmg", "install_script_ref": "386ec6ab", - "uninstall_script_ref": "b6c7238b", + "uninstall_script_ref": "a429b39d", "sha256": "5c6611e8b20c5a0ff9738c8ac18e7d0f02e77f02092a0e715e634ad8b2be4010", "default_categories": [ "Productivity" @@ -18,6 +18,6 @@ ], "refs": { "386ec6ab": "#!/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)\nyes | hdiutil attach -plist -nobrowse -readonly -mountpoint \"$MOUNT_POINT\" \"$INSTALLER_PATH\" || exit 1\nsudo cp -R \"$MOUNT_POINT\"/* \"$TMPDIR\"\nhdiutil detach \"$MOUNT_POINT\" || true\n# copy to the applications folder\nquit_and_track_application 'Jellyfin.Server'\nif [ -d \"$APPDIR/Jellyfin.app\" ]; then\n\tsudo mv \"$APPDIR/Jellyfin.app\" \"$TMPDIR/Jellyfin.app.bkp\" || exit $?\nfi\nif ! sudo cp -R \"$TMPDIR/Jellyfin.app\" \"$APPDIR\"; then\n\t# remove the partial copy so a failed install isn't inventoried as the new\n\t# version, then restore the previous version if there was one\n\tsudo rm -rf \"$APPDIR/Jellyfin.app\"\n\tif [ -d \"$TMPDIR/Jellyfin.app.bkp\" ]; then\n\t\tsudo mv \"$TMPDIR/Jellyfin.app.bkp\" \"$APPDIR/Jellyfin.app\"\n\tfi\n\texit 1\nfi\nrelaunch_application 'Jellyfin.Server'\n", - "b6c7238b": "#!/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\n # If the target contains glob characters, expand it and move each match.\n if [[ \"$target_file\" == *[*?[]* ]]; then\n local file file_name\n local matched=false\n local i=0\n # compgen -G expands the (quoted) pattern itself, so paths containing\n # spaces glob correctly; reading line by line keeps each match intact.\n while IFS= read -r file; do\n [[ -n \"$file\" ]] || continue\n [[ -e \"$file\" || -L \"$file\" ]] || continue\n matched=true\n i=$((i + 1))\n file_name=\"$(basename \"$file\")\"\n echo \"removing $file.\"\n # The per-match counter keeps matches that share a basename from\n # overwriting each other in the trash.\n mv -f \"$file\" \"$trash/${file_name}_${timestamp}_${rand}_${i}\"\n done < <(compgen -G \"$target_file\" 2>/dev/null)\n if [[ \"$matched\" == false ]]; then\n echo \"$target_file doesn't exist.\"\n fi\n return\n fi\n\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/Jellyfin.app\"\ntrash $LOGGED_IN_USER '/Library/Logs/DiagnosticReports/jellyfin*.diag'\ntrash $LOGGED_IN_USER '~/.cache/jellyfin'\ntrash $LOGGED_IN_USER '~/.config/jellyfin'\ntrash $LOGGED_IN_USER '~/.local/share/jellyfin'\ntrash $LOGGED_IN_USER '~/Library/Application Support/jellyfin'\ntrash $LOGGED_IN_USER '~/Library/Preferences/Jellyfin.Server.plist'\n" + "a429b39d": "#!/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\n # If the target contains glob characters, expand it and move each match.\n if [[ \"$target_file\" == *[*?[]* ]]; then\n local file file_name\n local matched=false\n local i=0\n # compgen -G expands the (quoted) pattern itself, so paths containing\n # spaces glob correctly; reading line by line keeps each match intact.\n while IFS= read -r file; do\n [[ -n \"$file\" ]] || continue\n [[ -e \"$file\" || -L \"$file\" ]] || continue\n matched=true\n i=$((i + 1))\n file_name=\"$(basename \"$file\")\"\n echo \"removing $file.\"\n # The per-match counter keeps matches that share a basename from\n # overwriting each other in the trash.\n mv -f \"$file\" \"$trash/${file_name}_${timestamp}_${rand}_${i}\"\n done < <(compgen -G \"$target_file\" 2>/dev/null)\n if [[ \"$matched\" == false ]]; then\n echo \"$target_file doesn't exist.\"\n fi\n return\n fi\n\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/Jellyfin.app\"\ntrash $LOGGED_IN_USER '/Library/Logs/DiagnosticReports/jellyfin*.diag'\ntrash $LOGGED_IN_USER '~/.cache/jellyfin'\ntrash $LOGGED_IN_USER '~/.config/jellyfin'\ntrash $LOGGED_IN_USER '~/.local/share/jellyfin'\ntrash $LOGGED_IN_USER '~/Library/Application Support/com.apple.sharedfilelist/com.apple.LSSharedFileList.ApplicationRecentDocuments/jellyfin.server.sfl*'\ntrash $LOGGED_IN_USER '~/Library/Application Support/jellyfin'\ntrash $LOGGED_IN_USER '~/Library/Preferences/Jellyfin.Server.plist'\n" } } diff --git a/ee/maintained-apps/outputs/kiro-cli/darwin.json b/ee/maintained-apps/outputs/kiro-cli/darwin.json index 541397bd8f6..9fe4096d815 100644 --- a/ee/maintained-apps/outputs/kiro-cli/darwin.json +++ b/ee/maintained-apps/outputs/kiro-cli/darwin.json @@ -1,16 +1,16 @@ { "versions": [ { - "version": "2.21.1", + "version": "2.21.2", "queries": { "exists": "SELECT 1 FROM apps WHERE bundle_identifier = 'dev.kiro.cli';", - "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'dev.kiro.cli' AND version_compare(bundle_short_version, '2.21.1') < 0);", + "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'dev.kiro.cli' AND version_compare(bundle_short_version, '2.21.2') < 0);", "open": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps a JOIN processes p ON p.path = concat(a.path, '/Contents/MacOS/', a.bundle_executable) WHERE a.bundle_identifier = 'dev.kiro.cli' AND a.bundle_executable != '');" }, - "installer_url": "https://desktop-release.q.us-east-1.amazonaws.com/2.21.1/Kiro%20CLI.dmg", + "installer_url": "https://desktop-release.q.us-east-1.amazonaws.com/2.21.2/Kiro%20CLI.dmg", "install_script_ref": "21bed962", "uninstall_script_ref": "ed98f0de", - "sha256": "3de3591ba23d44d16d49e8f372c4436c9c18ea446982c900a869193cfa21f85c", + "sha256": "fa9d638f52984ed530e90c38f3d64f185035dc5642f07b70c2ed1459321a9cc7", "default_categories": [ "Productivity" ] diff --git a/ee/maintained-apps/outputs/lenovo-dock-manager/windows.json b/ee/maintained-apps/outputs/lenovo-dock-manager/windows.json index 2d1324c06dd..c8384315199 100644 --- a/ee/maintained-apps/outputs/lenovo-dock-manager/windows.json +++ b/ee/maintained-apps/outputs/lenovo-dock-manager/windows.json @@ -1,16 +1,16 @@ { "versions": [ { - "version": "1.6.5.3", + "version": "1.6.5.4", "queries": { "exists": "SELECT 1 FROM programs WHERE name LIKE 'Lenovo Dock Manager %' AND publisher = 'Lenovo';", - "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM programs WHERE name LIKE 'Lenovo Dock Manager %' AND publisher = 'Lenovo' AND version_compare(version, '1.6.5.3') < 0);", + "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM programs WHERE name LIKE 'Lenovo Dock Manager %' AND publisher = 'Lenovo' AND version_compare(version, '1.6.5.4') < 0);", "open": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM processes WHERE LOWER(name) = 'dockmgr.exe');" }, - "installer_url": "https://download.lenovo.com/consumer/options/dockmanagersetup_1.6.5.3.exe", + "installer_url": "https://download.lenovo.com/consumer/options/dockmanager_1.6.5.4_setup.exe", "install_script_ref": "82f10c96", "uninstall_script_ref": "021699c4", - "sha256": "347f74c51c9b06e2c009ef4a399d23f8e4d8e0b610bcac669c7500d6e8a6090c", + "sha256": "757e98bbedaa3b5cb2494597a36eed346cd389bb8d42b7973c0dca29741d3cb5", "default_categories": [ "Productivity" ] diff --git a/ee/maintained-apps/outputs/malwarebytes/darwin.json b/ee/maintained-apps/outputs/malwarebytes/darwin.json index 33796aa1460..95132ae38e5 100644 --- a/ee/maintained-apps/outputs/malwarebytes/darwin.json +++ b/ee/maintained-apps/outputs/malwarebytes/darwin.json @@ -1,16 +1,16 @@ { "versions": [ { - "version": "5.27.0.4189", + "version": "5.27.1.4191", "queries": { "exists": "SELECT 1 FROM apps WHERE bundle_identifier = 'com.malwarebytes.mbam.frontend.application';", - "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'com.malwarebytes.mbam.frontend.application' AND version_compare(bundle_short_version, '5.27.0.4189') < 0);", + "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'com.malwarebytes.mbam.frontend.application' AND version_compare(bundle_short_version, '5.27.1.4191') < 0);", "open": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps a JOIN processes p ON p.path = concat(a.path, '/Contents/MacOS/', a.bundle_executable) WHERE a.bundle_identifier = 'com.malwarebytes.mbam.frontend.application' AND a.bundle_executable != '');" }, - "installer_url": "https://data-cdn.mbamupdates.com/web/mb5_mac/Malwarebytes-Mac-5.27.0.4189.pkg", - "install_script_ref": "8f85437f", + "installer_url": "https://data-cdn.mbamupdates.com/web/mb5_mac/Malwarebytes-Mac-5.27.1.4191.pkg", + "install_script_ref": "5322bb35", "uninstall_script_ref": "3b479c55", - "sha256": "fe27d9ce4f41d2f38226ea735d1ab040837ebd05a3673e51976c1eed244fc3d3", + "sha256": "b05b20460fd5657b9a2afd2d11ecd97aeae74502850bb5b6d0c80134864d30cc", "default_categories": [ "Security" ] @@ -18,6 +18,6 @@ ], "refs": { "3b479c55": "#!/bin/bash\n\n# variables\nLOGGED_IN_USER=$(scutil <<< \"show State:/Users/ConsoleUser\" | awk '/Name :/ { print $3 }')\n# functions\n\nexpand_pkgid_and_map() {\n local PKGID=\"$1\"\n local FUNC=\"$2\"\n if [[ \"$PKGID\" == *\"*\" ]]; then\n local prefix=\"${PKGID%\\*}\"\n echo \"Expanding wildcard for PKGID: $PKGID\"\n for receipt in $(pkgutil --pkgs | grep \"^${prefix}\"); do\n echo \"Processing $receipt\"\n \"$FUNC\" \"$receipt\"\n done\n else\n \"$FUNC\" \"$PKGID\"\n fi\n}\n\nforget_pkg() {\n local PKGID=\"$1\"\n expand_pkgid_and_map \"$PKGID\" forget_receipt\n}\n\nforget_receipt() {\n local PKGID=\"$1\"\n sudo pkgutil --forget \"$PKGID\"\n}\n\nquit_application() {\n local bundle_id=\"$1\"\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 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 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\nremove_launchctl_service() {\n local service=\"$1\"\n local booleans=(\"true\" \"false\")\n local plist_status\n local paths\n local should_sudo\n\n echo \"Removing launchctl service ${service}\"\n\n # A wildcard label can't be used with launchctl or as a plist name, so expand\n # it to the labels of currently loaded services that match the pattern.\n local services=(\"$service\")\n if [[ \"$service\" == *\"*\"* ]]; then\n local regex\n # Escape regex metacharacters, turn '*' into '.*', and anchor the pattern so\n # it matches a full label rather than a substring.\n regex=$(printf '%s' \"$service\" | sed -e 's/[][(){}.^$+?|\\\\]/\\\\&/g' -e 's/\\*/.*/g')\n regex=\"^${regex}$\"\n services=()\n local id\n # Match every loaded job by label regardless of PID; launchctl list reports\n # loaded-but-not-running jobs with a \"-\" in the PID column.\n while read -r _ _ id; do\n [[ \"$id\" =~ $regex ]] && services+=(\"$id\")\n done < <(launchctl list 2>/dev/null | tail -n +2)\n if [[ ${#services[@]} -eq 0 ]]; then\n echo \"No loaded launchctl service matches ${service}\"\n return\n fi\n fi\n\n local service_label\n for service_label in \"${services[@]}\"; do\n for should_sudo in \"${booleans[@]}\"; do\n plist_status=$(launchctl list \"${service_label}\" 2>/dev/null)\n\n if [[ $plist_status == \\{* ]]; then\n if [[ $should_sudo == \"true\" ]]; then\n sudo launchctl remove \"${service_label}\"\n else\n launchctl remove \"${service_label}\"\n fi\n sleep 1\n fi\n\n paths=(\n \"/Library/LaunchAgents/${service_label}.plist\"\n \"/Library/LaunchDaemons/${service_label}.plist\"\n )\n\n # if not using sudo, prepend the home directory to the paths\n if [[ $should_sudo == \"false\" ]]; then\n for i in \"${!paths[@]}\"; do\n paths[i]=\"${HOME}${paths[i]}\"\n done\n fi\n\n for path in \"${paths[@]}\"; do\n if [[ -e \"$path\" ]]; then\n if [[ $should_sudo == \"true\" ]]; then\n sudo rm -f -- \"$path\"\n else\n rm -f -- \"$path\"\n fi\n fi\n done\n done\n done\n}\n\nremove_pkg_files() {\n local PKGID=\"$1\"\n expand_pkgid_and_map \"$PKGID\" remove_receipt_files\n}\n\nremove_receipt_files() {\n local PKGID=\"$1\"\n local PKGINFO VOLUME INSTALL_LOCATION FULL_INSTALL_LOCATION\n\n echo \"pkgutil --pkg-info-plist \\\"$PKGID\\\"\"\n PKGINFO=$(pkgutil --pkg-info-plist \"$PKGID\")\n VOLUME=$(echo \"$PKGINFO\" | awk '/volume<\\/key>/ {getline; gsub(/.*|<\\/string>.*/, \"\"); print}')\n INSTALL_LOCATION=$(echo \"$PKGINFO\" | awk '/install-location<\\/key>/ {getline; gsub(/.*|<\\/string>.*/, \"\"); print}')\n\n if [ -z \"$INSTALL_LOCATION\" ] || [ \"$INSTALL_LOCATION\" = \"/\" ]; then\n FULL_INSTALL_LOCATION=\"$VOLUME\"\n else\n FULL_INSTALL_LOCATION=\"$VOLUME/$INSTALL_LOCATION\"\n FULL_INSTALL_LOCATION=$(echo \"$FULL_INSTALL_LOCATION\" | sed 's|//|/|g')\n fi\n\n echo \"sudo pkgutil --only-files --files \\\"$PKGID\\\" | sed \\\"s|^|${FULL_INSTALL_LOCATION}/|\\\" | tr '\\\\\\\\n' '\\\\\\\\0' | /usr/bin/sudo -u root -E -- /usr/bin/xargs -0 -- /bin/rm -rf\"\n sudo pkgutil --only-files --files \"$PKGID\" | sed \"s|^|/${INSTALL_LOCATION}/|\" | tr '\\n' '\\0' | /usr/bin/sudo -u root -E -- /usr/bin/xargs -0 -- /bin/rm -rf\n\n echo \"sudo pkgutil --only-dirs --files \\\"$PKGID\\\" | sed \\\"s|^|${FULL_INSTALL_LOCATION}/|\\\" | grep '\\\\.app$' | tr '\\\\\\\\n' '\\\\\\\\0' | /usr/bin/sudo -u root -E -- /usr/bin/xargs -0 -- /bin/rm -rf\"\n sudo pkgutil --only-dirs --files \"$PKGID\" | sed \"s|^|${FULL_INSTALL_LOCATION}/|\" | grep '\\.app$' | tr '\\n' '\\0' | /usr/bin/sudo -u root -E -- /usr/bin/xargs -0 -- /bin/rm -rf\n\n root_app_dir=$(\n sudo pkgutil --only-dirs --files \"$PKGID\" \\\n | sed \"s|^|${FULL_INSTALL_LOCATION}/|\" \\\n | grep 'Applications' \\\n | awk '{ print length, $0 }' \\\n | sort -n \\\n | head -n1 \\\n | cut -d' ' -f2-\n )\n if [ -n \"$root_app_dir\" ]; then\n echo \"sudo rmdir -p \\\"$root_app_dir\\\" 2>/dev/null || :\"\n sudo rmdir -p \"$root_app_dir\" 2>/dev/null || :\n fi\n}\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\n # If the target contains glob characters, expand it and move each match.\n if [[ \"$target_file\" == *[*?[]* ]]; then\n local file file_name\n local matched=false\n local i=0\n # compgen -G expands the (quoted) pattern itself, so paths containing\n # spaces glob correctly; reading line by line keeps each match intact.\n while IFS= read -r file; do\n [[ -n \"$file\" ]] || continue\n [[ -e \"$file\" || -L \"$file\" ]] || continue\n matched=true\n i=$((i + 1))\n file_name=\"$(basename \"$file\")\"\n echo \"removing $file.\"\n # The per-match counter keeps matches that share a basename from\n # overwriting each other in the trash.\n mv -f \"$file\" \"$trash/${file_name}_${timestamp}_${rand}_${i}\"\n done < <(compgen -G \"$target_file\" 2>/dev/null)\n if [[ \"$matched\" == false ]]; then\n echo \"$target_file doesn't exist.\"\n fi\n return\n fi\n\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\nremove_launchctl_service 'com.malwarebytes.mbam.frontend.agent'\nremove_launchctl_service 'com.malwarebytes.mbam.rtprotection.daemon'\nremove_launchctl_service 'com.malwarebytes.mbam.settings.daemon'\nquit_application 'com.malwarebytes.mbam.frontend.agent'\nremove_pkg_files 'com.malwarebytes.mbam.*'\nforget_pkg 'com.malwarebytes.mbam.*'\nsudo rm -rf '/Library/Application Support/Malwarebytes/MBAM'\nsudo rmdir '/Library/Application Support/Malwarebytes'\ntrash $LOGGED_IN_USER '~/Library/Application Support/com.malwarebytes.mbam'\ntrash $LOGGED_IN_USER '~/Library/Application Support/com.malwarebytes.mbam.frontend.*'\ntrash $LOGGED_IN_USER '~/Library/Caches/com.crashlytics.data/com.malwarebytes.mbam.frontend.*'\ntrash $LOGGED_IN_USER '~/Library/Caches/com.malwarebytes.mbam.frontend.*'\ntrash $LOGGED_IN_USER '~/Library/Caches/io.fabric.sdk.mac.data/com.malwarebytes.mbam.frontend.*'\ntrash $LOGGED_IN_USER '~/Library/Preferences/com.malwarebytes.mbam.frontend.*'\ntrash $LOGGED_IN_USER '~/Library/Saved Application State/com.malwarebytes.mbam.frontend.application.savedState'\n", - "8f85437f": "#!/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# install pkg files\nquit_and_track_application 'com.malwarebytes.mbam.frontend.application'\nsudo installer -pkg \"$TMPDIR/Malwarebytes-Mac-5.27.0.4189.pkg\" -target / || exit $?\nrelaunch_application 'com.malwarebytes.mbam.frontend.application'\n" + "5322bb35": "#!/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# install pkg files\nquit_and_track_application 'com.malwarebytes.mbam.frontend.application'\nsudo installer -pkg \"$TMPDIR/Malwarebytes-Mac-5.27.1.4191.pkg\" -target / || exit $?\nrelaunch_application 'com.malwarebytes.mbam.frontend.application'\n" } } diff --git a/ee/maintained-apps/outputs/melodics/darwin.json b/ee/maintained-apps/outputs/melodics/darwin.json index 82c8524018f..15c7a51e941 100644 --- a/ee/maintained-apps/outputs/melodics/darwin.json +++ b/ee/maintained-apps/outputs/melodics/darwin.json @@ -1,16 +1,16 @@ { "versions": [ { - "version": "5.0.1147", + "version": "5.0.1223", "queries": { "exists": "SELECT 1 FROM apps WHERE bundle_identifier = 'com.melodics.Melodics';", - "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'com.melodics.Melodics' AND version_compare(bundle_short_version, '5.0.1147') < 0);", + "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'com.melodics.Melodics' AND version_compare(bundle_short_version, '5.0.1223') < 0);", "open": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps a JOIN processes p ON p.path = concat(a.path, '/Contents/MacOS/', a.bundle_executable) WHERE a.bundle_identifier = 'com.melodics.Melodics' AND a.bundle_executable != '');" }, - "installer_url": "https://web-cdn.melodics.com/download/6FD7E6AB-D570-4981-90D4-AA4819C1F15F.zip", + "installer_url": "https://web-cdn.melodics.com/download/101AEF5E-CC7F-4F48-BFD2-85CC0F70080F.zip", "install_script_ref": "fa7d6756", "uninstall_script_ref": "4eb92aa5", - "sha256": "16bd47bf57a9f0661009b561e6d9c8a3d53168f910191daf4f099df09352dddc", + "sha256": "f6215e067c754fd6660639e23b921fc6acb34fe8943c07745d2337f208033051", "default_categories": [ "Productivity" ] diff --git a/ee/maintained-apps/outputs/microsoft-dotnet-desktop-runtime-10/windows.json b/ee/maintained-apps/outputs/microsoft-dotnet-desktop-runtime-10/windows.json index 2fb0c7d3c3b..524f8cba990 100644 --- a/ee/maintained-apps/outputs/microsoft-dotnet-desktop-runtime-10/windows.json +++ b/ee/maintained-apps/outputs/microsoft-dotnet-desktop-runtime-10/windows.json @@ -1,16 +1,16 @@ { "versions": [ { - "version": "10.0.11", + "version": "10.0.12", "queries": { "exists": "SELECT 1 FROM programs WHERE name LIKE 'Microsoft Windows Desktop Runtime 10.%' AND name LIKE '%(x64)' AND publisher = 'Microsoft Corporation';", - "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM programs WHERE name LIKE 'Microsoft Windows Desktop Runtime 10.%' AND name LIKE '%(x64)' AND publisher = 'Microsoft Corporation' AND version_compare(version, '10.0.11.50000') < 0);", + "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM programs WHERE name LIKE 'Microsoft Windows Desktop Runtime 10.%' AND name LIKE '%(x64)' AND publisher = 'Microsoft Corporation' AND version_compare(version, '10.0.12.50000') < 0);", "open": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM processes WHERE LOWER(name) = 'microsoft .net desktop runtime 10.exe');" }, - "installer_url": "https://download.microsoft.com/download/a2b8b791-a2da-4835-8b5a-3078153deb88/ff7dbd4b-29c5-4a7f-b1a0-b5efcf3f7771/windowsdesktop-runtime-10.0.11-win-x64.exe", + "installer_url": "https://download.microsoft.com/download/04376d86-d7a3-4e62-90d5-00c65aad3ed4/e9e20d44-09a7-4e6e-bc48-511cb8e740c3/windowsdesktop-runtime-10.0.12-win-x64.exe", "install_script_ref": "13facdef", - "uninstall_script_ref": "a95e65db", - "sha256": "61d2e1447b185d6f99c0d5799896240b48246f5440648bc031ebdb159a3bf3d1", + "uninstall_script_ref": "c656042d", + "sha256": "55a67d8476cde95a9cc43a95803b4f54446e7c9251ed22aa6421d4908174ae84", "default_categories": [ "Developer tools" ] @@ -18,6 +18,6 @@ ], "refs": { "13facdef": "# Learn more about .exe install scripts:\n# http://fleetdm.com/learn-more-about/exe-install-scripts\n#\n# The .NET Runtime ships as a WiX \"burn\" bootstrapper (.exe). It installs\n# machine-wide and registers its own ARP entry. Silent switches come from the\n# winget installer manifest (Silent: /quiet, Custom: /norestart).\n\n$exeFilePath = \"${env:INSTALLER_PATH}\"\n\ntry {\n if (-not (Test-Path $exeFilePath)) {\n Write-Host \"Error: Installer file not found at: $exeFilePath\"\n Exit 1\n }\n\n $processOptions = @{\n FilePath = \"$exeFilePath\"\n ArgumentList = \"/quiet /norestart\"\n PassThru = $true\n Wait = $true\n NoNewWindow = $true\n }\n\n $process = Start-Process @processOptions\n $exitCode = $process.ExitCode\n Write-Host \"Install exit code: $exitCode\"\n\n # 0 = success, 3010 = success but reboot required, 1641 = reboot initiated\n if ($exitCode -eq 3010 -or $exitCode -eq 1641) {\n Exit 0\n }\n\n Exit $exitCode\n\n} catch {\n Write-Host \"Error: $_\"\n Exit 1\n}\n", - "a95e65db": "# Uninstalls the Microsoft .NET Runtime WiX \"burn\" bundle.\n#\n# The runtime installs as a burn bootstrapper that registers a *bundle* ARP entry\n# (keyed by the bundle ProductCode) alongside several MSI component entries that\n# share the same DisplayName. Only the bundle entry removes the whole runtime, and\n# it uninstalls by running its cached bootstrapper .exe with /uninstall -- never via\n# msiexec (see https://silentinstallhq.com/net-runtime-8-0-silent-uninstall-powershell/).\n# We target the bundle by its ProductCode (injected by the ingester) and fall back\n# to the cached bootstrapper in the Package Cache.\n\n$productCode = '{96749152-C361-49E0-BAC6-818F491B9276}'\n\nfunction Invoke-Uninstaller {\n param([string]$exe, [string]$exeArgs)\n if ($exeArgs -notmatch '/uninstall') { $exeArgs = \"/uninstall $exeArgs\" }\n if ($exeArgs -notmatch '/quiet') { $exeArgs = \"$exeArgs /quiet\" }\n if ($exeArgs -notmatch '/norestart') { $exeArgs = \"$exeArgs /norestart\" }\n $exeArgs = $exeArgs.Trim()\n Write-Host \"Uninstall command: $exe\"\n Write-Host \"Uninstall args: $exeArgs\"\n $process = Start-Process -FilePath $exe -ArgumentList $exeArgs -NoNewWindow -PassThru -Wait\n return $process.ExitCode\n}\n\n$exitCode = $null\n\n# 1) Preferred: the bundle ARP entry, looked up by the bundle ProductCode. Its\n# UninstallString/QuietUninstallString points to the cached bootstrapper .exe.\n$keys = @(\n \"HKLM:\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\$productCode\",\n \"HKLM:\\SOFTWARE\\WOW6432Node\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\$productCode\"\n)\n\nforeach ($key in $keys) {\n if (-not (Test-Path $key)) { continue }\n $entry = Get-ItemProperty $key -ErrorAction SilentlyContinue\n if (-not $entry) { continue }\n\n $raw = $entry.QuietUninstallString\n if (-not $raw) { $raw = $entry.UninstallString }\n if (-not $raw) { continue }\n\n # Parse into executable + args, handling quoted/unquoted/bare shapes.\n if ($raw -match '^\\s*\"([^\"]+)\"\\s*(.*)$') {\n $exe = $matches[1]; $exeArgs = $matches[2].Trim()\n } elseif ($raw -match '(?i)^\\s*(.+?\\.exe)\\s*(.*)$') {\n $exe = $matches[1]; $exeArgs = $matches[2].Trim()\n } else {\n $exe = $raw; $exeArgs = \"\"\n }\n\n $exitCode = Invoke-Uninstaller -exe $exe -exeArgs $exeArgs\n break\n}\n\n# 2) Fallback: run the cached bootstrapper directly from the Package Cache, which\n# burn names after the bundle ProductCode.\nif ($null -eq $exitCode) {\n $cached = Get-ChildItem -Path \"C:\\ProgramData\\Package Cache\\$productCode\" -Filter *.exe -ErrorAction SilentlyContinue | Select-Object -First 1\n if ($cached) {\n $exitCode = Invoke-Uninstaller -exe $cached.FullName -exeArgs \"\"\n }\n}\n\nif ($null -eq $exitCode) {\n Write-Host \"Uninstall entry not found for product code: $productCode\"\n Exit 0\n}\n\nWrite-Host \"Uninstall exit code: $exitCode\"\n# 0 = success, 3010 = success but reboot required, 1641 = reboot initiated\nif ($exitCode -eq 3010 -or $exitCode -eq 1641) { Exit 0 }\nExit $exitCode\n" + "c656042d": "# Uninstalls the Microsoft .NET Runtime WiX \"burn\" bundle.\n#\n# The runtime installs as a burn bootstrapper that registers a *bundle* ARP entry\n# (keyed by the bundle ProductCode) alongside several MSI component entries that\n# share the same DisplayName. Only the bundle entry removes the whole runtime, and\n# it uninstalls by running its cached bootstrapper .exe with /uninstall -- never via\n# msiexec (see https://silentinstallhq.com/net-runtime-8-0-silent-uninstall-powershell/).\n# We target the bundle by its ProductCode (injected by the ingester) and fall back\n# to the cached bootstrapper in the Package Cache.\n\n$productCode = '{F81499EB-06B3-470A-A4DB-D4B58AE6AEC2}'\n\nfunction Invoke-Uninstaller {\n param([string]$exe, [string]$exeArgs)\n if ($exeArgs -notmatch '/uninstall') { $exeArgs = \"/uninstall $exeArgs\" }\n if ($exeArgs -notmatch '/quiet') { $exeArgs = \"$exeArgs /quiet\" }\n if ($exeArgs -notmatch '/norestart') { $exeArgs = \"$exeArgs /norestart\" }\n $exeArgs = $exeArgs.Trim()\n Write-Host \"Uninstall command: $exe\"\n Write-Host \"Uninstall args: $exeArgs\"\n $process = Start-Process -FilePath $exe -ArgumentList $exeArgs -NoNewWindow -PassThru -Wait\n return $process.ExitCode\n}\n\n$exitCode = $null\n\n# 1) Preferred: the bundle ARP entry, looked up by the bundle ProductCode. Its\n# UninstallString/QuietUninstallString points to the cached bootstrapper .exe.\n$keys = @(\n \"HKLM:\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\$productCode\",\n \"HKLM:\\SOFTWARE\\WOW6432Node\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\$productCode\"\n)\n\nforeach ($key in $keys) {\n if (-not (Test-Path $key)) { continue }\n $entry = Get-ItemProperty $key -ErrorAction SilentlyContinue\n if (-not $entry) { continue }\n\n $raw = $entry.QuietUninstallString\n if (-not $raw) { $raw = $entry.UninstallString }\n if (-not $raw) { continue }\n\n # Parse into executable + args, handling quoted/unquoted/bare shapes.\n if ($raw -match '^\\s*\"([^\"]+)\"\\s*(.*)$') {\n $exe = $matches[1]; $exeArgs = $matches[2].Trim()\n } elseif ($raw -match '(?i)^\\s*(.+?\\.exe)\\s*(.*)$') {\n $exe = $matches[1]; $exeArgs = $matches[2].Trim()\n } else {\n $exe = $raw; $exeArgs = \"\"\n }\n\n $exitCode = Invoke-Uninstaller -exe $exe -exeArgs $exeArgs\n break\n}\n\n# 2) Fallback: run the cached bootstrapper directly from the Package Cache, which\n# burn names after the bundle ProductCode.\nif ($null -eq $exitCode) {\n $cached = Get-ChildItem -Path \"C:\\ProgramData\\Package Cache\\$productCode\" -Filter *.exe -ErrorAction SilentlyContinue | Select-Object -First 1\n if ($cached) {\n $exitCode = Invoke-Uninstaller -exe $cached.FullName -exeArgs \"\"\n }\n}\n\nif ($null -eq $exitCode) {\n Write-Host \"Uninstall entry not found for product code: $productCode\"\n Exit 0\n}\n\nWrite-Host \"Uninstall exit code: $exitCode\"\n# 0 = success, 3010 = success but reboot required, 1641 = reboot initiated\nif ($exitCode -eq 3010 -or $exitCode -eq 1641) { Exit 0 }\nExit $exitCode\n" } } diff --git a/ee/maintained-apps/outputs/microsoft-dotnet-runtime-10/windows.json b/ee/maintained-apps/outputs/microsoft-dotnet-runtime-10/windows.json index e014039680e..03d3156d595 100644 --- a/ee/maintained-apps/outputs/microsoft-dotnet-runtime-10/windows.json +++ b/ee/maintained-apps/outputs/microsoft-dotnet-runtime-10/windows.json @@ -1,16 +1,16 @@ { "versions": [ { - "version": "10.0.11", + "version": "10.0.12", "queries": { "exists": "SELECT 1 FROM programs WHERE name LIKE 'Microsoft .NET Runtime - 10.%' AND name LIKE '%(x64)' AND publisher = 'Microsoft Corporation';", - "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM programs WHERE name LIKE 'Microsoft .NET Runtime - 10.%' AND name LIKE '%(x64)' AND publisher = 'Microsoft Corporation' AND version_compare(version, '10.0.11') < 0);", + "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM programs WHERE name LIKE 'Microsoft .NET Runtime - 10.%' AND name LIKE '%(x64)' AND publisher = 'Microsoft Corporation' AND version_compare(version, '10.0.12') < 0);", "open": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM processes WHERE LOWER(name) = 'microsoft .net runtime 10.exe');" }, - "installer_url": "https://download.microsoft.com/download/a3a22b00-1114-4f66-8cd2-2aeeb1811fed/1700dc3a-07aa-4014-81c7-6d3a761c18d7/dotnet-runtime-10.0.11-win-x64.exe", + "installer_url": "https://download.microsoft.com/download/a02a3f93-6438-4a82-b90a-b72dc6a01d3e/160dd0ba-2de6-430c-82e9-d6b7c644abe2/dotnet-runtime-10.0.12-win-x64.exe", "install_script_ref": "13facdef", - "uninstall_script_ref": "f4222761", - "sha256": "33de99eeda0f06f4b4ad43a1fd23977343e1358f5dbb4b0d5e1b84850dc18afc", + "uninstall_script_ref": "1e2add90", + "sha256": "02ea072c08f890f9dc0d3ac71b5fd4c2bfcdced4e1133e2d917ce5422b025585", "default_categories": [ "Developer tools" ] @@ -18,6 +18,6 @@ ], "refs": { "13facdef": "# Learn more about .exe install scripts:\n# http://fleetdm.com/learn-more-about/exe-install-scripts\n#\n# The .NET Runtime ships as a WiX \"burn\" bootstrapper (.exe). It installs\n# machine-wide and registers its own ARP entry. Silent switches come from the\n# winget installer manifest (Silent: /quiet, Custom: /norestart).\n\n$exeFilePath = \"${env:INSTALLER_PATH}\"\n\ntry {\n if (-not (Test-Path $exeFilePath)) {\n Write-Host \"Error: Installer file not found at: $exeFilePath\"\n Exit 1\n }\n\n $processOptions = @{\n FilePath = \"$exeFilePath\"\n ArgumentList = \"/quiet /norestart\"\n PassThru = $true\n Wait = $true\n NoNewWindow = $true\n }\n\n $process = Start-Process @processOptions\n $exitCode = $process.ExitCode\n Write-Host \"Install exit code: $exitCode\"\n\n # 0 = success, 3010 = success but reboot required, 1641 = reboot initiated\n if ($exitCode -eq 3010 -or $exitCode -eq 1641) {\n Exit 0\n }\n\n Exit $exitCode\n\n} catch {\n Write-Host \"Error: $_\"\n Exit 1\n}\n", - "f4222761": "# Uninstalls the Microsoft .NET Runtime WiX \"burn\" bundle.\n#\n# The runtime installs as a burn bootstrapper that registers a *bundle* ARP entry\n# (keyed by the bundle ProductCode) alongside several MSI component entries that\n# share the same DisplayName. Only the bundle entry removes the whole runtime, and\n# it uninstalls by running its cached bootstrapper .exe with /uninstall -- never via\n# msiexec (see https://silentinstallhq.com/net-runtime-8-0-silent-uninstall-powershell/).\n# We target the bundle by its ProductCode (injected by the ingester) and fall back\n# to the cached bootstrapper in the Package Cache.\n\n$productCode = '{9515CC72-C8E1-498C-9423-E0DA05D6B55B}'\n\nfunction Invoke-Uninstaller {\n param([string]$exe, [string]$exeArgs)\n if ($exeArgs -notmatch '/uninstall') { $exeArgs = \"/uninstall $exeArgs\" }\n if ($exeArgs -notmatch '/quiet') { $exeArgs = \"$exeArgs /quiet\" }\n if ($exeArgs -notmatch '/norestart') { $exeArgs = \"$exeArgs /norestart\" }\n $exeArgs = $exeArgs.Trim()\n Write-Host \"Uninstall command: $exe\"\n Write-Host \"Uninstall args: $exeArgs\"\n $process = Start-Process -FilePath $exe -ArgumentList $exeArgs -NoNewWindow -PassThru -Wait\n return $process.ExitCode\n}\n\n$exitCode = $null\n\n# 1) Preferred: the bundle ARP entry, looked up by the bundle ProductCode. Its\n# UninstallString/QuietUninstallString points to the cached bootstrapper .exe.\n$keys = @(\n \"HKLM:\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\$productCode\",\n \"HKLM:\\SOFTWARE\\WOW6432Node\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\$productCode\"\n)\n\nforeach ($key in $keys) {\n if (-not (Test-Path $key)) { continue }\n $entry = Get-ItemProperty $key -ErrorAction SilentlyContinue\n if (-not $entry) { continue }\n\n $raw = $entry.QuietUninstallString\n if (-not $raw) { $raw = $entry.UninstallString }\n if (-not $raw) { continue }\n\n # Parse into executable + args, handling quoted/unquoted/bare shapes.\n if ($raw -match '^\\s*\"([^\"]+)\"\\s*(.*)$') {\n $exe = $matches[1]; $exeArgs = $matches[2].Trim()\n } elseif ($raw -match '(?i)^\\s*(.+?\\.exe)\\s*(.*)$') {\n $exe = $matches[1]; $exeArgs = $matches[2].Trim()\n } else {\n $exe = $raw; $exeArgs = \"\"\n }\n\n $exitCode = Invoke-Uninstaller -exe $exe -exeArgs $exeArgs\n break\n}\n\n# 2) Fallback: run the cached bootstrapper directly from the Package Cache, which\n# burn names after the bundle ProductCode.\nif ($null -eq $exitCode) {\n $cached = Get-ChildItem -Path \"C:\\ProgramData\\Package Cache\\$productCode\" -Filter *.exe -ErrorAction SilentlyContinue | Select-Object -First 1\n if ($cached) {\n $exitCode = Invoke-Uninstaller -exe $cached.FullName -exeArgs \"\"\n }\n}\n\nif ($null -eq $exitCode) {\n Write-Host \"Uninstall entry not found for product code: $productCode\"\n Exit 0\n}\n\nWrite-Host \"Uninstall exit code: $exitCode\"\n# 0 = success, 3010 = success but reboot required, 1641 = reboot initiated\nif ($exitCode -eq 3010 -or $exitCode -eq 1641) { Exit 0 }\nExit $exitCode\n" + "1e2add90": "# Uninstalls the Microsoft .NET Runtime WiX \"burn\" bundle.\n#\n# The runtime installs as a burn bootstrapper that registers a *bundle* ARP entry\n# (keyed by the bundle ProductCode) alongside several MSI component entries that\n# share the same DisplayName. Only the bundle entry removes the whole runtime, and\n# it uninstalls by running its cached bootstrapper .exe with /uninstall -- never via\n# msiexec (see https://silentinstallhq.com/net-runtime-8-0-silent-uninstall-powershell/).\n# We target the bundle by its ProductCode (injected by the ingester) and fall back\n# to the cached bootstrapper in the Package Cache.\n\n$productCode = '{4CBA08D2-07D1-4B4F-B8E1-8C5424CCA5A0}'\n\nfunction Invoke-Uninstaller {\n param([string]$exe, [string]$exeArgs)\n if ($exeArgs -notmatch '/uninstall') { $exeArgs = \"/uninstall $exeArgs\" }\n if ($exeArgs -notmatch '/quiet') { $exeArgs = \"$exeArgs /quiet\" }\n if ($exeArgs -notmatch '/norestart') { $exeArgs = \"$exeArgs /norestart\" }\n $exeArgs = $exeArgs.Trim()\n Write-Host \"Uninstall command: $exe\"\n Write-Host \"Uninstall args: $exeArgs\"\n $process = Start-Process -FilePath $exe -ArgumentList $exeArgs -NoNewWindow -PassThru -Wait\n return $process.ExitCode\n}\n\n$exitCode = $null\n\n# 1) Preferred: the bundle ARP entry, looked up by the bundle ProductCode. Its\n# UninstallString/QuietUninstallString points to the cached bootstrapper .exe.\n$keys = @(\n \"HKLM:\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\$productCode\",\n \"HKLM:\\SOFTWARE\\WOW6432Node\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\$productCode\"\n)\n\nforeach ($key in $keys) {\n if (-not (Test-Path $key)) { continue }\n $entry = Get-ItemProperty $key -ErrorAction SilentlyContinue\n if (-not $entry) { continue }\n\n $raw = $entry.QuietUninstallString\n if (-not $raw) { $raw = $entry.UninstallString }\n if (-not $raw) { continue }\n\n # Parse into executable + args, handling quoted/unquoted/bare shapes.\n if ($raw -match '^\\s*\"([^\"]+)\"\\s*(.*)$') {\n $exe = $matches[1]; $exeArgs = $matches[2].Trim()\n } elseif ($raw -match '(?i)^\\s*(.+?\\.exe)\\s*(.*)$') {\n $exe = $matches[1]; $exeArgs = $matches[2].Trim()\n } else {\n $exe = $raw; $exeArgs = \"\"\n }\n\n $exitCode = Invoke-Uninstaller -exe $exe -exeArgs $exeArgs\n break\n}\n\n# 2) Fallback: run the cached bootstrapper directly from the Package Cache, which\n# burn names after the bundle ProductCode.\nif ($null -eq $exitCode) {\n $cached = Get-ChildItem -Path \"C:\\ProgramData\\Package Cache\\$productCode\" -Filter *.exe -ErrorAction SilentlyContinue | Select-Object -First 1\n if ($cached) {\n $exitCode = Invoke-Uninstaller -exe $cached.FullName -exeArgs \"\"\n }\n}\n\nif ($null -eq $exitCode) {\n Write-Host \"Uninstall entry not found for product code: $productCode\"\n Exit 0\n}\n\nWrite-Host \"Uninstall exit code: $exitCode\"\n# 0 = success, 3010 = success but reboot required, 1641 = reboot initiated\nif ($exitCode -eq 3010 -or $exitCode -eq 1641) { Exit 0 }\nExit $exitCode\n" } } diff --git a/ee/maintained-apps/outputs/microsoft-dotnet-runtime-8/windows.json b/ee/maintained-apps/outputs/microsoft-dotnet-runtime-8/windows.json index b4f498885c1..3dca4144536 100644 --- a/ee/maintained-apps/outputs/microsoft-dotnet-runtime-8/windows.json +++ b/ee/maintained-apps/outputs/microsoft-dotnet-runtime-8/windows.json @@ -1,16 +1,16 @@ { "versions": [ { - "version": "8.0.30", + "version": "8.0.31", "queries": { "exists": "SELECT 1 FROM programs WHERE name LIKE 'Microsoft .NET Runtime - 8.%' AND name LIKE '%(x64)' AND publisher = 'Microsoft Corporation';", - "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM programs WHERE name LIKE 'Microsoft .NET Runtime - 8.%' AND name LIKE '%(x64)' AND publisher = 'Microsoft Corporation' AND version_compare(version, '8.0.30') < 0);", + "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM programs WHERE name LIKE 'Microsoft .NET Runtime - 8.%' AND name LIKE '%(x64)' AND publisher = 'Microsoft Corporation' AND version_compare(version, '8.0.31') < 0);", "open": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM processes WHERE LOWER(name) = 'microsoft .net runtime 8.exe');" }, - "installer_url": "https://download.microsoft.com/download/ebed4560-f75b-4023-b6b1-a79f55c5e523/1d88fc65-51e9-484b-935a-6aa987888b08/dotnet-runtime-8.0.30-win-x64.exe", + "installer_url": "https://download.microsoft.com/download/0487b495-7b7e-41cc-a798-c70779af69f7/78fdbd4d-f97c-4573-968b-891787a3c5d6/dotnet-runtime-8.0.31-win-x64.exe", "install_script_ref": "13facdef", - "uninstall_script_ref": "da06c0ef", - "sha256": "e40f199c6d5584aff0554c01163c3c8d9ccf6bec3a577e4d967e41070772a1c1", + "uninstall_script_ref": "ab45f7f5", + "sha256": "249b0d10d4bfa8ec8ded5e6e220e871e71cca89290f1a2fdb93ca59abb8ff97b", "default_categories": [ "Developer tools" ] @@ -18,6 +18,6 @@ ], "refs": { "13facdef": "# Learn more about .exe install scripts:\n# http://fleetdm.com/learn-more-about/exe-install-scripts\n#\n# The .NET Runtime ships as a WiX \"burn\" bootstrapper (.exe). It installs\n# machine-wide and registers its own ARP entry. Silent switches come from the\n# winget installer manifest (Silent: /quiet, Custom: /norestart).\n\n$exeFilePath = \"${env:INSTALLER_PATH}\"\n\ntry {\n if (-not (Test-Path $exeFilePath)) {\n Write-Host \"Error: Installer file not found at: $exeFilePath\"\n Exit 1\n }\n\n $processOptions = @{\n FilePath = \"$exeFilePath\"\n ArgumentList = \"/quiet /norestart\"\n PassThru = $true\n Wait = $true\n NoNewWindow = $true\n }\n\n $process = Start-Process @processOptions\n $exitCode = $process.ExitCode\n Write-Host \"Install exit code: $exitCode\"\n\n # 0 = success, 3010 = success but reboot required, 1641 = reboot initiated\n if ($exitCode -eq 3010 -or $exitCode -eq 1641) {\n Exit 0\n }\n\n Exit $exitCode\n\n} catch {\n Write-Host \"Error: $_\"\n Exit 1\n}\n", - "da06c0ef": "# Uninstalls the Microsoft .NET Runtime WiX \"burn\" bundle.\n#\n# The runtime installs as a burn bootstrapper that registers a *bundle* ARP entry\n# (keyed by the bundle ProductCode) alongside several MSI component entries that\n# share the same DisplayName. Only the bundle entry removes the whole runtime, and\n# it uninstalls by running its cached bootstrapper .exe with /uninstall -- never via\n# msiexec (see https://silentinstallhq.com/net-runtime-8-0-silent-uninstall-powershell/).\n# We target the bundle by its ProductCode (injected by the ingester) and fall back\n# to the cached bootstrapper in the Package Cache.\n\n$productCode = '{bba240a5-2d02-4aed-99b0-f1b79cb1c4c1}'\n\nfunction Invoke-Uninstaller {\n param([string]$exe, [string]$exeArgs)\n if ($exeArgs -notmatch '/uninstall') { $exeArgs = \"/uninstall $exeArgs\" }\n if ($exeArgs -notmatch '/quiet') { $exeArgs = \"$exeArgs /quiet\" }\n if ($exeArgs -notmatch '/norestart') { $exeArgs = \"$exeArgs /norestart\" }\n $exeArgs = $exeArgs.Trim()\n Write-Host \"Uninstall command: $exe\"\n Write-Host \"Uninstall args: $exeArgs\"\n $process = Start-Process -FilePath $exe -ArgumentList $exeArgs -NoNewWindow -PassThru -Wait\n return $process.ExitCode\n}\n\n$exitCode = $null\n\n# 1) Preferred: the bundle ARP entry, looked up by the bundle ProductCode. Its\n# UninstallString/QuietUninstallString points to the cached bootstrapper .exe.\n$keys = @(\n \"HKLM:\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\$productCode\",\n \"HKLM:\\SOFTWARE\\WOW6432Node\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\$productCode\"\n)\n\nforeach ($key in $keys) {\n if (-not (Test-Path $key)) { continue }\n $entry = Get-ItemProperty $key -ErrorAction SilentlyContinue\n if (-not $entry) { continue }\n\n $raw = $entry.QuietUninstallString\n if (-not $raw) { $raw = $entry.UninstallString }\n if (-not $raw) { continue }\n\n # Parse into executable + args, handling quoted/unquoted/bare shapes.\n if ($raw -match '^\\s*\"([^\"]+)\"\\s*(.*)$') {\n $exe = $matches[1]; $exeArgs = $matches[2].Trim()\n } elseif ($raw -match '(?i)^\\s*(.+?\\.exe)\\s*(.*)$') {\n $exe = $matches[1]; $exeArgs = $matches[2].Trim()\n } else {\n $exe = $raw; $exeArgs = \"\"\n }\n\n $exitCode = Invoke-Uninstaller -exe $exe -exeArgs $exeArgs\n break\n}\n\n# 2) Fallback: run the cached bootstrapper directly from the Package Cache, which\n# burn names after the bundle ProductCode.\nif ($null -eq $exitCode) {\n $cached = Get-ChildItem -Path \"C:\\ProgramData\\Package Cache\\$productCode\" -Filter *.exe -ErrorAction SilentlyContinue | Select-Object -First 1\n if ($cached) {\n $exitCode = Invoke-Uninstaller -exe $cached.FullName -exeArgs \"\"\n }\n}\n\nif ($null -eq $exitCode) {\n Write-Host \"Uninstall entry not found for product code: $productCode\"\n Exit 0\n}\n\nWrite-Host \"Uninstall exit code: $exitCode\"\n# 0 = success, 3010 = success but reboot required, 1641 = reboot initiated\nif ($exitCode -eq 3010 -or $exitCode -eq 1641) { Exit 0 }\nExit $exitCode\n" + "ab45f7f5": "# Uninstalls the Microsoft .NET Runtime WiX \"burn\" bundle.\n#\n# The runtime installs as a burn bootstrapper that registers a *bundle* ARP entry\n# (keyed by the bundle ProductCode) alongside several MSI component entries that\n# share the same DisplayName. Only the bundle entry removes the whole runtime, and\n# it uninstalls by running its cached bootstrapper .exe with /uninstall -- never via\n# msiexec (see https://silentinstallhq.com/net-runtime-8-0-silent-uninstall-powershell/).\n# We target the bundle by its ProductCode (injected by the ingester) and fall back\n# to the cached bootstrapper in the Package Cache.\n\n$productCode = '{2e423868-b66e-4e76-8813-89cc32786cfa}'\n\nfunction Invoke-Uninstaller {\n param([string]$exe, [string]$exeArgs)\n if ($exeArgs -notmatch '/uninstall') { $exeArgs = \"/uninstall $exeArgs\" }\n if ($exeArgs -notmatch '/quiet') { $exeArgs = \"$exeArgs /quiet\" }\n if ($exeArgs -notmatch '/norestart') { $exeArgs = \"$exeArgs /norestart\" }\n $exeArgs = $exeArgs.Trim()\n Write-Host \"Uninstall command: $exe\"\n Write-Host \"Uninstall args: $exeArgs\"\n $process = Start-Process -FilePath $exe -ArgumentList $exeArgs -NoNewWindow -PassThru -Wait\n return $process.ExitCode\n}\n\n$exitCode = $null\n\n# 1) Preferred: the bundle ARP entry, looked up by the bundle ProductCode. Its\n# UninstallString/QuietUninstallString points to the cached bootstrapper .exe.\n$keys = @(\n \"HKLM:\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\$productCode\",\n \"HKLM:\\SOFTWARE\\WOW6432Node\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\$productCode\"\n)\n\nforeach ($key in $keys) {\n if (-not (Test-Path $key)) { continue }\n $entry = Get-ItemProperty $key -ErrorAction SilentlyContinue\n if (-not $entry) { continue }\n\n $raw = $entry.QuietUninstallString\n if (-not $raw) { $raw = $entry.UninstallString }\n if (-not $raw) { continue }\n\n # Parse into executable + args, handling quoted/unquoted/bare shapes.\n if ($raw -match '^\\s*\"([^\"]+)\"\\s*(.*)$') {\n $exe = $matches[1]; $exeArgs = $matches[2].Trim()\n } elseif ($raw -match '(?i)^\\s*(.+?\\.exe)\\s*(.*)$') {\n $exe = $matches[1]; $exeArgs = $matches[2].Trim()\n } else {\n $exe = $raw; $exeArgs = \"\"\n }\n\n $exitCode = Invoke-Uninstaller -exe $exe -exeArgs $exeArgs\n break\n}\n\n# 2) Fallback: run the cached bootstrapper directly from the Package Cache, which\n# burn names after the bundle ProductCode.\nif ($null -eq $exitCode) {\n $cached = Get-ChildItem -Path \"C:\\ProgramData\\Package Cache\\$productCode\" -Filter *.exe -ErrorAction SilentlyContinue | Select-Object -First 1\n if ($cached) {\n $exitCode = Invoke-Uninstaller -exe $cached.FullName -exeArgs \"\"\n }\n}\n\nif ($null -eq $exitCode) {\n Write-Host \"Uninstall entry not found for product code: $productCode\"\n Exit 0\n}\n\nWrite-Host \"Uninstall exit code: $exitCode\"\n# 0 = success, 3010 = success but reboot required, 1641 = reboot initiated\nif ($exitCode -eq 3010 -or $exitCode -eq 1641) { Exit 0 }\nExit $exitCode\n" } } diff --git a/ee/maintained-apps/outputs/milanote/darwin.json b/ee/maintained-apps/outputs/milanote/darwin.json index e9200af9f48..df11c2afe3b 100644 --- a/ee/maintained-apps/outputs/milanote/darwin.json +++ b/ee/maintained-apps/outputs/milanote/darwin.json @@ -1,16 +1,16 @@ { "versions": [ { - "version": "3.18.125", + "version": "3.18.126", "queries": { "exists": "SELECT 1 FROM apps WHERE bundle_identifier = 'com.milanote.app';", - "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'com.milanote.app' AND version_compare(bundle_short_version, '3.18.125') < 0);", + "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'com.milanote.app' AND version_compare(bundle_short_version, '3.18.126') < 0);", "open": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps a JOIN processes p ON p.path = concat(a.path, '/Contents/MacOS/', a.bundle_executable) WHERE a.bundle_identifier = 'com.milanote.app' AND a.bundle_executable != '');" }, - "installer_url": "https://milanote-app-releases.s3.amazonaws.com/Milanote-3.18.125.dmg", + "installer_url": "https://milanote-app-releases.s3.amazonaws.com/Milanote-3.18.126.dmg", "install_script_ref": "7bb39759", "uninstall_script_ref": "19269206", - "sha256": "94827ea948c9d4a421d2f454babec3658040b56bb6c06a7fcda5d70973651e58", + "sha256": "987dc23c250feaf979998c4e9635e92db2e88dbcbcc878a3a01b436884065630", "default_categories": [ "Developer tools" ] diff --git a/ee/maintained-apps/outputs/modern-csv/darwin.json b/ee/maintained-apps/outputs/modern-csv/darwin.json index 2d0da9381ca..b5c9cecdc2b 100644 --- a/ee/maintained-apps/outputs/modern-csv/darwin.json +++ b/ee/maintained-apps/outputs/modern-csv/darwin.json @@ -1,23 +1,23 @@ { "versions": [ { - "version": "2.4.3.1", + "version": "2.4.4", "queries": { "exists": "SELECT 1 FROM apps WHERE bundle_identifier = 'net.galliumdigital.Modern-CSV';", - "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'net.galliumdigital.Modern-CSV' AND version_compare(bundle_short_version, '2.4.3.1') < 0);", + "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'net.galliumdigital.Modern-CSV' AND version_compare(bundle_short_version, '2.4.4') < 0);", "open": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps a JOIN processes p ON p.path = concat(a.path, '/Contents/MacOS/', a.bundle_executable) WHERE a.bundle_identifier = 'net.galliumdigital.Modern-CSV' AND a.bundle_executable != '');" }, - "installer_url": "https://www.moderncsv.com/release/ModernCSV-Mac-v2.4.3.1.dmg", + "installer_url": "https://www.moderncsv.com/release/ModernCSV-Mac-v2.4.4.dmg", "install_script_ref": "8b7198d0", - "uninstall_script_ref": "3f855c52", - "sha256": "68ed7da50dafb4b8dd35ddf63624cdafd6fef6bd68ba3cd963a95d9482bffa95", + "uninstall_script_ref": "464a18d4", + "sha256": "d8a266c48d799a16be15a121cf62f7190b46d7aefde967b81725492d9f252093", "default_categories": [ "Productivity" ] } ], "refs": { - "3f855c52": "#!/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\n # If the target contains glob characters, expand it and move each match.\n if [[ \"$target_file\" == *[*?[]* ]]; then\n local file file_name\n local matched=false\n local i=0\n # compgen -G expands the (quoted) pattern itself, so paths containing\n # spaces glob correctly; reading line by line keeps each match intact.\n while IFS= read -r file; do\n [[ -n \"$file\" ]] || continue\n [[ -e \"$file\" || -L \"$file\" ]] || continue\n matched=true\n i=$((i + 1))\n file_name=\"$(basename \"$file\")\"\n echo \"removing $file.\"\n # The per-match counter keeps matches that share a basename from\n # overwriting each other in the trash.\n mv -f \"$file\" \"$trash/${file_name}_${timestamp}_${rand}_${i}\"\n done < <(compgen -G \"$target_file\" 2>/dev/null)\n if [[ \"$matched\" == false ]]; then\n echo \"$target_file doesn't exist.\"\n fi\n return\n fi\n\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/Modern CSV.app\"\ntrash $LOGGED_IN_USER '~/Library/Application Support/Modern CSV'\ntrash $LOGGED_IN_USER '~/Library/Saved Application State/net.galliumdigital.Modern-CSV.savedState'\n", + "464a18d4": "#!/bin/bash\n\n# variables\nAPPDIR=\"/Applications/\"\nLOGGED_IN_USER=$(scutil <<< \"show State:/Users/ConsoleUser\" | awk '/Name :/ { print $3 }')\n# functions\n\nquit_application() {\n local bundle_id=\"$1\"\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 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 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\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\n # If the target contains glob characters, expand it and move each match.\n if [[ \"$target_file\" == *[*?[]* ]]; then\n local file file_name\n local matched=false\n local i=0\n # compgen -G expands the (quoted) pattern itself, so paths containing\n # spaces glob correctly; reading line by line keeps each match intact.\n while IFS= read -r file; do\n [[ -n \"$file\" ]] || continue\n [[ -e \"$file\" || -L \"$file\" ]] || continue\n matched=true\n i=$((i + 1))\n file_name=\"$(basename \"$file\")\"\n echo \"removing $file.\"\n # The per-match counter keeps matches that share a basename from\n # overwriting each other in the trash.\n mv -f \"$file\" \"$trash/${file_name}_${timestamp}_${rand}_${i}\"\n done < <(compgen -G \"$target_file\" 2>/dev/null)\n if [[ \"$matched\" == false ]]; then\n echo \"$target_file doesn't exist.\"\n fi\n return\n fi\n\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\nquit_application 'net.galliumdigital.Modern-CSV'\nsudo rm -rf \"$APPDIR/Modern CSV.app\"\ntrash $LOGGED_IN_USER '~/Library/Application Support/Modern CSV'\ntrash $LOGGED_IN_USER '~/Library/Saved Application State/net.galliumdigital.Modern-CSV.savedState'\n", "8b7198d0": "#!/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)\nyes | hdiutil attach -plist -nobrowse -readonly -mountpoint \"$MOUNT_POINT\" \"$INSTALLER_PATH\" || exit 1\nsudo cp -R \"$MOUNT_POINT\"/* \"$TMPDIR\"\nhdiutil detach \"$MOUNT_POINT\" || true\n# copy to the applications folder\nquit_and_track_application 'net.galliumdigital.Modern-CSV'\nif [ -d \"$APPDIR/Modern CSV.app\" ]; then\n\tsudo mv \"$APPDIR/Modern CSV.app\" \"$TMPDIR/Modern CSV.app.bkp\" || exit $?\nfi\nif ! sudo cp -R \"$TMPDIR/Modern CSV.app\" \"$APPDIR\"; then\n\t# remove the partial copy so a failed install isn't inventoried as the new\n\t# version, then restore the previous version if there was one\n\tsudo rm -rf \"$APPDIR/Modern CSV.app\"\n\tif [ -d \"$TMPDIR/Modern CSV.app.bkp\" ]; then\n\t\tsudo mv \"$TMPDIR/Modern CSV.app.bkp\" \"$APPDIR/Modern CSV.app\"\n\tfi\n\texit 1\nfi\nrelaunch_application 'net.galliumdigital.Modern-CSV'\n" } } diff --git a/ee/maintained-apps/outputs/notion/darwin.json b/ee/maintained-apps/outputs/notion/darwin.json index b4a69e13f2f..0990dab5c2b 100644 --- a/ee/maintained-apps/outputs/notion/darwin.json +++ b/ee/maintained-apps/outputs/notion/darwin.json @@ -1,16 +1,16 @@ { "versions": [ { - "version": "7.32.1", + "version": "7.33.0", "queries": { "exists": "SELECT 1 FROM apps WHERE bundle_identifier = 'notion.id';", - "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'notion.id' AND version_compare(bundle_short_version, '7.32.1') < 0);", + "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'notion.id' AND version_compare(bundle_short_version, '7.33.0') < 0);", "open": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps a JOIN processes p ON p.path = concat(a.path, '/Contents/MacOS/', a.bundle_executable) WHERE a.bundle_identifier = 'notion.id' AND a.bundle_executable != '');" }, - "installer_url": "https://desktop-release.notion-static.com/Notion-7.32.1-arm64.dmg", + "installer_url": "https://desktop-release.notion-static.com/Notion-7.33.0-arm64.dmg", "install_script_ref": "48cf3d91", "uninstall_script_ref": "ac52c373", - "sha256": "2ea97cd7d4afff341c90420082372d9eeab6a21716f373380677094329d24460", + "sha256": "1c1d9834d565b382aa40568a99a608afc0222528ee7b166c02ce8cfd15aa906f", "default_categories": [ "Productivity" ] diff --git a/ee/maintained-apps/outputs/notion/windows.json b/ee/maintained-apps/outputs/notion/windows.json index f64c03fca9f..cb07fe12f19 100644 --- a/ee/maintained-apps/outputs/notion/windows.json +++ b/ee/maintained-apps/outputs/notion/windows.json @@ -1,16 +1,16 @@ { "versions": [ { - "version": "7.32.1", + "version": "7.33.0", "queries": { "exists": "SELECT 1 FROM programs WHERE name LIKE 'Notion %' AND publisher = 'Notion Labs, Inc';", - "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM programs WHERE name LIKE 'Notion %' AND publisher = 'Notion Labs, Inc' AND version_compare(version, '7.32.1') < 0);", + "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM programs WHERE name LIKE 'Notion %' AND publisher = 'Notion Labs, Inc' AND version_compare(version, '7.33.0') < 0);", "open": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM processes WHERE LOWER(name) = 'notion.exe');" }, - "installer_url": "https://desktop-release.notion-static.com/Notion%20Setup%207.32.1.exe", + "installer_url": "https://desktop-release.notion-static.com/Notion%20Setup%207.33.0.exe", "install_script_ref": "0803ad8c", "uninstall_script_ref": "a8fdd9b7", - "sha256": "36650c60918aabd4c0b856b91c924ecff4b541518d8c1bd1506db677a8e42d8a", + "sha256": "caa9cccb26e264244cde0c6492d0dee4f4b9d09ce3ca495152a0cc2e9f3fb4ae", "default_categories": [ "Productivity" ] diff --git a/ee/maintained-apps/outputs/ocenaudio/windows.json b/ee/maintained-apps/outputs/ocenaudio/windows.json index 2f4731e3be7..397121fa926 100644 --- a/ee/maintained-apps/outputs/ocenaudio/windows.json +++ b/ee/maintained-apps/outputs/ocenaudio/windows.json @@ -1,16 +1,16 @@ { "versions": [ { - "version": "3.21.0", + "version": "3.21.2", "queries": { "exists": "SELECT 1 FROM programs WHERE name = 'ocenaudio' AND publisher = 'Ocenaudio Team';", - "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM programs WHERE name = 'ocenaudio' AND publisher = 'Ocenaudio Team' AND version_compare(version, '3.21.0') < 0);", + "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM programs WHERE name = 'ocenaudio' AND publisher = 'Ocenaudio Team' AND version_compare(version, '3.21.2') < 0);", "open": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM processes WHERE LOWER(name) = 'ocenaudio.exe');" }, "installer_url": "https://www.ocenaudio.com/downloads/index.php/ocenaudio_windows64.exe", "install_script_ref": "ebf8794b", "uninstall_script_ref": "7264fb50", - "sha256": "bd4f859297f53b4736fcb560a7746330269c1e07ccead0377d3e49546a470f31", + "sha256": "dae677fa11be9a8ca3c1e0ef553980cba2a8be794bf198d5026a98c5a15c704b", "default_categories": [ "Productivity" ] diff --git a/ee/maintained-apps/outputs/opencode-desktop/darwin.json b/ee/maintained-apps/outputs/opencode-desktop/darwin.json index 48a799dc784..8128fe5de9e 100644 --- a/ee/maintained-apps/outputs/opencode-desktop/darwin.json +++ b/ee/maintained-apps/outputs/opencode-desktop/darwin.json @@ -1,16 +1,16 @@ { "versions": [ { - "version": "1.18.29", + "version": "1.18.30", "queries": { "exists": "SELECT 1 FROM apps WHERE bundle_identifier = 'ai.opencode.desktop';", - "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'ai.opencode.desktop' AND version_compare(bundle_short_version, '1.18.29') < 0);", + "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'ai.opencode.desktop' AND version_compare(bundle_short_version, '1.18.30') < 0);", "open": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps a JOIN processes p ON p.path = concat(a.path, '/Contents/MacOS/', a.bundle_executable) WHERE a.bundle_identifier = 'ai.opencode.desktop' AND a.bundle_executable != '');" }, - "installer_url": "https://github.com/anomalyco/opencode/releases/download/v1.18.29/opencode-desktop-mac-arm64.dmg", + "installer_url": "https://github.com/anomalyco/opencode/releases/download/v1.18.30/opencode-desktop-mac-arm64.dmg", "install_script_ref": "d2ce7b1a", "uninstall_script_ref": "99fcb3f1", - "sha256": "9dac3c31246da436ddb75bb734a6de88d0d0b0ab24d9b07cc3c8d233a7a2849c", + "sha256": "d83737520b454681cde75b248a60595e57518c742861fd5ea07798ad3f52fb68", "default_categories": [ "Productivity" ] diff --git a/ee/maintained-apps/outputs/postman/darwin.json b/ee/maintained-apps/outputs/postman/darwin.json index 3751ab99385..08e112f891c 100644 --- a/ee/maintained-apps/outputs/postman/darwin.json +++ b/ee/maintained-apps/outputs/postman/darwin.json @@ -1,16 +1,16 @@ { "versions": [ { - "version": "12.27.1", + "version": "12.27.2", "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.27.1') < 0);", + "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'com.postmanlabs.mac' AND version_compare(bundle_short_version, '12.27.2') < 0);", "open": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps a JOIN processes p ON p.path = concat(a.path, '/Contents/MacOS/', a.bundle_executable) WHERE a.bundle_identifier = 'com.postmanlabs.mac' AND a.bundle_executable != '');" }, - "installer_url": "https://dl.pstmn.io/download/version/12.27.1/osx_arm64", + "installer_url": "https://dl.pstmn.io/download/version/12.27.2/osx_arm64", "install_script_ref": "0e85ef74", "uninstall_script_ref": "727f8e9d", - "sha256": "ca52cb01736b5464eca1cb20df406beddc73d7a7c780759b5fed48176dd24a8d", + "sha256": "160c4701bf8f6ed7f256ce560242b15b0ba823106122642009687b8e9490e59d", "default_categories": [ "Developer tools" ] diff --git a/ee/maintained-apps/outputs/powershell/windows.json b/ee/maintained-apps/outputs/powershell/windows.json index ed88283733a..163fa1b4e43 100644 --- a/ee/maintained-apps/outputs/powershell/windows.json +++ b/ee/maintained-apps/outputs/powershell/windows.json @@ -1,23 +1,23 @@ { "versions": [ { - "version": "7.6.5.0", + "version": "7.6.6.0", "queries": { "exists": "SELECT 1 FROM programs WHERE name = 'PowerShell 7-x64' AND publisher = 'Microsoft Corporation';", - "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM programs WHERE name = 'PowerShell 7-x64' AND publisher = 'Microsoft Corporation' AND version_compare(version, '7.6.5.0') < 0);", + "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM programs WHERE name = 'PowerShell 7-x64' AND publisher = 'Microsoft Corporation' AND version_compare(version, '7.6.6.0') < 0);", "open": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM processes WHERE LOWER(name) = 'pwsh.exe');" }, - "installer_url": "https://github.com/PowerShell/PowerShell/releases/download/v7.6.5/PowerShell-7.6.5-win-x64.msi", + "installer_url": "https://github.com/PowerShell/PowerShell/releases/download/v7.6.6/PowerShell-7.6.6-win-x64.msi", "install_script_ref": "22e48c46", - "uninstall_script_ref": "a2cb0c08", - "sha256": "3a87c24e044ec792047d734c841917ee4323a535e25f645ae6c33141a35fca8d", + "uninstall_script_ref": "1e44bb31", + "sha256": "958838ff55091e1c8705d89efed0cc7e8245a3a6ef6c0ccfae20015227108ad8", "default_categories": [ "Developer tools" ] } ], "refs": { - "22e48c46": "$logFile = \"${env:TEMP}/fleet-install-software.log\"\n\n# MSI exit codes that indicate success. 3010 = ERROR_SUCCESS_REBOOT_REQUIRED,\n# 1641 = ERROR_SUCCESS_REBOOT_INITIATED. Treat these as success rather than failure.\n$successCodes = @(0, 3010, 1641)\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\nif ($successCodes -contains $installProcess.ExitCode) {\n Exit 0\n}\n\nExit $installProcess.ExitCode\n\n} catch {\n Write-Host \"Error: $_\"\n Exit 1\n}\n", - "a2cb0c08": "$product_code = '{499CA787-2899-40D2-A793-087E08EB227D}'\n$timeoutSeconds = 300 # 5 minute timeout\n\n# Fleet uninstalls app using product code that's extracted on upload\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\nif (-not $completed) {\n Stop-Process -Id $process.Id -Force -ErrorAction SilentlyContinue\n Exit 1603 # ERROR_UNINSTALL_FAILURE\n}\n\n# MSI exit codes that indicate success. 3010 = ERROR_SUCCESS_REBOOT_REQUIRED,\n# 1641 = ERROR_SUCCESS_REBOOT_INITIATED. Treat these as success rather than failure.\n$successCodes = @(0, 3010, 1641)\n\n# Check exit code and output result\nif ($successCodes -contains $process.ExitCode) {\n Write-Output \"Exit 0\"\n Exit 0\n} else {\n Write-Output \"Exit $($process.ExitCode)\"\n Exit $process.ExitCode\n}\n" + "1e44bb31": "$product_code = '{B1A9B37E-00B6-4BFD-A439-3120FE4F766E}'\n$timeoutSeconds = 300 # 5 minute timeout\n\n# Fleet uninstalls app using product code that's extracted on upload\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\nif (-not $completed) {\n Stop-Process -Id $process.Id -Force -ErrorAction SilentlyContinue\n Exit 1603 # ERROR_UNINSTALL_FAILURE\n}\n\n# MSI exit codes that indicate success. 3010 = ERROR_SUCCESS_REBOOT_REQUIRED,\n# 1641 = ERROR_SUCCESS_REBOOT_INITIATED. Treat these as success rather than failure.\n$successCodes = @(0, 3010, 1641)\n\n# Check exit code and output result\nif ($successCodes -contains $process.ExitCode) {\n Write-Output \"Exit 0\"\n Exit 0\n} else {\n Write-Output \"Exit $($process.ExitCode)\"\n Exit $process.ExitCode\n}\n", + "22e48c46": "$logFile = \"${env:TEMP}/fleet-install-software.log\"\n\n# MSI exit codes that indicate success. 3010 = ERROR_SUCCESS_REBOOT_REQUIRED,\n# 1641 = ERROR_SUCCESS_REBOOT_INITIATED. Treat these as success rather than failure.\n$successCodes = @(0, 3010, 1641)\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\nif ($successCodes -contains $installProcess.ExitCode) {\n Exit 0\n}\n\nExit $installProcess.ExitCode\n\n} catch {\n Write-Host \"Error: $_\"\n Exit 1\n}\n" } } diff --git a/ee/maintained-apps/outputs/reminders-menubar/darwin.json b/ee/maintained-apps/outputs/reminders-menubar/darwin.json index 9e7f8441f44..6c8dd4278cd 100644 --- a/ee/maintained-apps/outputs/reminders-menubar/darwin.json +++ b/ee/maintained-apps/outputs/reminders-menubar/darwin.json @@ -1,16 +1,16 @@ { "versions": [ { - "version": "2.1.1", + "version": "2.2.0", "queries": { "exists": "SELECT 1 FROM apps WHERE bundle_identifier = 'br.com.damascenorafael.reminders-menubar';", - "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'br.com.damascenorafael.reminders-menubar' AND version_compare(bundle_short_version, '2.1.1') < 0);", + "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'br.com.damascenorafael.reminders-menubar' AND version_compare(bundle_short_version, '2.2.0') < 0);", "open": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps a JOIN processes p ON p.path = concat(a.path, '/Contents/MacOS/', a.bundle_executable) WHERE a.bundle_identifier = 'br.com.damascenorafael.reminders-menubar' AND a.bundle_executable != '');" }, - "installer_url": "https://github.com/DamascenoRafael/reminders-menubar/releases/download/v2.1.1/reminders-menubar.zip", + "installer_url": "https://github.com/DamascenoRafael/reminders-menubar/releases/download/v2.2.0/reminders-menubar.zip", "install_script_ref": "0a98896b", "uninstall_script_ref": "467090f2", - "sha256": "1eafb0ef195f61c7e72823899b3ac031a7e6fc4967b56a459b2a78cd5a1795a1", + "sha256": "2187c4bac005359fcca53f599ce45bb6ef20b62196ada4cf5fdf62aee203c907", "default_categories": [ "Utilities" ] diff --git a/ee/maintained-apps/outputs/slack/windows.json b/ee/maintained-apps/outputs/slack/windows.json index 61ff49d8f86..5c26fee576b 100644 --- a/ee/maintained-apps/outputs/slack/windows.json +++ b/ee/maintained-apps/outputs/slack/windows.json @@ -1,16 +1,16 @@ { "versions": [ { - "version": "4.51.191", + "version": "4.52.155", "queries": { "exists": "SELECT 1 FROM programs WHERE name = 'Slack' AND publisher = 'Slack Technologies Inc.';", - "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM programs WHERE name = 'Slack' AND publisher = 'Slack Technologies Inc.' AND version_compare(version, '4.51.191') < 0);", + "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM programs WHERE name = 'Slack' AND publisher = 'Slack Technologies Inc.' AND version_compare(version, '4.52.155') < 0);", "open": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM processes WHERE LOWER(name) = 'slack.exe');" }, - "installer_url": "https://downloads.slack-edge.com/desktop-releases/windows/x64/4.51.191/Slack.msix", + "installer_url": "https://downloads.slack-edge.com/desktop-releases/windows/x64/4.52.155/Slack.msix", "install_script_ref": "8b41f934", "uninstall_script_ref": "034eae14", - "sha256": "0b267d78189561bb44d7a8bba923e8f3524a388903677c18c64adcd76e160557", + "sha256": "3697483496a0239438671840630b292cd0eb864a5615b74cdd7b338eea101734", "default_categories": [ "Communication" ] diff --git a/ee/maintained-apps/outputs/snagit/windows.json b/ee/maintained-apps/outputs/snagit/windows.json index 6eb59d980e8..9abce2dc32e 100644 --- a/ee/maintained-apps/outputs/snagit/windows.json +++ b/ee/maintained-apps/outputs/snagit/windows.json @@ -1,16 +1,16 @@ { "versions": [ { - "version": "26.2.2", + "version": "26.3.1", "queries": { "exists": "SELECT 1 FROM programs WHERE name = 'Snagit 2026' AND publisher = 'TechSmith Corporation';", - "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM programs WHERE name = 'Snagit 2026' AND publisher = 'TechSmith Corporation' AND version_compare(version, '26.2.2') < 0);", + "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM programs WHERE name = 'Snagit 2026' AND publisher = 'TechSmith Corporation' AND version_compare(version, '26.3.1') < 0);", "open": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM processes WHERE LOWER(name) = 'snagit.exe');" }, - "installer_url": "https://download.techsmith.com/snagit/releases/2622/snagit.msi", + "installer_url": "https://download.techsmith.com/snagit/releases/2631/snagit.msi", "install_script_ref": "22e48c46", "uninstall_script_ref": "f47949a4", - "sha256": "5121847ac6766983416578856adfe41abd84aa2b7d8e246f2d1e93fcac2cf44e", + "sha256": "75a0f01d34ab04c25a0251164243f9655c26cd2a49e3851d2d1c8428bb200d5c", "default_categories": [ "Productivity" ], diff --git a/ee/maintained-apps/outputs/sql-server-management-studio/windows.json b/ee/maintained-apps/outputs/sql-server-management-studio/windows.json index e924ac634f1..42dbe4f4cc2 100644 --- a/ee/maintained-apps/outputs/sql-server-management-studio/windows.json +++ b/ee/maintained-apps/outputs/sql-server-management-studio/windows.json @@ -1,16 +1,16 @@ { "versions": [ { - "version": "22.9.1", + "version": "22.10.0", "queries": { "exists": "SELECT 1 FROM programs WHERE name = 'SQL Server Management Studio 22';", - "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM programs WHERE name = 'SQL Server Management Studio 22' AND version_compare(version, '22.9.1') < 0);", + "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM programs WHERE name = 'SQL Server Management Studio 22' AND version_compare(version, '22.10.0') < 0);", "open": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM processes WHERE LOWER(name) = 'sql server management studio.exe');" }, - "installer_url": "https://download.visualstudio.microsoft.com/download/pr/7834fc97-5a8c-4392-a2a9-ed4b98f77180/afe9a072e7c230f87e639cfd10868b37804152ee91997f0e72c49282686b70fe/vs_SSMS.exe", + "installer_url": "https://download.visualstudio.microsoft.com/download/pr/af2bf19c-59e9-48c4-bac6-019f173389ac/1dab93450311bab4a759f4e85f76ebe749b261041b00fd24a6a2db5f21971a0a/vs_SSMS.exe", "install_script_ref": "660f158a", "uninstall_script_ref": "13740770", - "sha256": "afe9a072e7c230f87e639cfd10868b37804152ee91997f0e72c49282686b70fe", + "sha256": "1dab93450311bab4a759f4e85f76ebe749b261041b00fd24a6a2db5f21971a0a", "default_categories": [ "Developer tools" ] diff --git a/ee/maintained-apps/outputs/standard-notes/windows.json b/ee/maintained-apps/outputs/standard-notes/windows.json index 83c6180deda..69574298a23 100644 --- a/ee/maintained-apps/outputs/standard-notes/windows.json +++ b/ee/maintained-apps/outputs/standard-notes/windows.json @@ -1,16 +1,16 @@ { "versions": [ { - "version": "3.201.21", + "version": "3.202.0", "queries": { "exists": "SELECT 1 FROM programs WHERE name LIKE 'Standard Notes %' AND publisher = 'Standard Notes';", - "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM programs WHERE name LIKE 'Standard Notes %' AND publisher = 'Standard Notes' AND version_compare(version, '3.201.21') < 0);", + "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM programs WHERE name LIKE 'Standard Notes %' AND publisher = 'Standard Notes' AND version_compare(version, '3.202.0') < 0);", "open": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM processes WHERE LOWER(name) = 'standard notes.exe');" }, - "installer_url": "https://github.com/standardnotes/app/releases/download/@standardnotes/desktop@3.201.21/standard-notes-3.201.21-win-x64.exe", + "installer_url": "https://github.com/standardnotes/app/releases/download/@standardnotes/desktop@3.202.0/standard-notes-3.202.0-win-x64.exe", "install_script_ref": "45257f64", "uninstall_script_ref": "5b6cc5ec", - "sha256": "da034509c6fbfdd05f0ad7c4106ba7d8e562cca680486af7edcbcc1ab81f148e", + "sha256": "d69d93d098665c2b62a25ab45b72bdf983a4dae9432ee071981afcb61035761f", "default_categories": [ "Security" ] diff --git a/ee/maintained-apps/outputs/superhuman/darwin.json b/ee/maintained-apps/outputs/superhuman/darwin.json index 3cb43bd7398..27de0c49b91 100644 --- a/ee/maintained-apps/outputs/superhuman/darwin.json +++ b/ee/maintained-apps/outputs/superhuman/darwin.json @@ -1,16 +1,16 @@ { "versions": [ { - "version": "1041.0.49", + "version": "1041.0.50", "queries": { "exists": "SELECT 1 FROM apps WHERE bundle_identifier = 'com.superhuman.mail';", - "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'com.superhuman.mail' AND version_compare(bundle_short_version, '1041.0.49') < 0);", + "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'com.superhuman.mail' AND version_compare(bundle_short_version, '1041.0.50') < 0);", "open": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps a JOIN processes p ON p.path = concat(a.path, '/Contents/MacOS/', a.bundle_executable) WHERE a.bundle_identifier = 'com.superhuman.mail' AND a.bundle_executable != '');" }, - "installer_url": "https://storage.googleapis.com/download.superhuman.com/supertron-update/Superhuman-1041.0.49-arm64-latest-mac.zip", + "installer_url": "https://storage.googleapis.com/download.superhuman.com/supertron-update/Superhuman-1041.0.50-arm64-latest-mac.zip", "install_script_ref": "7e74bd96", "uninstall_script_ref": "1809183d", - "sha256": "e6f4614d8bb05f47cc02f9fa4ba1c5651684fa82c76c6762034de1ff3770e033", + "sha256": "dc89a86d6ddd0243ae7c7962ab4aa7ed7b44f03082a0ba0d0f0e979c6c07c10c", "default_categories": [ "Communication" ] diff --git a/ee/maintained-apps/outputs/teamviewer/windows.json b/ee/maintained-apps/outputs/teamviewer/windows.json index a8d1f2f5072..cd53d24adbd 100644 --- a/ee/maintained-apps/outputs/teamviewer/windows.json +++ b/ee/maintained-apps/outputs/teamviewer/windows.json @@ -1,13 +1,13 @@ { "versions": [ { - "version": "15.81.5", + "version": "15.81.6", "queries": { "exists": "SELECT 1 FROM programs WHERE name = 'TeamViewer' AND publisher = 'TeamViewer';", - "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM programs WHERE name = 'TeamViewer' AND publisher = 'TeamViewer' AND version_compare(version, '15.81.5') < 0);", + "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM programs WHERE name = 'TeamViewer' AND publisher = 'TeamViewer' AND version_compare(version, '15.81.6') < 0);", "open": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM processes WHERE LOWER(name) = 'teamviewer.exe');" }, - "installer_url": "https://download.teamviewer.com/download/version_15x/TeamViewer_Setup_x64_15.81.5.exe", + "installer_url": "https://download.teamviewer.com/download/version_15x/TeamViewer_Setup_x64_15.81.6.exe", "install_script_ref": "45f422bf", "uninstall_script_ref": "390c83e7", "sha256": "no_check", diff --git a/ee/maintained-apps/outputs/tor-browser/darwin.json b/ee/maintained-apps/outputs/tor-browser/darwin.json index 4bb1289f993..04dc1c3d92c 100644 --- a/ee/maintained-apps/outputs/tor-browser/darwin.json +++ b/ee/maintained-apps/outputs/tor-browser/darwin.json @@ -1,16 +1,16 @@ { "versions": [ { - "version": "15.0.21", + "version": "15.0.22", "queries": { "exists": "SELECT 1 FROM apps WHERE bundle_identifier = 'org.torproject.torbrowser';", - "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'org.torproject.torbrowser' AND version_compare(bundle_short_version, '15.0.21') < 0);", + "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'org.torproject.torbrowser' AND version_compare(bundle_short_version, '15.0.22') < 0);", "open": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps a JOIN processes p ON p.path = concat(a.path, '/Contents/MacOS/', a.bundle_executable) WHERE a.bundle_identifier = 'org.torproject.torbrowser' AND a.bundle_executable != '');" }, - "installer_url": "https://www.torproject.org/dist/torbrowser/15.0.21/tor-browser-macos-15.0.21.dmg", + "installer_url": "https://www.torproject.org/dist/torbrowser/15.0.22/tor-browser-macos-15.0.22.dmg", "install_script_ref": "5696723c", "uninstall_script_ref": "f961039a", - "sha256": "2adc3e7392c371475d4e857c8c1a7411d477eeab459d886195afea98c3a4572d", + "sha256": "4e8f1a7a6e978b8bcd991f294b59b9c6bbf253c559b122c8888b10eefaf00d87", "default_categories": [ "Browsers" ] diff --git a/ee/maintained-apps/outputs/visual-studio-2022-community/windows.json b/ee/maintained-apps/outputs/visual-studio-2022-community/windows.json index fabdaf1510d..30d7a4e1ce2 100644 --- a/ee/maintained-apps/outputs/visual-studio-2022-community/windows.json +++ b/ee/maintained-apps/outputs/visual-studio-2022-community/windows.json @@ -1,16 +1,16 @@ { "versions": [ { - "version": "17.14.39", + "version": "17.14.40", "queries": { "exists": "SELECT 1 FROM programs WHERE (name = 'Visual Studio Community 2022' OR name LIKE 'Visual Studio Community 2022 (%') AND publisher = 'Microsoft Corporation';", - "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM programs WHERE ((name = 'Visual Studio Community 2022' OR name LIKE 'Visual Studio Community 2022 (%') AND publisher = 'Microsoft Corporation') AND version_compare(version, '17.14.39') < 0);", + "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM programs WHERE ((name = 'Visual Studio Community 2022' OR name LIKE 'Visual Studio Community 2022 (%') AND publisher = 'Microsoft Corporation') AND version_compare(version, '17.14.40') < 0);", "open": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM processes WHERE LOWER(name) = 'visual studio community 2022.exe');" }, - "installer_url": "https://download.visualstudio.microsoft.com/download/pr/fa619120-9c0e-47e6-bfe0-3ee96fb671b2/c2b025e3f2a6a8291bd18a23766b82c929023fc36855c6b09c026d424676588d/vs_Community.exe", + "installer_url": "https://download.visualstudio.microsoft.com/download/pr/f8d58e41-102a-4347-a567-60d7235da3b5/ebcaaa6953043238bafc61b78adb94737cc2f0f10b8389470272bdee4c866a80/vs_Community.exe", "install_script_ref": "1662986f", "uninstall_script_ref": "e8264c65", - "sha256": "c2b025e3f2a6a8291bd18a23766b82c929023fc36855c6b09c026d424676588d", + "sha256": "ebcaaa6953043238bafc61b78adb94737cc2f0f10b8389470272bdee4c866a80", "default_categories": [ "Developer tools" ] diff --git a/ee/maintained-apps/outputs/visual-studio-2022-enterprise/windows.json b/ee/maintained-apps/outputs/visual-studio-2022-enterprise/windows.json index 812821ab402..cb8a8f2b332 100644 --- a/ee/maintained-apps/outputs/visual-studio-2022-enterprise/windows.json +++ b/ee/maintained-apps/outputs/visual-studio-2022-enterprise/windows.json @@ -1,16 +1,16 @@ { "versions": [ { - "version": "17.14.39", + "version": "17.14.40", "queries": { "exists": "SELECT 1 FROM programs WHERE (name = 'Visual Studio Enterprise 2022' OR name LIKE 'Visual Studio Enterprise 2022 (%') AND publisher = 'Microsoft Corporation';", - "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM programs WHERE ((name = 'Visual Studio Enterprise 2022' OR name LIKE 'Visual Studio Enterprise 2022 (%') AND publisher = 'Microsoft Corporation') AND version_compare(version, '17.14.39') < 0);", + "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM programs WHERE ((name = 'Visual Studio Enterprise 2022' OR name LIKE 'Visual Studio Enterprise 2022 (%') AND publisher = 'Microsoft Corporation') AND version_compare(version, '17.14.40') < 0);", "open": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM processes WHERE LOWER(name) = 'visual studio enterprise 2022.exe');" }, - "installer_url": "https://download.visualstudio.microsoft.com/download/pr/fa619120-9c0e-47e6-bfe0-3ee96fb671b2/63756cd71ae67cfbc371ca0798931d41ea30ccc5065be1b3b0bc84b43cd3b50e/vs_Enterprise.exe", + "installer_url": "https://download.visualstudio.microsoft.com/download/pr/f8d58e41-102a-4347-a567-60d7235da3b5/ec9d258c31657a7f6c137ebc9cf2624ec66e7198037c46df99e9263383c99ad8/vs_Enterprise.exe", "install_script_ref": "1662986f", "uninstall_script_ref": "4e3130f5", - "sha256": "63756cd71ae67cfbc371ca0798931d41ea30ccc5065be1b3b0bc84b43cd3b50e", + "sha256": "ec9d258c31657a7f6c137ebc9cf2624ec66e7198037c46df99e9263383c99ad8", "default_categories": [ "Developer tools" ] diff --git a/ee/maintained-apps/outputs/visual-studio-2022-professional/windows.json b/ee/maintained-apps/outputs/visual-studio-2022-professional/windows.json index 5e5e92aff9a..e9edd2a8b7d 100644 --- a/ee/maintained-apps/outputs/visual-studio-2022-professional/windows.json +++ b/ee/maintained-apps/outputs/visual-studio-2022-professional/windows.json @@ -1,16 +1,16 @@ { "versions": [ { - "version": "17.14.39", + "version": "17.14.40", "queries": { "exists": "SELECT 1 FROM programs WHERE (name = 'Visual Studio Professional 2022' OR name LIKE 'Visual Studio Professional 2022 (%') AND publisher = 'Microsoft Corporation';", - "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM programs WHERE ((name = 'Visual Studio Professional 2022' OR name LIKE 'Visual Studio Professional 2022 (%') AND publisher = 'Microsoft Corporation') AND version_compare(version, '17.14.39') < 0);", + "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM programs WHERE ((name = 'Visual Studio Professional 2022' OR name LIKE 'Visual Studio Professional 2022 (%') AND publisher = 'Microsoft Corporation') AND version_compare(version, '17.14.40') < 0);", "open": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM processes WHERE LOWER(name) = 'visual studio professional 2022.exe');" }, - "installer_url": "https://download.visualstudio.microsoft.com/download/pr/fa619120-9c0e-47e6-bfe0-3ee96fb671b2/770fbbb969a97bb6cd9917c10117eee0f78bb166e28caf47f33bc8948165f1cd/vs_Professional.exe", + "installer_url": "https://download.visualstudio.microsoft.com/download/pr/f8d58e41-102a-4347-a567-60d7235da3b5/8e6e9e695c7f74214aaf018b099436cde89c3f8e128d81f314657a56a6e9ab6b/vs_Professional.exe", "install_script_ref": "1662986f", "uninstall_script_ref": "ea7440c0", - "sha256": "770fbbb969a97bb6cd9917c10117eee0f78bb166e28caf47f33bc8948165f1cd", + "sha256": "8e6e9e695c7f74214aaf018b099436cde89c3f8e128d81f314657a56a6e9ab6b", "default_categories": [ "Developer tools" ] diff --git a/ee/maintained-apps/outputs/visual-studio-code/darwin.json b/ee/maintained-apps/outputs/visual-studio-code/darwin.json index 2f5ac90fdf5..81c28873f6c 100644 --- a/ee/maintained-apps/outputs/visual-studio-code/darwin.json +++ b/ee/maintained-apps/outputs/visual-studio-code/darwin.json @@ -1,13 +1,13 @@ { "versions": [ { - "version": "1.136.1", + "version": "1.136.2", "queries": { "exists": "SELECT 1 FROM apps WHERE bundle_identifier = 'com.microsoft.VSCode';", - "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'com.microsoft.VSCode' AND version_compare(bundle_short_version, '1.136.1') < 0);", + "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'com.microsoft.VSCode' AND version_compare(bundle_short_version, '1.136.2') < 0);", "open": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps a JOIN processes p ON p.path = concat(a.path, '/Contents/MacOS/', a.bundle_executable) WHERE a.bundle_identifier = 'com.microsoft.VSCode' AND a.bundle_executable != '');" }, - "installer_url": "https://update.code.visualstudio.com/1.136.1/darwin-universal/stable", + "installer_url": "https://update.code.visualstudio.com/1.136.2/darwin-universal/stable", "install_script_ref": "58ade691", "uninstall_script_ref": "38d65803", "sha256": "no_check",