From 7c12cf105f8926c15fe2b9472611ac17c7c722ff Mon Sep 17 00:00:00 2001 From: allenhouchins <32207388+allenhouchins@users.noreply.github.com> Date: Mon, 24 Aug 2026 16:16:31 +0000 Subject: [PATCH] Update Fleet-maintained apps. Generated automatically with cmd/maintained-apps. --- ee/maintained-apps/outputs/aptakube/windows.json | 8 ++++---- .../outputs/bettertouchtool/darwin.json | 4 ++-- ee/maintained-apps/outputs/betterzip/darwin.json | 12 ++++++------ ee/maintained-apps/outputs/chatgpt/darwin.json | 8 ++++---- .../outputs/coconutbattery/darwin.json | 4 ++-- ee/maintained-apps/outputs/codexbar/darwin.json | 8 ++++---- ee/maintained-apps/outputs/cork/darwin.json | 4 ++-- .../outputs/docker-desktop/darwin.json | 8 ++++---- ee/maintained-apps/outputs/docker/windows.json | 8 ++++---- ee/maintained-apps/outputs/drawio/darwin.json | 4 ++-- ee/maintained-apps/outputs/drofus/windows.json | 8 ++++---- ee/maintained-apps/outputs/duckduckgo/darwin.json | 8 ++++---- .../outputs/eclipse-temurin-jdk-17/windows.json | 8 ++++---- .../outputs/eclipse-temurin-jre-17/windows.json | 8 ++++---- .../outputs/firefox@nightly/darwin.json | 4 ++-- ee/maintained-apps/outputs/gitify/darwin.json | 8 ++++---- ee/maintained-apps/outputs/glyphs/darwin.json | 8 ++++---- .../outputs/jabra-direct/darwin.json | 4 ++-- .../outputs/keyboardcleantool/darwin.json | 8 ++++---- .../outputs/keystore-explorer/darwin.json | 8 ++++---- ee/maintained-apps/outputs/local/darwin.json | 8 ++++---- .../outputs/microsoft-edge/darwin.json | 8 ++++---- .../outputs/microsoft-edge/windows.json | 8 ++++---- ee/maintained-apps/outputs/notepadexe/darwin.json | 8 ++++---- .../outputs/omnissa-horizon-client/darwin.json | 8 ++++---- .../outputs/omnissa-horizon-client/windows.json | 8 ++++---- ee/maintained-apps/outputs/openmtp/darwin.json | 4 ++-- ee/maintained-apps/outputs/picview/darwin.json | 8 ++++---- ee/maintained-apps/outputs/postman/darwin.json | 8 ++++---- ee/maintained-apps/outputs/proxyman/darwin.json | 8 ++++---- ee/maintained-apps/outputs/shapr3d/darwin.json | 8 ++++---- ee/maintained-apps/outputs/sourcetree/windows.json | 8 ++++---- .../outputs/splashtop-business/darwin.json | 8 ++++---- .../outputs/splashtop-streamer/darwin.json | 14 +++++++------- ee/maintained-apps/outputs/spokenly/darwin.json | 8 ++++---- ee/maintained-apps/outputs/stats/darwin.json | 8 ++++---- ee/maintained-apps/outputs/whatsapp/darwin.json | 4 ++-- 37 files changed, 137 insertions(+), 137 deletions(-) diff --git a/ee/maintained-apps/outputs/aptakube/windows.json b/ee/maintained-apps/outputs/aptakube/windows.json index 83029f6006a..3eb322f8138 100644 --- a/ee/maintained-apps/outputs/aptakube/windows.json +++ b/ee/maintained-apps/outputs/aptakube/windows.json @@ -1,16 +1,16 @@ { "versions": [ { - "version": "1.18.8", + "version": "1.19.1", "queries": { "exists": "SELECT 1 FROM programs WHERE name = 'Aptakube' AND publisher = 'Zandar Labs SL';", - "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM programs WHERE name = 'Aptakube' AND publisher = 'Zandar Labs SL' AND version_compare(version, '1.18.8') < 0);", + "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM programs WHERE name = 'Aptakube' AND publisher = 'Zandar Labs SL' AND version_compare(version, '1.19.1') < 0);", "open": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM processes WHERE LOWER(name) = 'aptakube.exe');" }, - "installer_url": "https://releases.aptakube.com/Aptakube_1.18.8_x64_en-US.msi", + "installer_url": "https://releases.aptakube.com/Aptakube_1.19.1_x64_en-US.msi", "install_script_ref": "22e48c46", "uninstall_script_ref": "d2281ec5", - "sha256": "0ed24212f4d3b23db10eedbdba01ad09b83d34c1bc74b065439ef3dfb8c97775", + "sha256": "38beba5c3d25ad4f968a48b0d80529ccba9933c4e35c25c741375a08e4078831", "default_categories": [ "Developer tools" ], diff --git a/ee/maintained-apps/outputs/bettertouchtool/darwin.json b/ee/maintained-apps/outputs/bettertouchtool/darwin.json index 0a26f3ce56a..4b7195c2b89 100644 --- a/ee/maintained-apps/outputs/bettertouchtool/darwin.json +++ b/ee/maintained-apps/outputs/bettertouchtool/darwin.json @@ -9,7 +9,7 @@ }, "installer_url": "https://folivora.ai/releases/btt6.748-2026082207.zip", "install_script_ref": "17a00450", - "uninstall_script_ref": "b0dc7152", + "uninstall_script_ref": "aef4d4fc", "sha256": "1d736e396d457d73931c6b124248550223e67178f92698b706b49583f9fa366f", "default_categories": [ "Productivity" @@ -18,6 +18,6 @@ ], "refs": { "17a00450": "#!/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.hegenberg.BetterTouchTool'\nif [ -d \"$APPDIR/BetterTouchTool.app\" ]; then\n\tsudo mv \"$APPDIR/BetterTouchTool.app\" \"$TMPDIR/BetterTouchTool.app.bkp\" || exit $?\nfi\nif ! sudo cp -R \"$TMPDIR/BetterTouchTool.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/BetterTouchTool.app\"\n\tif [ -d \"$TMPDIR/BetterTouchTool.app.bkp\" ]; then\n\t\tsudo mv \"$TMPDIR/BetterTouchTool.app.bkp\" \"$APPDIR/BetterTouchTool.app\"\n\tfi\n\texit 1\nfi\nrelaunch_application 'com.hegenberg.BetterTouchTool'\n", - "b0dc7152": "#!/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.hegenberg.BetterTouchTool'\nsudo rm -rf \"$APPDIR/BetterTouchTool.app\"\ntrash $LOGGED_IN_USER '~/Library/Application Support/BetterTouchTool'\ntrash $LOGGED_IN_USER '~/Library/Preferences/com.hegenberg.BetterTouchTool.plist'\n" + "aef4d4fc": "#!/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.hegenberg.BetterTouchTool'\nsudo rm -rf \"$APPDIR/BetterTouchTool.app\"\ntrash $LOGGED_IN_USER '~/Library/Application Scripts/com.hegenberg.BetterTouchTool.BetterTouchTool-Widgets'\ntrash $LOGGED_IN_USER '~/Library/Application Scripts/com.hegenberg.BetterTouchTool.BTTFinderContextMenu'\ntrash $LOGGED_IN_USER '~/Library/Application Support/BetterTouchTool'\ntrash $LOGGED_IN_USER '~/Library/Application Support/com.apple.sharedfilelist/com.apple.LSSharedFileList.ApplicationRecentDocuments/com.hegenberg.bettertouchtool.sfl*'\ntrash $LOGGED_IN_USER '~/Library/Caches/com.hegenberg.BetterTouchTool'\ntrash $LOGGED_IN_USER '~/Library/Containers/com.hegenberg.BetterTouchTool.BetterTouchTool-Widgets'\ntrash $LOGGED_IN_USER '~/Library/Containers/com.hegenberg.BetterTouchTool.BTTFinderContextMenu'\ntrash $LOGGED_IN_USER '~/Library/HTTPStorages/com.hegenberg.BetterTouchTool'\ntrash $LOGGED_IN_USER '~/Library/Preferences/com.hegenberg.BetterTouchTool.plist'\n" } } diff --git a/ee/maintained-apps/outputs/betterzip/darwin.json b/ee/maintained-apps/outputs/betterzip/darwin.json index 1e88dd8e0fd..b2357a87934 100644 --- a/ee/maintained-apps/outputs/betterzip/darwin.json +++ b/ee/maintained-apps/outputs/betterzip/darwin.json @@ -1,16 +1,16 @@ { "versions": [ { - "version": "6.0.4", + "version": "6.0.5", "queries": { "exists": "SELECT 1 FROM apps WHERE bundle_identifier = 'com.macitbetter.betterzip';", - "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'com.macitbetter.betterzip' AND version_compare(bundle_short_version, '6.0.4') < 0);", + "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'com.macitbetter.betterzip' AND version_compare(bundle_short_version, '6.0.5') < 0);", "open": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps a JOIN processes p ON substr(p.path, 1, LENGTH(a.path) + 1) = concat(a.path, '/') WHERE a.bundle_identifier = 'com.macitbetter.betterzip');" }, - "installer_url": "https://macitbetter.com/dl/BetterZip-6.0.4.zip", + "installer_url": "https://macitbetter.com/dl/BetterZip-6.0.5.zip", "install_script_ref": "2872398b", - "uninstall_script_ref": "84dca76c", - "sha256": "b37f810f1fb73bcb61b9c8165cb4eea690b59cedc3584736e9ff776b0a06b90c", + "uninstall_script_ref": "e9cb7e5b", + "sha256": "79ebb89f9e7d1424feba04e6fa0e2351c25bce4f45759463900232f91652abea", "default_categories": [ "Productivity" ] @@ -18,6 +18,6 @@ ], "refs": { "2872398b": "#!/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.macitbetter.betterzip'\nif [ -d \"$APPDIR/BetterZip.app\" ]; then\n\tsudo mv \"$APPDIR/BetterZip.app\" \"$TMPDIR/BetterZip.app.bkp\" || exit $?\nfi\nif ! sudo cp -R \"$TMPDIR/BetterZip.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/BetterZip.app\"\n\tif [ -d \"$TMPDIR/BetterZip.app.bkp\" ]; then\n\t\tsudo mv \"$TMPDIR/BetterZip.app.bkp\" \"$APPDIR/BetterZip.app\"\n\tfi\n\texit 1\nfi\nrelaunch_application 'com.macitbetter.betterzip'\n", - "84dca76c": "#!/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/BetterZip.app\"\ntrash $LOGGED_IN_USER '~/Library/Application Scripts/79RR9LPM2N.group.com.macitbetter.betterzip'\ntrash $LOGGED_IN_USER '~/Library/Application Scripts/79RR9LPM2N.group.com.macitbetter.betterzip-setapp'\ntrash $LOGGED_IN_USER '~/Library/Application Scripts/com.macitbetter.betterzip.Compress-with-BetterZip'\ntrash $LOGGED_IN_USER '~/Library/Application Scripts/com.macitbetter.betterzip.findersyncextension'\ntrash $LOGGED_IN_USER '~/Library/Application Scripts/com.macitbetter.betterzip.Quick-Look-Extension'\ntrash $LOGGED_IN_USER '~/Library/Application Support/com.apple.sharedfilelist/com.apple.LSSharedFileList.ApplicationRecentDocuments/com.macitbetter.betterzip.sfl*'\ntrash $LOGGED_IN_USER '~/Library/Application Support/com.macitbetter.betterzip'\ntrash $LOGGED_IN_USER '~/Library/Caches/com.apple.helpd/Generated/com.macitbetter.betterzip.help*'\ntrash $LOGGED_IN_USER '~/Library/Caches/com.macitbetter.betterzip'\ntrash $LOGGED_IN_USER '~/Library/Containers/com.macitbetter.betterzip.Compress-with-BetterZip'\ntrash $LOGGED_IN_USER '~/Library/Containers/com.macitbetter.betterzip.findersyncextension'\ntrash $LOGGED_IN_USER '~/Library/Containers/com.macitbetter.betterzip.Quick-Look-Extension'\ntrash $LOGGED_IN_USER '~/Library/Group Containers/79RR9LPM2N.group.com.macitbetter.betterzip'\ntrash $LOGGED_IN_USER '~/Library/Group Containers/79RR9LPM2N.group.com.macitbetter.betterzip-setapp'\ntrash $LOGGED_IN_USER '~/Library/HTTPStorages/com.macitbetter.betterzip'\ntrash $LOGGED_IN_USER '~/Library/Preferences/com.macitbetter.betterzip.plist'\ntrash $LOGGED_IN_USER '~/Library/Saved Application State/com.macitbetter.betterzip.savedState'\n" + "e9cb7e5b": "#!/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.macitbetter.betterzip'\nsudo rm -rf \"$APPDIR/BetterZip.app\"\ntrash $LOGGED_IN_USER '~/Library/Application Scripts/79RR9LPM2N.group.com.macitbetter.betterzip'\ntrash $LOGGED_IN_USER '~/Library/Application Scripts/79RR9LPM2N.group.com.macitbetter.betterzip-setapp'\ntrash $LOGGED_IN_USER '~/Library/Application Scripts/com.macitbetter.betterzip.Compress-with-BetterZip'\ntrash $LOGGED_IN_USER '~/Library/Application Scripts/com.macitbetter.betterzip.findersyncextension'\ntrash $LOGGED_IN_USER '~/Library/Application Scripts/com.macitbetter.betterzip.Quick-Look-Extension'\ntrash $LOGGED_IN_USER '~/Library/Application Support/com.apple.sharedfilelist/com.apple.LSSharedFileList.ApplicationRecentDocuments/com.macitbetter.betterzip.sfl*'\ntrash $LOGGED_IN_USER '~/Library/Application Support/com.macitbetter.betterzip'\ntrash $LOGGED_IN_USER '~/Library/Caches/com.apple.helpd/Generated/com.macitbetter.betterzip.help*'\ntrash $LOGGED_IN_USER '~/Library/Caches/com.macitbetter.betterzip'\ntrash $LOGGED_IN_USER '~/Library/Containers/com.macitbetter.betterzip.Compress-with-BetterZip'\ntrash $LOGGED_IN_USER '~/Library/Containers/com.macitbetter.betterzip.findersyncextension'\ntrash $LOGGED_IN_USER '~/Library/Containers/com.macitbetter.betterzip.Quick-Look-Extension'\ntrash $LOGGED_IN_USER '~/Library/Group Containers/79RR9LPM2N.group.com.macitbetter.betterzip'\ntrash $LOGGED_IN_USER '~/Library/Group Containers/79RR9LPM2N.group.com.macitbetter.betterzip-setapp'\ntrash $LOGGED_IN_USER '~/Library/HTTPStorages/com.macitbetter.betterzip'\ntrash $LOGGED_IN_USER '~/Library/Preferences/com.macitbetter.betterzip.plist'\ntrash $LOGGED_IN_USER '~/Library/Saved Application State/com.macitbetter.betterzip.savedState'\n" } } diff --git a/ee/maintained-apps/outputs/chatgpt/darwin.json b/ee/maintained-apps/outputs/chatgpt/darwin.json index b6764d0ae58..7d6934ddf41 100644 --- a/ee/maintained-apps/outputs/chatgpt/darwin.json +++ b/ee/maintained-apps/outputs/chatgpt/darwin.json @@ -1,16 +1,16 @@ { "versions": [ { - "version": "26.818.41705", + "version": "26.818.61809", "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.818.41705') < 0);", + "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'com.openai.chat' AND version_compare(bundle_short_version, '26.818.61809') < 0);", "open": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps a JOIN processes p ON substr(p.path, 1, LENGTH(a.path) + 1) = concat(a.path, '/') WHERE a.bundle_identifier = 'com.openai.chat');" }, - "installer_url": "https://persistent.oaistatic.com/codex-app-prod/ChatGPT-darwin-arm64-26.818.41705.zip", + "installer_url": "https://persistent.oaistatic.com/codex-app-prod/ChatGPT-darwin-arm64-26.818.61809.zip", "install_script_ref": "cbce2d7d", "uninstall_script_ref": "678e6cf0", - "sha256": "522536a3ee61f404c24d462443dd131f4b0ebb74b77a33ea50d8d2354b386eff", + "sha256": "36a4c47d0bdee76710c0989b9b077f3c3e88bc0ba452469b86c811cc638a00bc", "default_categories": [ "Productivity" ] diff --git a/ee/maintained-apps/outputs/coconutbattery/darwin.json b/ee/maintained-apps/outputs/coconutbattery/darwin.json index 76951bfe734..630c055e4cb 100644 --- a/ee/maintained-apps/outputs/coconutbattery/darwin.json +++ b/ee/maintained-apps/outputs/coconutbattery/darwin.json @@ -9,7 +9,7 @@ }, "installer_url": "https://www.coconut-flavour.com/downloads/coconutBattery_434_224.zip", "install_script_ref": "f4ca6863", - "uninstall_script_ref": "9f8bee69", + "uninstall_script_ref": "4bf3cb18", "sha256": "7eb936629795e2577a44494a04899abedfbdae5630fcc5d06ca9868a390bfffb", "default_categories": [ "Utilities" @@ -17,7 +17,7 @@ } ], "refs": { - "9f8bee69": "#!/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\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\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.coconut-flavour.coconutBattery-Menu'\nquit_application 'com.coconut-flavour.coconutBattery-Menu'\nsudo rm -rf \"$APPDIR/coconutBattery.app\"\ntrash $LOGGED_IN_USER '~/Library/Application Support/coconutBattery'\ntrash $LOGGED_IN_USER '~/Library/Caches/com.coconut-flavour.coconutBattery*'\ntrash $LOGGED_IN_USER '~/Library/Group Containers/*.coconut-flavour.coconutBattery'\ntrash $LOGGED_IN_USER '~/Library/Preferences/com.coconut-flavour.coconutBattery-Menu.plist'\ntrash $LOGGED_IN_USER '~/Library/Preferences/com.coconut-flavour.coconutBattery.plist'\ntrash $LOGGED_IN_USER '~/Library/Saved Application State/com.coconut-flavour.coconutBattery.savedState'\n", + "4bf3cb18": "#!/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\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\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.coconut-flavour.coconutBattery-Menu'\nquit_application 'com.coconut-flavour.coconutBattery-Menu'\nsudo rm -rf \"$APPDIR/coconutBattery.app\"\ntrash $LOGGED_IN_USER '~/Library/Application Scripts/R5SC3K86L5.com.coconut-flavour.coconutBattery'\ntrash $LOGGED_IN_USER '~/Library/Application Support/coconutBattery'\ntrash $LOGGED_IN_USER '~/Library/Application Support/com.apple.sharedfilelist/com.apple.LSSharedFileList.ApplicationRecentDocuments/com.coconut-flavour.coconutbattery.sfl*'\ntrash $LOGGED_IN_USER '~/Library/Caches/com.coconut-flavour.coconutBattery*'\ntrash $LOGGED_IN_USER '~/Library/Group Containers/*.coconut-flavour.coconutBattery'\ntrash $LOGGED_IN_USER '~/Library/Preferences/com.coconut-flavour.coconutBattery-Menu.plist'\ntrash $LOGGED_IN_USER '~/Library/Preferences/com.coconut-flavour.coconutBattery.plist'\ntrash $LOGGED_IN_USER '~/Library/Saved Application State/com.coconut-flavour.coconutBattery.savedState'\ntrash $LOGGED_IN_USER '~/Library/WebKit/com.coconut-flavour.coconutBattery'\n", "f4ca6863": "#!/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.coconut-flavour.coconutBattery-Menu'\nif [ -d \"$APPDIR/coconutBattery.app\" ]; then\n\tsudo mv \"$APPDIR/coconutBattery.app\" \"$TMPDIR/coconutBattery.app.bkp\" || exit $?\nfi\nif ! sudo cp -R \"$TMPDIR/coconutBattery.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/coconutBattery.app\"\n\tif [ -d \"$TMPDIR/coconutBattery.app.bkp\" ]; then\n\t\tsudo mv \"$TMPDIR/coconutBattery.app.bkp\" \"$APPDIR/coconutBattery.app\"\n\tfi\n\texit 1\nfi\nrelaunch_application 'com.coconut-flavour.coconutBattery-Menu'\n" } } diff --git a/ee/maintained-apps/outputs/codexbar/darwin.json b/ee/maintained-apps/outputs/codexbar/darwin.json index e542834a242..f7d1abc9b19 100644 --- a/ee/maintained-apps/outputs/codexbar/darwin.json +++ b/ee/maintained-apps/outputs/codexbar/darwin.json @@ -1,16 +1,16 @@ { "versions": [ { - "version": "0.54.1", + "version": "0.55.0", "queries": { "exists": "SELECT 1 FROM apps WHERE bundle_identifier = 'com.steipete.codexbar';", - "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'com.steipete.codexbar' AND version_compare(bundle_short_version, '0.54.1') < 0);", + "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'com.steipete.codexbar' AND version_compare(bundle_short_version, '0.55.0') < 0);", "open": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps a JOIN processes p ON substr(p.path, 1, LENGTH(a.path) + 1) = concat(a.path, '/') WHERE a.bundle_identifier = 'com.steipete.codexbar');" }, - "installer_url": "https://github.com/steipete/CodexBar/releases/download/v0.54.1/CodexBar-macos-universal-0.54.1.zip", + "installer_url": "https://github.com/steipete/CodexBar/releases/download/v0.55.0/CodexBar-macos-universal-0.55.0.zip", "install_script_ref": "6993c93e", "uninstall_script_ref": "efcab822", - "sha256": "b9bd49b356b6a193d8b556302d1b31c7c4d7682ecb6347b0d73309e778fdd6ce", + "sha256": "161c587e41c5fcae456b4b05d754e403c6f8651f58a17ce1a7b6d929b0cd3669", "default_categories": [ "Utilities" ] diff --git a/ee/maintained-apps/outputs/cork/darwin.json b/ee/maintained-apps/outputs/cork/darwin.json index 24623844a3b..01f591a91e0 100644 --- a/ee/maintained-apps/outputs/cork/darwin.json +++ b/ee/maintained-apps/outputs/cork/darwin.json @@ -9,7 +9,7 @@ }, "installer_url": "https://corkmac.app/RLS/2.0.0/Cork.zip", "install_script_ref": "fc75a6be", - "uninstall_script_ref": "7eaad5b0", + "uninstall_script_ref": "821586b0", "sha256": "5ea636f386d836b4cf1d6ecb934a00ac03dde520c96d290a5ff8e1a1c0ccc0dc", "default_categories": [ "Productivity" @@ -17,7 +17,7 @@ } ], "refs": { - "7eaad5b0": "#!/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 'eu.davidbures.cork'\nsudo rm -rf \"$APPDIR/Cork.app\"\ntrash $LOGGED_IN_USER '~/Documents/Cork'\ntrash $LOGGED_IN_USER '~/Library/Caches/com.davidbures.cork'\ntrash $LOGGED_IN_USER '~/Library/HTTPStorages/com.davidbures.cork'\ntrash $LOGGED_IN_USER '~/Library/Preferences/com.davidbures.cork.plist'\ntrash $LOGGED_IN_USER '~/Library/Saved Application State/com.davidbures.cork.savedState'\n", + "821586b0": "#!/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 'eu.davidbures.cork'\nsudo rm -rf \"$APPDIR/Cork.app\"\ntrash $LOGGED_IN_USER '~/Documents/Cork'\ntrash $LOGGED_IN_USER '~/Library/Application Support/Cork'\ntrash $LOGGED_IN_USER '~/Library/Caches/com.davidbures.cork'\ntrash $LOGGED_IN_USER '~/Library/Caches/eu.davidbures.cork'\ntrash $LOGGED_IN_USER '~/Library/HTTPStorages/com.davidbures.cork'\ntrash $LOGGED_IN_USER '~/Library/HTTPStorages/eu.davidbures.cork'\ntrash $LOGGED_IN_USER '~/Library/Preferences/com.davidbures.cork.plist'\ntrash $LOGGED_IN_USER '~/Library/Preferences/eu.davidbures.cork.plist'\ntrash $LOGGED_IN_USER '~/Library/Saved Application State/com.davidbures.cork.savedState'\n", "fc75a6be": "#!/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.davidbures.cork'\nif [ -d \"$APPDIR/Cork.app\" ]; then\n\tsudo mv \"$APPDIR/Cork.app\" \"$TMPDIR/Cork.app.bkp\" || exit $?\nfi\nif ! sudo cp -R \"$TMPDIR/Cork.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/Cork.app\"\n\tif [ -d \"$TMPDIR/Cork.app.bkp\" ]; then\n\t\tsudo mv \"$TMPDIR/Cork.app.bkp\" \"$APPDIR/Cork.app\"\n\tfi\n\texit 1\nfi\nrelaunch_application 'com.davidbures.cork'\n" } } diff --git a/ee/maintained-apps/outputs/docker-desktop/darwin.json b/ee/maintained-apps/outputs/docker-desktop/darwin.json index b7a3cd410b4..0c80ce73633 100644 --- a/ee/maintained-apps/outputs/docker-desktop/darwin.json +++ b/ee/maintained-apps/outputs/docker-desktop/darwin.json @@ -1,16 +1,16 @@ { "versions": [ { - "version": "4.87.0", + "version": "4.88.0", "queries": { "exists": "SELECT 1 FROM apps WHERE bundle_identifier = 'com.docker.docker';", - "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'com.docker.docker' AND path NOT LIKE '%.back%' AND version_compare(bundle_short_version, '4.87.0') < 0);", + "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'com.docker.docker' AND path NOT LIKE '%.back%' AND version_compare(bundle_short_version, '4.88.0') < 0);", "open": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps a JOIN processes p ON substr(p.path, 1, LENGTH(a.path) + 1) = concat(a.path, '/') WHERE a.bundle_identifier = 'com.docker.docker');" }, - "installer_url": "https://desktop.docker.com/mac/main/arm64/236836/Docker.dmg", + "installer_url": "https://desktop.docker.com/mac/main/arm64/237115/Docker.dmg", "install_script_ref": "4afb9744", "uninstall_script_ref": "ba7543f2", - "sha256": "33f548260bfbb6619091ff56a822ac0d28375ab5bce35b58a4773f6eadbcfcb4", + "sha256": "1651abab9cda5b8088e02740815e38a112140e304b87dd682509ba1bf7f8b036", "default_categories": [ "Developer tools" ] diff --git a/ee/maintained-apps/outputs/docker/windows.json b/ee/maintained-apps/outputs/docker/windows.json index 57dc89967a1..65f305c64d9 100644 --- a/ee/maintained-apps/outputs/docker/windows.json +++ b/ee/maintained-apps/outputs/docker/windows.json @@ -1,16 +1,16 @@ { "versions": [ { - "version": "4.87.0", + "version": "4.88.0", "queries": { "exists": "SELECT 1 FROM programs WHERE name = 'Docker Desktop' AND publisher = 'Docker Inc.';", - "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM programs WHERE name = 'Docker Desktop' AND publisher = 'Docker Inc.' AND version_compare(version, '4.87.0') < 0);", + "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM programs WHERE name = 'Docker Desktop' AND publisher = 'Docker Inc.' AND version_compare(version, '4.88.0') < 0);", "open": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM processes WHERE LOWER(name) = 'docker desktop.exe');" }, - "installer_url": "https://desktop.docker.com/win/main/amd64/236836/Docker%20Desktop%20Installer.exe", + "installer_url": "https://desktop.docker.com/win/main/amd64/237115/Docker%20Desktop%20Installer.exe", "install_script_ref": "b06042dd", "uninstall_script_ref": "0b74af50", - "sha256": "9ac03d4e900c0fdee981d4bde083a55fdfb28ffba2cae77726eff2a437254822", + "sha256": "53bd0193c96dfa81a25c5f4ae4f6d5143c4165d282287630c72ea5fe6025007b", "default_categories": [ "Developer tools" ] diff --git a/ee/maintained-apps/outputs/drawio/darwin.json b/ee/maintained-apps/outputs/drawio/darwin.json index 28fac030452..eacc7c456a9 100644 --- a/ee/maintained-apps/outputs/drawio/darwin.json +++ b/ee/maintained-apps/outputs/drawio/darwin.json @@ -9,7 +9,7 @@ }, "installer_url": "https://github.com/jgraph/drawio-desktop/releases/download/v31.3.2/draw.io-arm64-31.3.2.dmg", "install_script_ref": "dfbabf21", - "uninstall_script_ref": "a088fe93", + "uninstall_script_ref": "870cb348", "sha256": "b6eda7e82bc09454274c03533bce30de170dfdee278ddf5e3c966d021fa16aee", "default_categories": [ "Productivity" @@ -17,7 +17,7 @@ } ], "refs": { - "a088fe93": "#!/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/draw.io.app\"\ntrash $LOGGED_IN_USER '~/Library/Application Support/draw.io'\ntrash $LOGGED_IN_USER '~/Library/Caches/com.jgraph.drawio.desktop'\ntrash $LOGGED_IN_USER '~/Library/Caches/com.jgraph.drawio.desktop.ShipIt'\ntrash $LOGGED_IN_USER '~/Library/Caches/draw.io-updater'\ntrash $LOGGED_IN_USER '~/Library/HTTPStorages/com.jgraph.drawio.desktop'\ntrash $LOGGED_IN_USER '~/Library/Logs/draw.io'\ntrash $LOGGED_IN_USER '~/Library/Preferences/ByHost/com.jgraph.drawio.desktop.ShipIt.*.plist'\ntrash $LOGGED_IN_USER '~/Library/Preferences/com.jgraph.drawio.desktop.helper.plist'\ntrash $LOGGED_IN_USER '~/Library/Preferences/com.jgraph.drawio.desktop.plist'\ntrash $LOGGED_IN_USER '~/Library/Saved Application State/com.jgraph.drawio.desktop.savedState'\ntrash $LOGGED_IN_USER '~/Library/WebKit/com.jgraph.drawio.desktop'\n", + "870cb348": "#!/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/draw.io.app\"\ntrash $LOGGED_IN_USER '~/Library/Application Scripts/com.jgraph.drawio.desktop.PreviewExtension'\ntrash $LOGGED_IN_USER '~/Library/Application Support/com.apple.sharedfilelist/com.apple.LSSharedFileList.ApplicationRecentDocuments/com.jgraph.drawio.desktop.sfl*'\ntrash $LOGGED_IN_USER '~/Library/Application Support/draw.io'\ntrash $LOGGED_IN_USER '~/Library/Caches/com.jgraph.drawio.desktop'\ntrash $LOGGED_IN_USER '~/Library/Caches/com.jgraph.drawio.desktop.ShipIt'\ntrash $LOGGED_IN_USER '~/Library/Caches/draw.io-updater'\ntrash $LOGGED_IN_USER '~/Library/Containers/com.jgraph.drawio.desktop.PreviewExtension'\ntrash $LOGGED_IN_USER '~/Library/HTTPStorages/com.jgraph.drawio.desktop'\ntrash $LOGGED_IN_USER '~/Library/Logs/draw.io'\ntrash $LOGGED_IN_USER '~/Library/Preferences/ByHost/com.jgraph.drawio.desktop.ShipIt.*.plist'\ntrash $LOGGED_IN_USER '~/Library/Preferences/com.jgraph.drawio.desktop.helper.plist'\ntrash $LOGGED_IN_USER '~/Library/Preferences/com.jgraph.drawio.desktop.plist'\ntrash $LOGGED_IN_USER '~/Library/Saved Application State/com.jgraph.drawio.desktop.savedState'\ntrash $LOGGED_IN_USER '~/Library/WebKit/com.jgraph.drawio.desktop'\n", "dfbabf21": "#!/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 'com.jgraph.drawio.desktop'\nif [ -d \"$APPDIR/draw.io.app\" ]; then\n\tsudo mv \"$APPDIR/draw.io.app\" \"$TMPDIR/draw.io.app.bkp\" || exit $?\nfi\nif ! sudo cp -R \"$TMPDIR/draw.io.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/draw.io.app\"\n\tif [ -d \"$TMPDIR/draw.io.app.bkp\" ]; then\n\t\tsudo mv \"$TMPDIR/draw.io.app.bkp\" \"$APPDIR/draw.io.app\"\n\tfi\n\texit 1\nfi\nrelaunch_application 'com.jgraph.drawio.desktop'\n" } } diff --git a/ee/maintained-apps/outputs/drofus/windows.json b/ee/maintained-apps/outputs/drofus/windows.json index 2bb906032d1..486948746de 100644 --- a/ee/maintained-apps/outputs/drofus/windows.json +++ b/ee/maintained-apps/outputs/drofus/windows.json @@ -1,16 +1,16 @@ { "versions": [ { - "version": "2.18.14.0", + "version": "2.18.15.0", "queries": { "exists": "SELECT 1 FROM programs WHERE name LIKE 'dRofus %' AND publisher = 'dRofus AS';", - "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM programs WHERE name LIKE 'dRofus %' AND publisher = 'dRofus AS' AND version_compare(version, '2.18.14.0') < 0);", + "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM programs WHERE name LIKE 'dRofus %' AND publisher = 'dRofus AS' AND version_compare(version, '2.18.15.0') < 0);", "open": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM processes WHERE LOWER(name) = 'drofus.exe');" }, - "installer_url": "https://deploy.drofus.com/stable/drofus-setup-2.18.14.msi", + "installer_url": "https://deploy.drofus.com/stable/drofus-setup-2.18.15.msi", "install_script_ref": "22e48c46", "uninstall_script_ref": "72356dd1", - "sha256": "3b3e200b11518d2256de001a46e27f60ef7b267456d9833516c4298ba2383251", + "sha256": "3a4336f144911fade2494718bd1be96543bd36ec5ab7bc32a943f64fb7829e41", "default_categories": [ "Productivity" ], diff --git a/ee/maintained-apps/outputs/duckduckgo/darwin.json b/ee/maintained-apps/outputs/duckduckgo/darwin.json index aacdec58076..110ba80c338 100644 --- a/ee/maintained-apps/outputs/duckduckgo/darwin.json +++ b/ee/maintained-apps/outputs/duckduckgo/darwin.json @@ -1,16 +1,16 @@ { "versions": [ { - "version": "1.203.0", + "version": "1.204.0", "queries": { "exists": "SELECT 1 FROM apps WHERE bundle_identifier = 'com.duckduckgo.macos.browser';", - "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'com.duckduckgo.macos.browser' AND version_compare(bundle_short_version, '1.203.0') < 0);", + "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'com.duckduckgo.macos.browser' AND version_compare(bundle_short_version, '1.204.0') < 0);", "open": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps a JOIN processes p ON substr(p.path, 1, LENGTH(a.path) + 1) = concat(a.path, '/') WHERE a.bundle_identifier = 'com.duckduckgo.macos.browser');" }, - "installer_url": "https://staticcdn.duckduckgo.com/macos-desktop-browser/duckduckgo-1.203.0.786.dmg", + "installer_url": "https://staticcdn.duckduckgo.com/macos-desktop-browser/duckduckgo-1.204.0.797.dmg", "install_script_ref": "18fb46ca", "uninstall_script_ref": "b5d499ac", - "sha256": "450aeafcb5314ef05de0a0a305ba221e24ee4db4539042ce87a6478a11b6dc8d", + "sha256": "c2a59a26308ef8fe7e75de0c0056242800a08b68f5e1215d9b67908d40b681ff", "default_categories": [ "Browsers" ] diff --git a/ee/maintained-apps/outputs/eclipse-temurin-jdk-17/windows.json b/ee/maintained-apps/outputs/eclipse-temurin-jdk-17/windows.json index 76e7424a086..c4aefc355d8 100644 --- a/ee/maintained-apps/outputs/eclipse-temurin-jdk-17/windows.json +++ b/ee/maintained-apps/outputs/eclipse-temurin-jdk-17/windows.json @@ -1,16 +1,16 @@ { "versions": [ { - "version": "17.0.20.8", + "version": "17.0.20.101", "queries": { "exists": "SELECT 1 FROM programs WHERE name LIKE 'Eclipse Temurin JDK%' AND publisher = 'Eclipse Adoptium' AND version LIKE '17.%';", - "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM programs WHERE name LIKE 'Eclipse Temurin JDK%' AND publisher = 'Eclipse Adoptium' AND version LIKE '17.%' AND version_compare(version, '17.0.20.8') < 0);", + "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM programs WHERE name LIKE 'Eclipse Temurin JDK%' AND publisher = 'Eclipse Adoptium' AND version LIKE '17.%' AND version_compare(version, '17.0.20.101') < 0);", "open": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM processes WHERE LOWER(name) = 'eclipse temurin jdk 17.exe');" }, - "installer_url": "https://github.com/adoptium/temurin17-binaries/releases/download/jdk-17.0.20+8/OpenJDK17U-jdk_x64_windows_hotspot_17.0.20_8.msi", + "installer_url": "https://github.com/adoptium/temurin17-binaries/releases/download/jdk-17.0.20.1+1/OpenJDK17U-jdk_x64_windows_hotspot_17.0.20.1_1.msi", "install_script_ref": "22e48c46", "uninstall_script_ref": "a8451a5d", - "sha256": "1a8ec6023937b94e26691a2369e9f99dfeae3a25351a7e4f9320828aae481898", + "sha256": "a6013774c5e4a34951e11c1997d8b4641d2de7736d3eac839231f4266bd1116f", "default_categories": [ "Developer tools" ], diff --git a/ee/maintained-apps/outputs/eclipse-temurin-jre-17/windows.json b/ee/maintained-apps/outputs/eclipse-temurin-jre-17/windows.json index 0ad579cdf8c..7270311695f 100644 --- a/ee/maintained-apps/outputs/eclipse-temurin-jre-17/windows.json +++ b/ee/maintained-apps/outputs/eclipse-temurin-jre-17/windows.json @@ -1,16 +1,16 @@ { "versions": [ { - "version": "17.0.20.8", + "version": "17.0.20.101", "queries": { "exists": "SELECT 1 FROM programs WHERE name LIKE 'Eclipse Temurin JRE%' AND publisher = 'Eclipse Adoptium' AND version LIKE '17.%';", - "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM programs WHERE name LIKE 'Eclipse Temurin JRE%' AND publisher = 'Eclipse Adoptium' AND version LIKE '17.%' AND version_compare(version, '17.0.20.8') < 0);", + "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM programs WHERE name LIKE 'Eclipse Temurin JRE%' AND publisher = 'Eclipse Adoptium' AND version LIKE '17.%' AND version_compare(version, '17.0.20.101') < 0);", "open": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM processes WHERE LOWER(name) = 'eclipse temurin jre 17.exe');" }, - "installer_url": "https://github.com/adoptium/temurin17-binaries/releases/download/jdk-17.0.20+8/OpenJDK17U-jre_x64_windows_hotspot_17.0.20_8.msi", + "installer_url": "https://github.com/adoptium/temurin17-binaries/releases/download/jdk-17.0.20.1+1/OpenJDK17U-jre_x64_windows_hotspot_17.0.20.1_1.msi", "install_script_ref": "22e48c46", "uninstall_script_ref": "98e1299b", - "sha256": "45ca8db42fb8bbfbf35b68121cf74e1f9fe36ba982b59d38f0da7802902fbace", + "sha256": "fd45e1710b0fe80c08a5141109cc0128e45cefe8c15c3639ce13c564df634031", "default_categories": [ "Developer tools" ], diff --git a/ee/maintained-apps/outputs/firefox@nightly/darwin.json b/ee/maintained-apps/outputs/firefox@nightly/darwin.json index 2f6df501807..2781b3d5aa7 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, '15626.8.23') < 0);", "open": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps a JOIN processes p ON substr(p.path, 1, LENGTH(a.path) + 1) = concat(a.path, '/') WHERE a.bundle_identifier = 'org.mozilla.nightly');" }, - "installer_url": "https://ftp.mozilla.org/pub/firefox/nightly/2026/08/2026-08-23-09-42-36-mozilla-central/firefox-156.0a1.en-US.mac.dmg", + "installer_url": "https://ftp.mozilla.org/pub/firefox/nightly/2026/08/2026-08-23-21-38-25-mozilla-central/firefox-156.0a1.en-US.mac.dmg", "install_script_ref": "d9c4cf87", "uninstall_script_ref": "0661f848", - "sha256": "7df2b64c184409d7a23d5f7a248299f06ae016444c431b40ea66c62801ff0f91", + "sha256": "0285f856d70363ac282972df8f47530c92a1f889089fb067ec21637671abba49", "default_categories": [ "Browsers" ] diff --git a/ee/maintained-apps/outputs/gitify/darwin.json b/ee/maintained-apps/outputs/gitify/darwin.json index af31bf773fe..0851780e2f6 100644 --- a/ee/maintained-apps/outputs/gitify/darwin.json +++ b/ee/maintained-apps/outputs/gitify/darwin.json @@ -1,16 +1,16 @@ { "versions": [ { - "version": "7.4.0", + "version": "7.5.0", "queries": { "exists": "SELECT 1 FROM apps WHERE bundle_identifier = 'com.electron.gitify';", - "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'com.electron.gitify' AND version_compare(bundle_short_version, '7.4.0') < 0);", + "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'com.electron.gitify' AND version_compare(bundle_short_version, '7.5.0') < 0);", "open": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps a JOIN processes p ON substr(p.path, 1, LENGTH(a.path) + 1) = concat(a.path, '/') WHERE a.bundle_identifier = 'com.electron.gitify');" }, - "installer_url": "https://github.com/gitify-app/gitify/releases/download/v7.4.0/Gitify-7.4.0-universal-mac.zip", + "installer_url": "https://github.com/gitify-app/gitify/releases/download/v7.5.0/Gitify-7.5.0-universal-mac.zip", "install_script_ref": "335acee0", "uninstall_script_ref": "33618979", - "sha256": "e7058a71ebe94391254430a2dde90c9f5a84dbe1b37358fae5fc2a33ee06d327", + "sha256": "e23c3c8d553b54b0e979f1b15de60b7bd76b04b107d7d6eaa96880e46bdabab8", "default_categories": [ "Utilities" ] diff --git a/ee/maintained-apps/outputs/glyphs/darwin.json b/ee/maintained-apps/outputs/glyphs/darwin.json index eaa821bccaf..4d63077ee95 100644 --- a/ee/maintained-apps/outputs/glyphs/darwin.json +++ b/ee/maintained-apps/outputs/glyphs/darwin.json @@ -7,10 +7,10 @@ "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'com.GeorgSeifert.Glyphs3' AND version_compare(bundle_short_version, '3.5') < 0);", "open": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps a JOIN processes p ON substr(p.path, 1, LENGTH(a.path) + 1) = concat(a.path, '/') WHERE a.bundle_identifier = 'com.GeorgSeifert.Glyphs3');" }, - "installer_url": "https://updates.glyphsapp.com/Glyphs3.5-3531.zip", + "installer_url": "https://updates.glyphsapp.com/Glyphs3.5-3532.zip", "install_script_ref": "82042f03", - "uninstall_script_ref": "b1245f10", - "sha256": "1f8b0de72f1d6c10c5ab93994fcf01db148b2c896fff11e80b379abb77b42c66", + "uninstall_script_ref": "8ea562f0", + "sha256": "2fcd7bdf88f022c8718269b18438cf9270163599af9b18a72e1faa51566e5c36", "default_categories": [ "Productivity" ] @@ -18,6 +18,6 @@ ], "refs": { "82042f03": "#!/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.GeorgSeifert.Glyphs3'\nif [ -d \"$APPDIR/Glyphs 3.app\" ]; then\n\tsudo mv \"$APPDIR/Glyphs 3.app\" \"$TMPDIR/Glyphs 3.app.bkp\" || exit $?\nfi\nif ! sudo cp -R \"$TMPDIR/Glyphs 3.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/Glyphs 3.app\"\n\tif [ -d \"$TMPDIR/Glyphs 3.app.bkp\" ]; then\n\t\tsudo mv \"$TMPDIR/Glyphs 3.app.bkp\" \"$APPDIR/Glyphs 3.app\"\n\tfi\n\texit 1\nfi\nrelaunch_application 'com.GeorgSeifert.Glyphs3'\n", - "b1245f10": "#!/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/Glyphs 3.app\"\ntrash $LOGGED_IN_USER '~/Library/Application Support/com.apple.sharedfilelist/com.apple.LSSharedFileList.ApplicationRecentDocuments/com.georgseifert.glyphs3.sfl*'\ntrash $LOGGED_IN_USER '~/Library/Application Support/com.GeorgSeifert.Glyphs3'\ntrash $LOGGED_IN_USER '~/Library/Application Support/Glyphs'\ntrash $LOGGED_IN_USER '~/Library/Caches/com.apple.helpd/SDMHelpData/Other/English/HelpSDMIndexFile/com.GeorgSeifert.Glyphs3.help*'\ntrash $LOGGED_IN_USER '~/Library/Preferences/com.GeorgSeifert.Glyphs3.plist'\n" + "8ea562f0": "#!/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.GeorgSeifert.Glyphs3'\nsudo rm -rf \"$APPDIR/Glyphs 3.app\"\ntrash $LOGGED_IN_USER '~/Library/Application Support/com.apple.sharedfilelist/com.apple.LSSharedFileList.ApplicationRecentDocuments/com.georgseifert.glyphs3.sfl*'\ntrash $LOGGED_IN_USER '~/Library/Application Support/com.GeorgSeifert.Glyphs3'\ntrash $LOGGED_IN_USER '~/Library/Application Support/Glyphs'\ntrash $LOGGED_IN_USER '~/Library/Caches/com.apple.helpd/SDMHelpData/Other/English/HelpSDMIndexFile/com.GeorgSeifert.Glyphs3.help*'\ntrash $LOGGED_IN_USER '~/Library/Preferences/com.GeorgSeifert.Glyphs3.plist'\n" } } diff --git a/ee/maintained-apps/outputs/jabra-direct/darwin.json b/ee/maintained-apps/outputs/jabra-direct/darwin.json index c3a1a9d809e..81d9f15776a 100644 --- a/ee/maintained-apps/outputs/jabra-direct/darwin.json +++ b/ee/maintained-apps/outputs/jabra-direct/darwin.json @@ -1,10 +1,10 @@ { "versions": [ { - "version": "8.1.14601", + "version": "8.2.23201", "queries": { "exists": "SELECT 1 FROM apps WHERE bundle_identifier = 'com.jabra.directonline';", - "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'com.jabra.directonline' AND version_compare(bundle_short_version, '8.1.14601') < 0);", + "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'com.jabra.directonline' AND version_compare(bundle_short_version, '8.2.23201') < 0);", "open": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps a JOIN processes p ON substr(p.path, 1, LENGTH(a.path) + 1) = concat(a.path, '/') WHERE a.bundle_identifier = 'com.jabra.directonline');" }, "installer_url": "https://jabraxpressonlineprdstor.blob.core.windows.net/jdo/JabraDirectSetup.dmg", diff --git a/ee/maintained-apps/outputs/keyboardcleantool/darwin.json b/ee/maintained-apps/outputs/keyboardcleantool/darwin.json index a662c2af10c..cc8b0bf0589 100644 --- a/ee/maintained-apps/outputs/keyboardcleantool/darwin.json +++ b/ee/maintained-apps/outputs/keyboardcleantool/darwin.json @@ -1,16 +1,16 @@ { "versions": [ { - "version": "7", + "version": "8.1", "queries": { "exists": "SELECT 1 FROM apps WHERE bundle_identifier = 'com.hegenberg.KeyboardCleanTool';", - "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'com.hegenberg.KeyboardCleanTool' AND version_compare(bundle_short_version, '7') < 0);", + "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'com.hegenberg.KeyboardCleanTool' AND version_compare(bundle_short_version, '8.1') < 0);", "open": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps a JOIN processes p ON substr(p.path, 1, LENGTH(a.path) + 1) = concat(a.path, '/') WHERE a.bundle_identifier = 'com.hegenberg.KeyboardCleanTool');" }, - "installer_url": "https://folivora.ai/releases/KeyboardCleanTool.zip", + "installer_url": "https://folivora.ai/releases/KeyboardCleanTool-8.1.zip", "install_script_ref": "5082bf17", "uninstall_script_ref": "4fb4840e", - "sha256": "no_check", + "sha256": "1c5f6b20021235031323c2d7398fdc3a5e47f27e9671e8a81714ac408912a8e0", "default_categories": [ "Productivity" ] diff --git a/ee/maintained-apps/outputs/keystore-explorer/darwin.json b/ee/maintained-apps/outputs/keystore-explorer/darwin.json index 65ac885eeef..1a84df83e6a 100644 --- a/ee/maintained-apps/outputs/keystore-explorer/darwin.json +++ b/ee/maintained-apps/outputs/keystore-explorer/darwin.json @@ -1,16 +1,16 @@ { "versions": [ { - "version": "5.6.1", + "version": "5.7.0", "queries": { "exists": "SELECT 1 FROM apps WHERE bundle_identifier = 'org.kse.keystore-explorer';", - "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'org.kse.keystore-explorer' AND version_compare(bundle_short_version, '5.6.1') < 0);", + "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'org.kse.keystore-explorer' AND version_compare(bundle_short_version, '5.7.0') < 0);", "open": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps a JOIN processes p ON substr(p.path, 1, LENGTH(a.path) + 1) = concat(a.path, '/') WHERE a.bundle_identifier = 'org.kse.keystore-explorer');" }, - "installer_url": "https://github.com/kaikramer/keystore-explorer/releases/download/v5.6.1/kse-561-arm64.dmg", + "installer_url": "https://github.com/kaikramer/keystore-explorer/releases/download/v5.7.0/kse-570-arm64.dmg", "install_script_ref": "cfac5836", "uninstall_script_ref": "6d59af2d", - "sha256": "693e325e59173a14a1aedf4eb581ed24b6ddb0e8bb4037893312606eb23fab7b", + "sha256": "59ffae1f70f3e4a2eb6d25b4169ee8b7b528d5638dec27b2b60a3287b61f0499", "default_categories": [ "Productivity" ] diff --git a/ee/maintained-apps/outputs/local/darwin.json b/ee/maintained-apps/outputs/local/darwin.json index e2c645f85e1..73279e75619 100644 --- a/ee/maintained-apps/outputs/local/darwin.json +++ b/ee/maintained-apps/outputs/local/darwin.json @@ -1,16 +1,16 @@ { "versions": [ { - "version": "10.1.1", + "version": "10.1.2", "queries": { "exists": "SELECT 1 FROM apps WHERE bundle_identifier = 'com.getflywheel.lightning.local';", - "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'com.getflywheel.lightning.local' AND version_compare(bundle_short_version, '10.1.1') < 0);", + "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'com.getflywheel.lightning.local' AND version_compare(bundle_short_version, '10.1.2') < 0);", "open": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps a JOIN processes p ON substr(p.path, 1, LENGTH(a.path) + 1) = concat(a.path, '/') WHERE a.bundle_identifier = 'com.getflywheel.lightning.local');" }, - "installer_url": "https://cdn.localwp.com/releases-stable/10.1.1+6939/local-10.1.1-mac-arm64.dmg", + "installer_url": "https://cdn.localwp.com/releases-stable/10.1.2+7004/local-10.1.2-mac-arm64.dmg", "install_script_ref": "c77001b6", "uninstall_script_ref": "4be78fce", - "sha256": "fda954e9384d87344c11c7b40556250ea6c5c6b1cd0d6715b41798185f58c185", + "sha256": "9507b0cf27637dedb65b5750f76da20c3a7723ebf91030c779e9211779af001c", "default_categories": [ "Productivity" ] diff --git a/ee/maintained-apps/outputs/microsoft-edge/darwin.json b/ee/maintained-apps/outputs/microsoft-edge/darwin.json index 590c79a7d20..9ef8ab5810f 100644 --- a/ee/maintained-apps/outputs/microsoft-edge/darwin.json +++ b/ee/maintained-apps/outputs/microsoft-edge/darwin.json @@ -1,16 +1,16 @@ { "versions": [ { - "version": "151.0.4129.101", + "version": "151.0.4129.107", "queries": { "exists": "SELECT 1 FROM apps WHERE bundle_identifier = 'com.microsoft.edgemac';", - "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'com.microsoft.edgemac' AND version_compare(bundle_short_version, '151.0.4129.101') < 0);", + "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'com.microsoft.edgemac' AND version_compare(bundle_short_version, '151.0.4129.107') < 0);", "open": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps a JOIN processes p ON substr(p.path, 1, LENGTH(a.path) + 1) = concat(a.path, '/') WHERE a.bundle_identifier = 'com.microsoft.edgemac');" }, - "installer_url": "https://msedge.sf.dl.delivery.mp.microsoft.com/filestreamingservice/files/664c0246-6450-44a6-8785-20ce5da2bed8/MicrosoftEdge-151.0.4129.101.dmg", + "installer_url": "https://msedge.sf.dl.delivery.mp.microsoft.com/filestreamingservice/files/5b275fe0-778e-4df8-95d7-5edbc3a76abc/MicrosoftEdge-151.0.4129.107.dmg", "install_script_ref": "4c051c40", "uninstall_script_ref": "77fd5782", - "sha256": "ee559db9fe6d7fc60f89166a0b93044cf6efc77989e3976db176a9bffdde52e9", + "sha256": "3212a8c1775de46ef82fdd979adfb4da28b82678c85137b1a6ab96ea907e782f", "default_categories": [ "Browsers" ] diff --git a/ee/maintained-apps/outputs/microsoft-edge/windows.json b/ee/maintained-apps/outputs/microsoft-edge/windows.json index 547c8e095b4..6ab390f7e42 100644 --- a/ee/maintained-apps/outputs/microsoft-edge/windows.json +++ b/ee/maintained-apps/outputs/microsoft-edge/windows.json @@ -1,16 +1,16 @@ { "versions": [ { - "version": "151.0.4129.101", + "version": "151.0.4129.107", "queries": { "exists": "SELECT 1 FROM programs WHERE name = 'Microsoft Edge' AND publisher = 'Microsoft Corporation';", - "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM programs WHERE name = 'Microsoft Edge' AND publisher = 'Microsoft Corporation' AND version_compare(version, '151.0.4129.101') < 0);", + "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM programs WHERE name = 'Microsoft Edge' AND publisher = 'Microsoft Corporation' AND version_compare(version, '151.0.4129.107') < 0);", "open": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM processes WHERE LOWER(name) = 'msedge.exe');" }, - "installer_url": "https://msedge.sf.dl.delivery.mp.microsoft.com/filestreamingservice/files/d209ad46-3748-45ee-9a0f-826275ced29c/MicrosoftEdgeEnterpriseX64.msi", + "installer_url": "https://msedge.sf.dl.delivery.mp.microsoft.com/filestreamingservice/files/998bcf3d-e044-426d-9e9b-61da81399306/MicrosoftEdgeEnterpriseX64.msi", "install_script_ref": "22e48c46", "uninstall_script_ref": "e12e9902", - "sha256": "46dcccee1669f746dd527561cbd25e5b049333117a6996ba0ed9c14275656cef", + "sha256": "b75f03b87dfb0cbc85ba2c0858c632511b17355f42563a43fca5368100ffe0fe", "default_categories": [ "Browsers" ], diff --git a/ee/maintained-apps/outputs/notepadexe/darwin.json b/ee/maintained-apps/outputs/notepadexe/darwin.json index 03d8eaf8363..d118b3293b9 100644 --- a/ee/maintained-apps/outputs/notepadexe/darwin.json +++ b/ee/maintained-apps/outputs/notepadexe/darwin.json @@ -1,16 +1,16 @@ { "versions": [ { - "version": "1.5.17", + "version": "1.5.18", "queries": { "exists": "SELECT 1 FROM apps WHERE bundle_identifier = 'best.swift.Notepad';", - "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'best.swift.Notepad' AND version_compare(bundle_short_version, '1.5.17') < 0);", + "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'best.swift.Notepad' AND version_compare(bundle_short_version, '1.5.18') < 0);", "open": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps a JOIN processes p ON substr(p.path, 1, LENGTH(a.path) + 1) = concat(a.path, '/') WHERE a.bundle_identifier = 'best.swift.Notepad');" }, - "installer_url": "https://github.com/notepadhq/notepadexe-public/releases/download/1.5.17/Notepad.zip", + "installer_url": "https://github.com/notepadhq/notepadexe-public/releases/download/1.5.18/Notepad.zip", "install_script_ref": "7bdbf044", "uninstall_script_ref": "abe56690", - "sha256": "727b8e37abc51b846889c40f212a8c299658bf4250a70f19d98d4e982653e1fa", + "sha256": "64d59e588fea7cf3eff0b67c25c90fc5b7471f328e20b4fab0d96505060f703a", "default_categories": [ "Developer tools" ] diff --git a/ee/maintained-apps/outputs/omnissa-horizon-client/darwin.json b/ee/maintained-apps/outputs/omnissa-horizon-client/darwin.json index 4cc52afe834..8f0eaf149e5 100644 --- a/ee/maintained-apps/outputs/omnissa-horizon-client/darwin.json +++ b/ee/maintained-apps/outputs/omnissa-horizon-client/darwin.json @@ -1,16 +1,16 @@ { "versions": [ { - "version": "8.18.0", + "version": "8.19.0", "queries": { "exists": "SELECT 1 FROM apps WHERE bundle_identifier = 'com.omnissa.horizon.client.mac';", - "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'com.omnissa.horizon.client.mac' AND version_compare(bundle_short_version, '8.18.0') < 0);", + "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'com.omnissa.horizon.client.mac' AND version_compare(bundle_short_version, '8.19.0') < 0);", "open": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps a JOIN processes p ON substr(p.path, 1, LENGTH(a.path) + 1) = concat(a.path, '/') WHERE a.bundle_identifier = 'com.omnissa.horizon.client.mac');" }, - "installer_url": "https://download3.omnissa.com/software/CART27FQ1_MAC_2603/Omnissa-Horizon-Client-2603-8.18.0-24230061568.dmg", + "installer_url": "https://download3.omnissa.com/software/CART27FQ2_MAC_2606/Omnissa-Horizon-Client-2606-8.19.0-32216012208.dmg", "install_script_ref": "bc7a1a69", "uninstall_script_ref": "9ced4cfc", - "sha256": "303f3f302cfdad7765d6534ab00b557bb791f5bd3ee0c8e0352e72922cace75f", + "sha256": "decc052f456ba0909724c5e33c78f6fb9cc7d25adfd188af95c2993d46226c3f", "default_categories": [ "Productivity" ] diff --git a/ee/maintained-apps/outputs/omnissa-horizon-client/windows.json b/ee/maintained-apps/outputs/omnissa-horizon-client/windows.json index 7804aa2246f..5097d66bb8b 100644 --- a/ee/maintained-apps/outputs/omnissa-horizon-client/windows.json +++ b/ee/maintained-apps/outputs/omnissa-horizon-client/windows.json @@ -1,16 +1,16 @@ { "versions": [ { - "version": "8.18.0.51429", + "version": "8.19.0", "queries": { "exists": "SELECT 1 FROM programs WHERE name = 'Omnissa Horizon Client' AND publisher = 'Omnissa, LLC';", - "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM programs WHERE name = 'Omnissa Horizon Client' AND publisher = 'Omnissa, LLC' AND version_compare(version, '8.18.0.51429') < 0);", + "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM programs WHERE name = 'Omnissa Horizon Client' AND publisher = 'Omnissa, LLC' AND version_compare(version, '8.19.0') < 0);", "open": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM processes WHERE LOWER(name) = 'omnissa horizon client.exe');" }, - "installer_url": "https://download3.omnissa.com/software/CART27FQ1_WIN_2603/Omnissa-Horizon-Client-2603-8.18.0-24230927696.exe", + "installer_url": "https://download3.omnissa.com/software/CART27FQ2_WIN_2606/Omnissa-Horizon-Client-2606-8.19.0-32215845441.exe", "install_script_ref": "8bdcbfb2", "uninstall_script_ref": "c624ea6f", - "sha256": "32a2aa9fe766b329fb2eb50f0cf2946dab73e46fffe19b501993952e99aded25", + "sha256": "4e8e54385cd066da229e1f5ae15aad826e90088a351fc34e0bad048fa5b4aa00", "default_categories": [ "Productivity" ] diff --git a/ee/maintained-apps/outputs/openmtp/darwin.json b/ee/maintained-apps/outputs/openmtp/darwin.json index 48e79b80eff..aae5ea27ead 100644 --- a/ee/maintained-apps/outputs/openmtp/darwin.json +++ b/ee/maintained-apps/outputs/openmtp/darwin.json @@ -9,7 +9,7 @@ }, "installer_url": "https://github.com/ganeshrvel/openmtp/releases/download/v3.3.0/openmtp-3.3.0-mac-arm64.zip", "install_script_ref": "185c2d48", - "uninstall_script_ref": "9e24e1c9", + "uninstall_script_ref": "75aa257a", "sha256": "71c8ea9a7efa0a39bf443e56f79a88c2b2068d90d614761dc27584816d1f64ee", "default_categories": [ "Productivity" @@ -18,6 +18,6 @@ ], "refs": { "185c2d48": "#!/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 'io.ganeshrvel.openmtp'\nif [ -d \"$APPDIR/OpenMTP.app\" ]; then\n\tsudo mv \"$APPDIR/OpenMTP.app\" \"$TMPDIR/OpenMTP.app.bkp\" || exit $?\nfi\nif ! sudo cp -R \"$TMPDIR/OpenMTP.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/OpenMTP.app\"\n\tif [ -d \"$TMPDIR/OpenMTP.app.bkp\" ]; then\n\t\tsudo mv \"$TMPDIR/OpenMTP.app.bkp\" \"$APPDIR/OpenMTP.app\"\n\tfi\n\texit 1\nfi\nrelaunch_application 'io.ganeshrvel.openmtp'\n", - "9e24e1c9": "#!/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/OpenMTP.app\"\ntrash $LOGGED_IN_USER '~/.io.ganeshrvel'\ntrash $LOGGED_IN_USER '~/Library/Application Support/io.ganeshrvel.openmtp'\ntrash $LOGGED_IN_USER '~/Library/Application Support/OpenMTP'\ntrash $LOGGED_IN_USER '~/Library/Preferences/io.ganeshrvel.openmtp.plist'\n" + "75aa257a": "#!/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/OpenMTP.app\"\ntrash $LOGGED_IN_USER '~/.io.ganeshrvel'\ntrash $LOGGED_IN_USER '~/Library/Application Support/com.apple.sharedfilelist/com.apple.LSSharedFileList.ApplicationRecentDocuments/io.ganeshrvel.openmtp.sfl*'\ntrash $LOGGED_IN_USER '~/Library/Application Support/io.ganeshrvel.openmtp'\ntrash $LOGGED_IN_USER '~/Library/Application Support/OpenMTP'\ntrash $LOGGED_IN_USER '~/Library/Preferences/io.ganeshrvel.openmtp.plist'\n" } } diff --git a/ee/maintained-apps/outputs/picview/darwin.json b/ee/maintained-apps/outputs/picview/darwin.json index 8c1b564df16..2ebf49ca30e 100644 --- a/ee/maintained-apps/outputs/picview/darwin.json +++ b/ee/maintained-apps/outputs/picview/darwin.json @@ -1,16 +1,16 @@ { "versions": [ { - "version": "5.0.4", + "version": "5.0.5", "queries": { "exists": "SELECT 1 FROM apps WHERE bundle_identifier = 'com.ruben2776.picview';", - "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'com.ruben2776.picview' AND version_compare(bundle_short_version, '5.0.4') < 0);", + "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'com.ruben2776.picview' AND version_compare(bundle_short_version, '5.0.5') < 0);", "open": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps a JOIN processes p ON substr(p.path, 1, LENGTH(a.path) + 1) = concat(a.path, '/') WHERE a.bundle_identifier = 'com.ruben2776.picview');" }, - "installer_url": "https://github.com/Ruben2776/PicView/releases/download/5.0.4/PicView-5.0.4-macOS-arm64.dmg", + "installer_url": "https://github.com/Ruben2776/PicView/releases/download/5.0.5/PicView-5.0.5-macOS-arm64.dmg", "install_script_ref": "51eb5fcf", "uninstall_script_ref": "48e04b56", - "sha256": "75062fe241a29c3190beec107e9c06cfdf04efe7fb250da745e0af27684de195", + "sha256": "e1314f40af7c934dada129bf91403535f834d08a0213272702f3e34aad1ec938", "default_categories": [ "Productivity" ] diff --git a/ee/maintained-apps/outputs/postman/darwin.json b/ee/maintained-apps/outputs/postman/darwin.json index 0b571c79cdb..98ebf4261fb 100644 --- a/ee/maintained-apps/outputs/postman/darwin.json +++ b/ee/maintained-apps/outputs/postman/darwin.json @@ -1,16 +1,16 @@ { "versions": [ { - "version": "12.24.5", + "version": "12.25.1", "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.24.5') < 0);", + "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'com.postmanlabs.mac' AND version_compare(bundle_short_version, '12.25.1') < 0);", "open": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps a JOIN processes p ON substr(p.path, 1, LENGTH(a.path) + 1) = concat(a.path, '/') WHERE a.bundle_identifier = 'com.postmanlabs.mac');" }, - "installer_url": "https://dl.pstmn.io/download/version/12.24.5/osx_arm64", + "installer_url": "https://dl.pstmn.io/download/version/12.25.1/osx_arm64", "install_script_ref": "0e85ef74", "uninstall_script_ref": "727f8e9d", - "sha256": "264791ecc9d1f2a13d3df9bd6f53d727ebd7619c34b8a2b55a2fef2918b485cf", + "sha256": "e99a661633623a0d75ad1ec47a96065752098c0308755ca42c67d8f74402fca5", "default_categories": [ "Developer tools" ] diff --git a/ee/maintained-apps/outputs/proxyman/darwin.json b/ee/maintained-apps/outputs/proxyman/darwin.json index 5f40e6a9d95..744b36adea5 100644 --- a/ee/maintained-apps/outputs/proxyman/darwin.json +++ b/ee/maintained-apps/outputs/proxyman/darwin.json @@ -1,16 +1,16 @@ { "versions": [ { - "version": "6.15.0", + "version": "6.16.0", "queries": { "exists": "SELECT 1 FROM apps WHERE bundle_identifier = 'com.proxyman.NSProxy';", - "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'com.proxyman.NSProxy' AND version_compare(bundle_short_version, '6.15.0') < 0);", + "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'com.proxyman.NSProxy' AND version_compare(bundle_short_version, '6.16.0') < 0);", "open": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps a JOIN processes p ON substr(p.path, 1, LENGTH(a.path) + 1) = concat(a.path, '/') WHERE a.bundle_identifier = 'com.proxyman.NSProxy');" }, - "installer_url": "https://download.proxyman.com/61500/Proxyman_6.15.0.dmg", + "installer_url": "https://download.proxyman.com/61600/Proxyman_6.16.0.dmg", "install_script_ref": "abd123e6", "uninstall_script_ref": "c4a25ff5", - "sha256": "094615f2e42340d83ab2aef5f7f14ac2dfa6767e31d5cf4b203370f92b922497", + "sha256": "897036a7df16f96ba5173691cbede6e4069b81625c0ea4c8fb8998d618c96051", "default_categories": [ "Developer tools" ] diff --git a/ee/maintained-apps/outputs/shapr3d/darwin.json b/ee/maintained-apps/outputs/shapr3d/darwin.json index 30e570306dd..daabb5eaa66 100644 --- a/ee/maintained-apps/outputs/shapr3d/darwin.json +++ b/ee/maintained-apps/outputs/shapr3d/darwin.json @@ -1,16 +1,16 @@ { "versions": [ { - "version": "26.150.0.11562", + "version": "26.151.0.11589", "queries": { "exists": "SELECT 1 FROM apps WHERE bundle_identifier = 'com.shapr3d.shapr';", - "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'com.shapr3d.shapr' AND version_compare(bundle_short_version, '26.150.0.11562') < 0);", + "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'com.shapr3d.shapr' AND version_compare(bundle_short_version, '26.151.0.11589') < 0);", "open": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps a JOIN processes p ON substr(p.path, 1, LENGTH(a.path) + 1) = concat(a.path, '/') WHERE a.bundle_identifier = 'com.shapr3d.shapr');" }, - "installer_url": "https://download.shapr3d.com/mac/Shapr3D-26.150.0.11562.dmg", + "installer_url": "https://download.shapr3d.com/mac/Shapr3D-26.151.0.11589.dmg", "install_script_ref": "aa7e3fbc", "uninstall_script_ref": "261544b8", - "sha256": "1e51f64a1a47b50dcc2cae014b7117d0c325a56684fcd7c5a2127f18883ab108", + "sha256": "b4e7b63283c5dee2ed036d2ce42c7b9afee9f433dcc5cfe5b79673c2ac29bdc7", "default_categories": [ "Productivity" ] diff --git a/ee/maintained-apps/outputs/sourcetree/windows.json b/ee/maintained-apps/outputs/sourcetree/windows.json index a7adc091dea..f4d41b690bd 100644 --- a/ee/maintained-apps/outputs/sourcetree/windows.json +++ b/ee/maintained-apps/outputs/sourcetree/windows.json @@ -1,16 +1,16 @@ { "versions": [ { - "version": "3.4.31", + "version": "3.4.32", "queries": { "exists": "SELECT 1 FROM programs WHERE name = 'Sourcetree Enterprise' AND publisher = 'Atlassian';", - "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM programs WHERE name = 'Sourcetree Enterprise' AND publisher = 'Atlassian' AND version_compare(version, '3.4.31') < 0);", + "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM programs WHERE name = 'Sourcetree Enterprise' AND publisher = 'Atlassian' AND version_compare(version, '3.4.32') < 0);", "open": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM processes WHERE LOWER(name) = 'sourcetree.exe');" }, - "installer_url": "https://product-downloads.atlassian.com/software/sourcetree/windows/ga/SourcetreeEnterpriseSetup_3.4.31.msi", + "installer_url": "https://product-downloads.atlassian.com/software/sourcetree/windows/ga/SourcetreeEnterpriseSetup_3.4.32.msi", "install_script_ref": "e23ea804", "uninstall_script_ref": "6b8b2b2a", - "sha256": "d7c9845869072f9c0d10dc703fbf4ab25b21e4b1b01bd7c422920e99c2e2fcd2", + "sha256": "2dfeae7ab4ec6a11de12b65d2a59221d55bbb6be517dac39a493e34bac16e740", "default_categories": [ "Developer tools" ], diff --git a/ee/maintained-apps/outputs/splashtop-business/darwin.json b/ee/maintained-apps/outputs/splashtop-business/darwin.json index 7ade345ace5..02d30df6080 100644 --- a/ee/maintained-apps/outputs/splashtop-business/darwin.json +++ b/ee/maintained-apps/outputs/splashtop-business/darwin.json @@ -1,16 +1,16 @@ { "versions": [ { - "version": "3.8.4.0", + "version": "3.8.6.0", "queries": { "exists": "SELECT 1 FROM apps WHERE bundle_identifier = 'com.splashtop.stb.macosx';", - "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'com.splashtop.stb.macosx' AND version_compare(bundle_short_version, '3.8.4.0') < 0);", + "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'com.splashtop.stb.macosx' AND version_compare(bundle_short_version, '3.8.6.0') < 0);", "open": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps a JOIN processes p ON substr(p.path, 1, LENGTH(a.path) + 1) = concat(a.path, '/') WHERE a.bundle_identifier = 'com.splashtop.stb.macosx');" }, - "installer_url": "https://d17kmd0va0f0mp.cloudfront.net/macclient/STB/Splashtop_Business_Mac_INSTALLER_v3.8.4.0.dmg", + "installer_url": "https://d17kmd0va0f0mp.cloudfront.net/macclient/STB/Splashtop_Business_Mac_INSTALLER_v3.8.6.0.dmg", "install_script_ref": "c7fac759", "uninstall_script_ref": "9bfe55ab", - "sha256": "a06c5616bc8c6a4f1c238d2fb22d71da0c1e8ded2fc621f2cab9ddddaca90d34", + "sha256": "580c25996ea6ad7a8592a8ca09fa5a1662359eb69c948dd27eb084eeefea6868", "default_categories": [ "Productivity" ] diff --git a/ee/maintained-apps/outputs/splashtop-streamer/darwin.json b/ee/maintained-apps/outputs/splashtop-streamer/darwin.json index d454c656544..f75be48459e 100644 --- a/ee/maintained-apps/outputs/splashtop-streamer/darwin.json +++ b/ee/maintained-apps/outputs/splashtop-streamer/darwin.json @@ -1,23 +1,23 @@ { "versions": [ { - "version": "3.8.4.2", + "version": "3.8.6.0", "queries": { "exists": "SELECT 1 FROM apps WHERE bundle_identifier = 'com.splashtop.Splashtop-Streamer';", - "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'com.splashtop.Splashtop-Streamer' AND version_compare(bundle_short_version, '3.8.4.2') < 0);", + "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'com.splashtop.Splashtop-Streamer' AND version_compare(bundle_short_version, '3.8.6.0') < 0);", "open": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps a JOIN processes p ON substr(p.path, 1, LENGTH(a.path) + 1) = concat(a.path, '/') WHERE a.bundle_identifier = 'com.splashtop.Splashtop-Streamer');" }, - "installer_url": "https://d17kmd0va0f0mp.cloudfront.net/mac/Splashtop_Streamer_Mac_INSTALLER_v3.8.4.2.dmg", + "installer_url": "https://d17kmd0va0f0mp.cloudfront.net/mac/Splashtop_Streamer_Mac_INSTALLER_v3.8.6.0.dmg", "install_script_ref": "6aba2633", - "uninstall_script_ref": "4cb9c2d4", - "sha256": "93fca9b9f3c03bae0446b6d814a7ed0e8c0e244d71aa68c19efdc364e71b5076", + "uninstall_script_ref": "98a81a5e", + "sha256": "33765596a0e9f992ee22678c39e8d27888e8749d75046331e81e179a1d97e16d", "default_categories": [ "Productivity" ] } ], "refs": { - "4cb9c2d4": "#!/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.splashtop.streamer'\nremove_launchctl_service 'com.splashtop.streamer-daemon'\nremove_launchctl_service 'com.splashtop.streamer-for-root'\nremove_launchctl_service 'com.splashtop.streamer-for-user'\nremove_launchctl_service 'com.splashtop.streamer-srioframebuffer'\nquit_application 'com.splashtop.Splashtop-Streamer'\nremove_pkg_files 'com.splashtop.Splashtop-Streamer'\nforget_pkg 'com.splashtop.Splashtop-Streamer'\ntrash $LOGGED_IN_USER '~/Library/Application Support/Splashtop Streamer'\ntrash $LOGGED_IN_USER '~/Library/Preferences/com.splashtop.Splashtop-Streamer.plist'\n", - "6aba2633": "#!/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# install pkg files\nquit_and_track_application 'com.splashtop.Splashtop-Streamer'\nsudo installer -pkg \"$TMPDIR/Splashtop Streamer.pkg\" -target / || exit $?\nrelaunch_application 'com.splashtop.Splashtop-Streamer'\n" + "6aba2633": "#!/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# install pkg files\nquit_and_track_application 'com.splashtop.Splashtop-Streamer'\nsudo installer -pkg \"$TMPDIR/Splashtop Streamer.pkg\" -target / || exit $?\nrelaunch_application 'com.splashtop.Splashtop-Streamer'\n", + "98a81a5e": "#!/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.splashtop.streamer'\nremove_launchctl_service 'com.splashtop.streamer-daemon'\nremove_launchctl_service 'com.splashtop.streamer-for-root'\nremove_launchctl_service 'com.splashtop.streamer-for-user'\nremove_launchctl_service 'com.splashtop.streamer-srioframebuffer'\nquit_application 'com.splashtop.Splashtop-Streamer'\nremove_pkg_files 'com.splashtop.soundDriver'\nforget_pkg 'com.splashtop.soundDriver'\nremove_pkg_files 'com.splashtop.Splashtop-Streamer'\nforget_pkg 'com.splashtop.Splashtop-Streamer'\nsudo rm -rf '/Library/LaunchAgents/com.splashtop.streamer.plist'\nsudo rm -rf '~/Library/LaunchAgents/com.splashtop.streamer.plist'\ntrash $LOGGED_IN_USER '~/Library/Application Support/Splashtop Streamer'\ntrash $LOGGED_IN_USER '~/Library/Preferences/com.splashtop.Splashtop-Streamer.plist'\n" } } diff --git a/ee/maintained-apps/outputs/spokenly/darwin.json b/ee/maintained-apps/outputs/spokenly/darwin.json index babe14fca06..0b9757d834b 100644 --- a/ee/maintained-apps/outputs/spokenly/darwin.json +++ b/ee/maintained-apps/outputs/spokenly/darwin.json @@ -1,16 +1,16 @@ { "versions": [ { - "version": "2.28.0", + "version": "2.28.2", "queries": { "exists": "SELECT 1 FROM apps WHERE bundle_identifier = 'app.spokenly';", - "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'app.spokenly' AND version_compare(bundle_short_version, '2.28.0') < 0);", + "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'app.spokenly' AND version_compare(bundle_short_version, '2.28.2') < 0);", "open": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps a JOIN processes p ON substr(p.path, 1, LENGTH(a.path) + 1) = concat(a.path, '/') WHERE a.bundle_identifier = 'app.spokenly');" }, - "installer_url": "https://cdn.spokenly.app/releases/macos/Spokenly-2.28.0.dmg", + "installer_url": "https://cdn.spokenly.app/releases/macos/Spokenly-2.28.2.dmg", "install_script_ref": "11a51e11", "uninstall_script_ref": "99a71452", - "sha256": "b13469f8837425ce40a4d029d35889a3dfa7eb4ab405d107d89515f29934afc0", + "sha256": "baaa453452767f88815533354b975a77f35cdb09eeed9d5e98184dce3182c4dd", "default_categories": [ "Productivity" ] diff --git a/ee/maintained-apps/outputs/stats/darwin.json b/ee/maintained-apps/outputs/stats/darwin.json index 7b505b08b63..513da89685d 100644 --- a/ee/maintained-apps/outputs/stats/darwin.json +++ b/ee/maintained-apps/outputs/stats/darwin.json @@ -1,16 +1,16 @@ { "versions": [ { - "version": "3.0.12", + "version": "3.0.13", "queries": { "exists": "SELECT 1 FROM apps WHERE bundle_identifier = 'eu.exelban.Stats';", - "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'eu.exelban.Stats' AND version_compare(bundle_short_version, '3.0.12') < 0);", + "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'eu.exelban.Stats' AND version_compare(bundle_short_version, '3.0.13') < 0);", "open": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps a JOIN processes p ON substr(p.path, 1, LENGTH(a.path) + 1) = concat(a.path, '/') WHERE a.bundle_identifier = 'eu.exelban.Stats');" }, - "installer_url": "https://github.com/exelban/stats/releases/download/v3.0.12/Stats.dmg", + "installer_url": "https://github.com/exelban/stats/releases/download/v3.0.13/Stats.dmg", "install_script_ref": "f0bd0f4d", "uninstall_script_ref": "46b4651c", - "sha256": "683e73573d8d31e5b3b07f7e817091a2e9d63a62a6cf9a8710b3770d3c1573e8", + "sha256": "be8841586446a9a1e80d4c4fd0c434d8f1182b460ca728c82dd465c1b0c23415", "default_categories": [ "Productivity" ] diff --git a/ee/maintained-apps/outputs/whatsapp/darwin.json b/ee/maintained-apps/outputs/whatsapp/darwin.json index 1f52fb289a1..49f2f675338 100644 --- a/ee/maintained-apps/outputs/whatsapp/darwin.json +++ b/ee/maintained-apps/outputs/whatsapp/darwin.json @@ -1,10 +1,10 @@ { "versions": [ { - "version": "26.33.19", + "version": "26.34.12", "queries": { "exists": "SELECT 1 FROM apps WHERE bundle_identifier = 'net.whatsapp.WhatsApp';", - "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'net.whatsapp.WhatsApp' AND version_compare(bundle_short_version, '26.33.19') < 0);", + "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'net.whatsapp.WhatsApp' AND version_compare(bundle_short_version, '26.34.12') < 0);", "open": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps a JOIN processes p ON substr(p.path, 1, LENGTH(a.path) + 1) = concat(a.path, '/') WHERE a.bundle_identifier = 'net.whatsapp.WhatsApp');" }, "installer_url": "https://web.whatsapp.com/desktop/mac_native/release/?configuration=Release&src=whatsapp_downloads_page",