diff --git a/ee/maintained-apps/outputs/asana/darwin.json b/ee/maintained-apps/outputs/asana/darwin.json index 20d3d021a78..4f81bae2edb 100644 --- a/ee/maintained-apps/outputs/asana/darwin.json +++ b/ee/maintained-apps/outputs/asana/darwin.json @@ -1,15 +1,15 @@ { "versions": [ { - "version": "2.7.2", + "version": "2.8.0", "queries": { "exists": "SELECT 1 FROM apps WHERE bundle_identifier = 'com.electron.asana';", - "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'com.electron.asana' AND version_compare(bundle_short_version, '2.7.2') < 0);" + "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'com.electron.asana' AND version_compare(bundle_short_version, '2.8.0') < 0);" }, - "installer_url": "https://desktop-downloads.asana.com/darwin_arm64/prod/v2.7.2/Asana-darwin-arm64-2.7.2.zip", + "installer_url": "https://desktop-downloads.asana.com/darwin_arm64/prod/v2.8.0/Asana-darwin-arm64-2.8.0.zip", "install_script_ref": "668a034e", "uninstall_script_ref": "f219467b", - "sha256": "86fa23a4b4530fdbd8bd514beff1402fb0346dec946625708d891137c88eeae4", + "sha256": "dd7c5ca488774e5dd63f9e0b7f877dd1c72c864005a23f704db55ceea9fdc809", "default_categories": [ "Productivity" ] diff --git a/ee/maintained-apps/outputs/asana/windows.json b/ee/maintained-apps/outputs/asana/windows.json index 61a30c2af38..e552c22db13 100644 --- a/ee/maintained-apps/outputs/asana/windows.json +++ b/ee/maintained-apps/outputs/asana/windows.json @@ -1,15 +1,15 @@ { "versions": [ { - "version": "2.7.2", + "version": "2.8.0", "queries": { "exists": "SELECT 1 FROM programs WHERE name = 'Asana' AND publisher = 'Asana, Inc.';", - "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM programs WHERE name = 'Asana' AND publisher = 'Asana, Inc.' AND version_compare(version, '2.7.2') < 0);" + "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM programs WHERE name = 'Asana' AND publisher = 'Asana, Inc.' AND version_compare(version, '2.8.0') < 0);" }, - "installer_url": "https://desktop-downloads.asana.com/win32_x64/prod/v2.7.2/AsanaSetup.exe", + "installer_url": "https://desktop-downloads.asana.com/win32_x64/prod/v2.8.0/AsanaSetup.exe", "install_script_ref": "7d7fdd9d", "uninstall_script_ref": "223f54f6", - "sha256": "9f5778c5bf886ce66c51a7719ab41bd91ad74e8f8735496843ead7bdc47030ff", + "sha256": "d66ed0f30b7b9db1d102622a9be1c6b7c2459033ef85ca7ba2f19b700257cfee", "default_categories": [ "Productivity" ] diff --git a/ee/maintained-apps/outputs/aws-cli/windows.json b/ee/maintained-apps/outputs/aws-cli/windows.json index 38b64f071ef..675ef1cfb4c 100644 --- a/ee/maintained-apps/outputs/aws-cli/windows.json +++ b/ee/maintained-apps/outputs/aws-cli/windows.json @@ -1,15 +1,15 @@ { "versions": [ { - "version": "2.36.15", + "version": "2.36.16", "queries": { "exists": "SELECT 1 FROM programs WHERE name LIKE 'AWS Command Line Interface v2 %' AND publisher = 'Amazon Web Services';", - "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM programs WHERE name LIKE 'AWS Command Line Interface v2 %' AND publisher = 'Amazon Web Services' AND version_compare(version, '2.36.15') < 0);" + "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM programs WHERE name LIKE 'AWS Command Line Interface v2 %' AND publisher = 'Amazon Web Services' AND version_compare(version, '2.36.16') < 0);" }, - "installer_url": "https://awscli.amazonaws.com/AWSCLIV2-2.36.15.msi", + "installer_url": "https://awscli.amazonaws.com/AWSCLIV2-2.36.16.msi", "install_script_ref": "22e48c46", "uninstall_script_ref": "58bcd016", - "sha256": "c2a6e721a82d6c81c847b343df22c4edb907bd50cb7f07276dafc451d45c5b37", + "sha256": "0b94de55cd02d573f7ea0c4ec0eef14917f79563c0e3cd8ac1bf8478b0dcdb39", "default_categories": [ "Developer tools" ], diff --git a/ee/maintained-apps/outputs/betterzip/darwin.json b/ee/maintained-apps/outputs/betterzip/darwin.json index e172cde5a2d..238e56aa7da 100644 --- a/ee/maintained-apps/outputs/betterzip/darwin.json +++ b/ee/maintained-apps/outputs/betterzip/darwin.json @@ -9,7 +9,7 @@ "installer_url": "https://macitbetter.com/dl/BetterZip-6.0.4.zip", "install_script_ref": "2872398b", "uninstall_script_ref": "84dca76c", - "sha256": "b37f810f1fb73bcb61b9c8165cb4eea690b59cedc3584736e9ff776b0a06b90c", + "sha256": "64ab414901ed398f2f1584498f841ea0e3bf969b4cd60c41159296d297ef973e", "default_categories": [ "Productivity" ] diff --git a/ee/maintained-apps/outputs/chatgpt/darwin.json b/ee/maintained-apps/outputs/chatgpt/darwin.json index f38b67bc832..e9c7fd09d2d 100644 --- a/ee/maintained-apps/outputs/chatgpt/darwin.json +++ b/ee/maintained-apps/outputs/chatgpt/darwin.json @@ -1,15 +1,15 @@ { "versions": [ { - "version": "26.727.51351", + "version": "26.730.61309", "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.727.51351') < 0);" + "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'com.openai.chat' AND version_compare(bundle_short_version, '26.730.61309') < 0);" }, - "installer_url": "https://persistent.oaistatic.com/codex-app-prod/ChatGPT-darwin-arm64-26.727.51351.zip", + "installer_url": "https://persistent.oaistatic.com/codex-app-prod/ChatGPT-darwin-arm64-26.730.61309.zip", "install_script_ref": "cbce2d7d", "uninstall_script_ref": "678e6cf0", - "sha256": "8f3fc87e634332fddc711e5221eb2af554f5f6ecb04e6a69b3d10e01f4f196c8", + "sha256": "aec30478c9cddfa38e0e8bb8669d85c3d01ff88008b6fa39461e8c8d26a21948", "default_categories": [ "Productivity" ] diff --git a/ee/maintained-apps/outputs/claude/darwin.json b/ee/maintained-apps/outputs/claude/darwin.json index 3631da54c35..8e51785b754 100644 --- a/ee/maintained-apps/outputs/claude/darwin.json +++ b/ee/maintained-apps/outputs/claude/darwin.json @@ -1,15 +1,15 @@ { "versions": [ { - "version": "1.24012.11", + "version": "1.25927.0", "queries": { "exists": "SELECT 1 FROM apps WHERE bundle_identifier = 'com.anthropic.claudefordesktop';", - "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'com.anthropic.claudefordesktop' AND version_compare(bundle_short_version, '1.24012.11') < 0);" + "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'com.anthropic.claudefordesktop' AND version_compare(bundle_short_version, '1.25927.0') < 0);" }, - "installer_url": "https://downloads.claude.ai/releases/darwin/universal/1.24012.11/Claude-09114b681f6f333d10cf1a08df130fe7080ddc9b.zip", + "installer_url": "https://downloads.claude.ai/releases/darwin/universal/1.25927.0/Claude-003700efafbc2ccb4b1177a5e637b14da381799e.zip", "install_script_ref": "6e4c028b", "uninstall_script_ref": "421baa98", - "sha256": "28ed1de6b7c880b0fc549e267d2a6a390e01219f29ae2a504bb75473ddc8dc7c", + "sha256": "024fd60c6008efcac5be32e5faf3f5e7510b6a8adef07fd5834e49a7b5d1a78a", "default_categories": [ "Developer tools" ] diff --git a/ee/maintained-apps/outputs/digiseal-reader/windows.json b/ee/maintained-apps/outputs/digiseal-reader/windows.json index 37e2e5d4034..12acf12083b 100644 --- a/ee/maintained-apps/outputs/digiseal-reader/windows.json +++ b/ee/maintained-apps/outputs/digiseal-reader/windows.json @@ -1,10 +1,10 @@ { "versions": [ { - "version": "8.0.0.3", + "version": "8.0.0.4", "queries": { "exists": "SELECT 1 FROM programs WHERE name = 'digiSeal reader' AND publisher = 'secrypt GmbH';", - "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM programs WHERE name = 'digiSeal reader' AND publisher = 'secrypt GmbH' AND version_compare(version, '8.0.0.3') < 0);" + "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM programs WHERE name = 'digiSeal reader' AND publisher = 'secrypt GmbH' AND version_compare(version, '8.0.0.4') < 0);" }, "installer_url": "https://www.secrypt.de/downloads/setup_digiSeal_reader.exe", "install_script_ref": "76c7506c", diff --git a/ee/maintained-apps/outputs/dropbox/darwin.json b/ee/maintained-apps/outputs/dropbox/darwin.json index 9c136731c5e..0522f90ef1a 100644 --- a/ee/maintained-apps/outputs/dropbox/darwin.json +++ b/ee/maintained-apps/outputs/dropbox/darwin.json @@ -1,15 +1,15 @@ { "versions": [ { - "version": "262.4.3183", + "version": "264.4.3385", "queries": { "exists": "SELECT 1 FROM apps WHERE bundle_identifier = 'com.getdropbox.dropbox';", - "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'com.getdropbox.dropbox' AND version_compare(bundle_short_version, '262.4.3183') < 0);" + "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'com.getdropbox.dropbox' AND version_compare(bundle_short_version, '264.4.3385') < 0);" }, - "installer_url": "https://edge.dropboxstatic.com/dbx-releng/client/Dropbox%20262.4.3183.arm64.dmg", + "installer_url": "https://edge.dropboxstatic.com/dbx-releng/client/Dropbox%20264.4.3385.arm64.dmg", "install_script_ref": "dcd0d19e", "uninstall_script_ref": "3af4988a", - "sha256": "07ad76cdb4ca7ea5567a91d128e9a2cd1b5196e12b3d159b00a0ad4da938a36f", + "sha256": "e4c8b5735ac893a03838a4c0fa27bfb6d2dd3c7cc513235294ae69279b8d4748", "default_categories": [ "Productivity" ] diff --git a/ee/maintained-apps/outputs/duo-desktop/darwin.json b/ee/maintained-apps/outputs/duo-desktop/darwin.json index 750e0f6e0c0..2b49fa53ab2 100644 --- a/ee/maintained-apps/outputs/duo-desktop/darwin.json +++ b/ee/maintained-apps/outputs/duo-desktop/darwin.json @@ -1,15 +1,15 @@ { "versions": [ { - "version": "7.19.0.0", + "version": "7.20.0.0", "queries": { "exists": "SELECT 1 FROM apps WHERE bundle_identifier = 'com.duosecurity.duo-device-health';", - "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'com.duosecurity.duo-device-health' AND version_compare(bundle_short_version, '7.19.0.0') < 0);" + "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'com.duosecurity.duo-device-health' AND version_compare(bundle_short_version, '7.20.0.0') < 0);" }, - "installer_url": "https://dl.duosecurity.com/DuoDesktop-7.19.0.0.pkg", - "install_script_ref": "bac43c9b", + "installer_url": "https://dl.duosecurity.com/DuoDesktop-7.20.0.0.pkg", + "install_script_ref": "96c63e5c", "uninstall_script_ref": "7d07a79c", - "sha256": "486af3c6bb354cc0d630429cc011da382433309adcc74ed8f4ee6a867f7210c1", + "sha256": "47b29b0080bcab38a513e334f94d6930b21a9b69c273a2b32c63af341727095d", "default_categories": [ "Productivity" ] @@ -17,6 +17,6 @@ ], "refs": { "7d07a79c": "#!/bin/bash\n\n# variables\nLOGGED_IN_USER=$(scutil <<< \"show State:/Users/ConsoleUser\" | awk '/Name :/ { print $3 }')\n# functions\n\nexpand_pkgid_and_map() {\n local PKGID=\"$1\"\n local FUNC=\"$2\"\n if [[ \"$PKGID\" == *\"*\" ]]; then\n local prefix=\"${PKGID%\\*}\"\n echo \"Expanding wildcard for PKGID: $PKGID\"\n for receipt in $(pkgutil --pkgs | grep \"^${prefix}\"); do\n echo \"Processing $receipt\"\n \"$FUNC\" \"$receipt\"\n done\n else\n \"$FUNC\" \"$PKGID\"\n fi\n}\n\nforget_pkg() {\n local PKGID=\"$1\"\n expand_pkgid_and_map \"$PKGID\" forget_receipt\n}\n\nforget_receipt() {\n local PKGID=\"$1\"\n sudo pkgutil --forget \"$PKGID\"\n}\n\nquit_application() {\n local bundle_id=\"$1\"\n local timeout_duration=10\n\n # check if the application is running\n local app_running\n app_running=$(osascript -e \"application id \\\"$bundle_id\\\" is running\" 2>/dev/null)\n if [[ \"$app_running\" != \"true\" ]]; then\n return\n fi\n\n local console_user\n console_user=$(stat -f \"%Su\" /dev/console)\n if [[ -z \"$console_user\" || \"$console_user\" == \"root\" || \"$console_user\" == \"loginwindow\" ]]; then\n echo \"Not logged into a non-root GUI; skipping quitting application ID '$bundle_id'.\"\n return\n fi\n\n echo \"Quitting application '$bundle_id'...\"\n\n # try to quit the application within the timeout period\n local quit_success=false\n SECONDS=0\n while (( SECONDS < timeout_duration )); do\n if osascript -e \"tell application id \\\"$bundle_id\\\" to quit\" >/dev/null 2>&1; then\n if ! pgrep -f \"$bundle_id\" >/dev/null 2>&1; then\n echo \"Application '$bundle_id' quit successfully.\"\n quit_success=true\n break\n fi\n fi\n sleep 1\n done\n\n if [[ \"$quit_success\" = false ]]; then\n echo \"Application '$bundle_id' did not quit.\"\n fi\n}\n\n\nremove_launchctl_service() {\n local service=\"$1\"\n local booleans=(\"true\" \"false\")\n local plist_status\n local paths\n local should_sudo\n\n echo \"Removing launchctl service ${service}\"\n\n # A wildcard label can't be used with launchctl or as a plist name, so expand\n # it to the labels of currently loaded services that match the pattern.\n local services=(\"$service\")\n if [[ \"$service\" == *\"*\"* ]]; then\n local regex\n # Escape regex metacharacters, turn '*' into '.*', and anchor the pattern so\n # it matches a full label rather than a substring.\n regex=$(printf '%s' \"$service\" | sed -e 's/[][(){}.^$+?|\\\\]/\\\\&/g' -e 's/\\*/.*/g')\n regex=\"^${regex}$\"\n services=()\n local id\n # Match every loaded job by label regardless of PID; launchctl list reports\n # loaded-but-not-running jobs with a \"-\" in the PID column.\n while read -r _ _ id; do\n [[ \"$id\" =~ $regex ]] && services+=(\"$id\")\n done < <(launchctl list 2>/dev/null | tail -n +2)\n if [[ ${#services[@]} -eq 0 ]]; then\n echo \"No loaded launchctl service matches ${service}\"\n return\n fi\n fi\n\n local service_label\n for service_label in \"${services[@]}\"; do\n for should_sudo in \"${booleans[@]}\"; do\n plist_status=$(launchctl list \"${service_label}\" 2>/dev/null)\n\n if [[ $plist_status == \\{* ]]; then\n if [[ $should_sudo == \"true\" ]]; then\n sudo launchctl remove \"${service_label}\"\n else\n launchctl remove \"${service_label}\"\n fi\n sleep 1\n fi\n\n paths=(\n \"/Library/LaunchAgents/${service_label}.plist\"\n \"/Library/LaunchDaemons/${service_label}.plist\"\n )\n\n # if not using sudo, prepend the home directory to the paths\n if [[ $should_sudo == \"false\" ]]; then\n for i in \"${!paths[@]}\"; do\n paths[i]=\"${HOME}${paths[i]}\"\n done\n fi\n\n for path in \"${paths[@]}\"; do\n if [[ -e \"$path\" ]]; then\n if [[ $should_sudo == \"true\" ]]; then\n sudo rm -f -- \"$path\"\n else\n rm -f -- \"$path\"\n fi\n fi\n done\n done\n done\n}\n\nremove_pkg_files() {\n local PKGID=\"$1\"\n expand_pkgid_and_map \"$PKGID\" remove_receipt_files\n}\n\nremove_receipt_files() {\n local PKGID=\"$1\"\n local PKGINFO VOLUME INSTALL_LOCATION FULL_INSTALL_LOCATION\n\n echo \"pkgutil --pkg-info-plist \\\"$PKGID\\\"\"\n PKGINFO=$(pkgutil --pkg-info-plist \"$PKGID\")\n VOLUME=$(echo \"$PKGINFO\" | awk '/volume<\\/key>/ {getline; gsub(/.*|<\\/string>.*/, \"\"); print}')\n INSTALL_LOCATION=$(echo \"$PKGINFO\" | awk '/install-location<\\/key>/ {getline; gsub(/.*|<\\/string>.*/, \"\"); print}')\n\n if [ -z \"$INSTALL_LOCATION\" ] || [ \"$INSTALL_LOCATION\" = \"/\" ]; then\n FULL_INSTALL_LOCATION=\"$VOLUME\"\n else\n FULL_INSTALL_LOCATION=\"$VOLUME/$INSTALL_LOCATION\"\n FULL_INSTALL_LOCATION=$(echo \"$FULL_INSTALL_LOCATION\" | sed 's|//|/|g')\n fi\n\n echo \"sudo pkgutil --only-files --files \\\"$PKGID\\\" | sed \\\"s|^|${FULL_INSTALL_LOCATION}/|\\\" | tr '\\\\\\\\n' '\\\\\\\\0' | /usr/bin/sudo -u root -E -- /usr/bin/xargs -0 -- /bin/rm -rf\"\n sudo pkgutil --only-files --files \"$PKGID\" | sed \"s|^|/${INSTALL_LOCATION}/|\" | tr '\\n' '\\0' | /usr/bin/sudo -u root -E -- /usr/bin/xargs -0 -- /bin/rm -rf\n\n echo \"sudo pkgutil --only-dirs --files \\\"$PKGID\\\" | sed \\\"s|^|${FULL_INSTALL_LOCATION}/|\\\" | grep '\\\\.app$' | tr '\\\\\\\\n' '\\\\\\\\0' | /usr/bin/sudo -u root -E -- /usr/bin/xargs -0 -- /bin/rm -rf\"\n sudo pkgutil --only-dirs --files \"$PKGID\" | sed \"s|^|${FULL_INSTALL_LOCATION}/|\" | grep '\\.app$' | tr '\\n' '\\0' | /usr/bin/sudo -u root -E -- /usr/bin/xargs -0 -- /bin/rm -rf\n\n root_app_dir=$(\n sudo pkgutil --only-dirs --files \"$PKGID\" \\\n | sed \"s|^|${FULL_INSTALL_LOCATION}/|\" \\\n | grep 'Applications' \\\n | awk '{ print length, $0 }' \\\n | sort -n \\\n | head -n1 \\\n | cut -d' ' -f2-\n )\n if [ -n \"$root_app_dir\" ]; then\n echo \"sudo rmdir -p \\\"$root_app_dir\\\" 2>/dev/null || :\"\n sudo rmdir -p \"$root_app_dir\" 2>/dev/null || :\n fi\n}\n\ntrash() {\n local logged_in_user=\"$1\"\n local target_file=\"$2\"\n local timestamp=\"$(date +%Y-%m-%d-%s)\"\n local rand=\"$(jot -r 1 0 99999)\"\n\n # replace ~ with /Users/$logged_in_user\n if [[ \"$target_file\" == ~* ]]; then\n target_file=\"/Users/$logged_in_user${target_file:1}\"\n fi\n\n local trash=\"/Users/$logged_in_user/.Trash\"\n\n # If the target contains glob characters, expand it and move each match.\n if [[ \"$target_file\" == *[*?[]* ]]; then\n local file file_name\n local matched=false\n local i=0\n # compgen -G expands the (quoted) pattern itself, so paths containing\n # spaces glob correctly; reading line by line keeps each match intact.\n while IFS= read -r file; do\n [[ -n \"$file\" ]] || continue\n [[ -e \"$file\" || -L \"$file\" ]] || continue\n matched=true\n i=$((i + 1))\n file_name=\"$(basename \"$file\")\"\n echo \"removing $file.\"\n # The per-match counter keeps matches that share a basename from\n # overwriting each other in the trash.\n mv -f \"$file\" \"$trash/${file_name}_${timestamp}_${rand}_${i}\"\n done < <(compgen -G \"$target_file\" 2>/dev/null)\n if [[ \"$matched\" == false ]]; then\n echo \"$target_file doesn't exist.\"\n fi\n return\n fi\n\n local file_name=\"$(basename \"${target_file}\")\"\n\n if [[ -e \"$target_file\" ]]; then\n echo \"removing $target_file.\"\n mv -f \"$target_file\" \"$trash/${file_name}_${timestamp}_${rand}\"\n else\n echo \"$target_file doesn't exist.\"\n fi\n}\n\nremove_launchctl_service 'com.duosecurity.duoappupdater'\nremove_launchctl_service 'com.duosecurity.DuoDesktopService'\nremove_launchctl_service 'com.duosecurity.ForceLaunchDuoDesktop'\nremove_launchctl_service 'com.duosecurity.LaunchDuoDesktop'\nremove_launchctl_service 'com.duosecurity.trustedpeermessagebroker'\nquit_application 'com.duosecurity.duo-device-health'\nremove_pkg_files 'com.duosecurity.duo-device-health'\nforget_pkg 'com.duosecurity.duo-device-health'\nsudo rm -rf '/Applications/Duo Desktop.app'\nsudo rm -rf '/Library/LaunchAgents/com.duosecurity.ForceLaunchDuoDesktop.plist'\nsudo rm -rf '/Library/LaunchAgents/com.duosecurity.LaunchDuoDesktop.plist'\nsudo rm -rf '/Library/LaunchDaemons/com.duosecurity.duoappupdater.plist'\nsudo rm -rf '/Library/LaunchDaemons/com.duosecurity.DuoDesktopService.plist'\nsudo rm -rf '/Library/LaunchDaemons/com.duosecurity.trustedpeermessagebroker.plist'\ntrash $LOGGED_IN_USER '/Library/Logs/Duo'\ntrash $LOGGED_IN_USER '~/Library/Caches/com.duosecurity.duo-device-health'\ntrash $LOGGED_IN_USER '~/Library/Logs/Duo Desktop'\ntrash $LOGGED_IN_USER '~/Library/Preferences/com.duosecurity.devicehealth.localdata.plist'\ntrash $LOGGED_IN_USER '~/Library/Preferences/com.duosecurity.duo-device-health.plist'\n", - "bac43c9b": "#!/bin/bash\n\n# variables\nAPPDIR=\"/Applications/\"\nTMPDIR=$(dirname \"$(realpath \"$INSTALLER_PATH\")\")\n# functions\n\nquit_and_track_application() {\n local bundle_id=\"$1\"\n local var_name=\"APP_WAS_RUNNING_$(echo \"$bundle_id\" | tr '.-' '__')\"\n local timeout_duration=10\n\n # check if the application is running\n local app_running\n app_running=$(osascript -e \"application id \\\"$bundle_id\\\" is running\" 2>/dev/null)\n if [[ \"$app_running\" != \"true\" ]]; then\n eval \"export $var_name=0\"\n return\n fi\n\n local console_user\n console_user=$(stat -f \"%Su\" /dev/console)\n if [[ -z \"$console_user\" || \"$console_user\" == \"root\" || \"$console_user\" == \"loginwindow\" ]]; then\n echo \"Not logged into a non-root GUI; skipping quitting application ID '$bundle_id'.\"\n eval \"export $var_name=0\"\n return\n fi\n\n # App was running, mark it for relaunch\n eval \"export $var_name=1\"\n echo \"Application '$bundle_id' was running; will relaunch after installation.\"\n\n echo \"Quitting application '$bundle_id'...\"\n\n # try to quit the application within the timeout period\n local quit_success=false\n SECONDS=0\n while (( SECONDS < timeout_duration )); do\n if osascript -e \"tell application id \\\"$bundle_id\\\" to quit\" >/dev/null 2>&1; then\n if ! pgrep -f \"$bundle_id\" >/dev/null 2>&1; then\n echo \"Application '$bundle_id' quit successfully.\"\n quit_success=true\n break\n fi\n fi\n sleep 1\n done\n\n if [[ \"$quit_success\" = false ]]; then\n echo \"Application '$bundle_id' did not quit.\"\n fi\n}\n\n\nrelaunch_application() {\n local bundle_id=\"$1\"\n local var_name=\"APP_WAS_RUNNING_$(echo \"$bundle_id\" | tr '.-' '__')\"\n local was_running\n\n # Check if the app was running before installation\n eval \"was_running=\\$$var_name\"\n if [[ \"$was_running\" != \"1\" ]]; then\n return\n fi\n\n local console_user\n console_user=$(stat -f \"%Su\" /dev/console)\n if [[ -z \"$console_user\" || \"$console_user\" == \"root\" || \"$console_user\" == \"loginwindow\" ]]; then\n echo \"Not logged into a non-root GUI; skipping relaunching application ID '$bundle_id'.\"\n return\n fi\n\n echo \"Relaunching application '$bundle_id'...\"\n\n # Launch the app in the logged-in user's GUI session. Apps launched by root\n # won't register with the user's Dock/GUI, so run 'open' as the console user.\n # Use 'launchctl asuser' to bootstrap into the console user's Mach namespace\n # and GUI session — 'sudo -u' alone doesn't do this, which can cause\n # LSOpenURLsWithRole() failures even when 'open' exits 0.\n local open_status=0\n if [[ $EUID -eq 0 ]]; then\n local console_uid\n console_uid=$(id -u \"$console_user\")\n /bin/launchctl asuser \"$console_uid\" sudo -u \"$console_user\" open -b \"$bundle_id\" >/dev/null 2>&1 || open_status=$?\n else\n open -b \"$bundle_id\" >/dev/null 2>&1 || open_status=$?\n fi\n\n if [[ $open_status -eq 0 ]]; then\n echo \"Application '$bundle_id' relaunched successfully.\"\n else\n echo \"Failed to relaunch application '$bundle_id'.\"\n fi\n}\n\n\n# install pkg files\nquit_and_track_application 'com.duosecurity.duo-device-health'\nsudo installer -pkg \"$TMPDIR/DuoDesktop-7.19.0.0.pkg\" -target / || exit $?\nrelaunch_application 'com.duosecurity.duo-device-health'\n" + "96c63e5c": "#!/bin/bash\n\n# variables\nAPPDIR=\"/Applications/\"\nTMPDIR=$(dirname \"$(realpath \"$INSTALLER_PATH\")\")\n# functions\n\nquit_and_track_application() {\n local bundle_id=\"$1\"\n local var_name=\"APP_WAS_RUNNING_$(echo \"$bundle_id\" | tr '.-' '__')\"\n local timeout_duration=10\n\n # check if the application is running\n local app_running\n app_running=$(osascript -e \"application id \\\"$bundle_id\\\" is running\" 2>/dev/null)\n if [[ \"$app_running\" != \"true\" ]]; then\n eval \"export $var_name=0\"\n return\n fi\n\n local console_user\n console_user=$(stat -f \"%Su\" /dev/console)\n if [[ -z \"$console_user\" || \"$console_user\" == \"root\" || \"$console_user\" == \"loginwindow\" ]]; then\n echo \"Not logged into a non-root GUI; skipping quitting application ID '$bundle_id'.\"\n eval \"export $var_name=0\"\n return\n fi\n\n # App was running, mark it for relaunch\n eval \"export $var_name=1\"\n echo \"Application '$bundle_id' was running; will relaunch after installation.\"\n\n echo \"Quitting application '$bundle_id'...\"\n\n # try to quit the application within the timeout period\n local quit_success=false\n SECONDS=0\n while (( SECONDS < timeout_duration )); do\n if osascript -e \"tell application id \\\"$bundle_id\\\" to quit\" >/dev/null 2>&1; then\n if ! pgrep -f \"$bundle_id\" >/dev/null 2>&1; then\n echo \"Application '$bundle_id' quit successfully.\"\n quit_success=true\n break\n fi\n fi\n sleep 1\n done\n\n if [[ \"$quit_success\" = false ]]; then\n echo \"Application '$bundle_id' did not quit.\"\n fi\n}\n\n\nrelaunch_application() {\n local bundle_id=\"$1\"\n local var_name=\"APP_WAS_RUNNING_$(echo \"$bundle_id\" | tr '.-' '__')\"\n local was_running\n\n # Check if the app was running before installation\n eval \"was_running=\\$$var_name\"\n if [[ \"$was_running\" != \"1\" ]]; then\n return\n fi\n\n local console_user\n console_user=$(stat -f \"%Su\" /dev/console)\n if [[ -z \"$console_user\" || \"$console_user\" == \"root\" || \"$console_user\" == \"loginwindow\" ]]; then\n echo \"Not logged into a non-root GUI; skipping relaunching application ID '$bundle_id'.\"\n return\n fi\n\n echo \"Relaunching application '$bundle_id'...\"\n\n # Launch the app in the logged-in user's GUI session. Apps launched by root\n # won't register with the user's Dock/GUI, so run 'open' as the console user.\n # Use 'launchctl asuser' to bootstrap into the console user's Mach namespace\n # and GUI session — 'sudo -u' alone doesn't do this, which can cause\n # LSOpenURLsWithRole() failures even when 'open' exits 0.\n local open_status=0\n if [[ $EUID -eq 0 ]]; then\n local console_uid\n console_uid=$(id -u \"$console_user\")\n /bin/launchctl asuser \"$console_uid\" sudo -u \"$console_user\" open -b \"$bundle_id\" >/dev/null 2>&1 || open_status=$?\n else\n open -b \"$bundle_id\" >/dev/null 2>&1 || open_status=$?\n fi\n\n if [[ $open_status -eq 0 ]]; then\n echo \"Application '$bundle_id' relaunched successfully.\"\n else\n echo \"Failed to relaunch application '$bundle_id'.\"\n fi\n}\n\n\n# install pkg files\nquit_and_track_application 'com.duosecurity.duo-device-health'\nsudo installer -pkg \"$TMPDIR/DuoDesktop-7.20.0.0.pkg\" -target / || exit $?\nrelaunch_application 'com.duosecurity.duo-device-health'\n" } } diff --git a/ee/maintained-apps/outputs/duo-desktop/windows.json b/ee/maintained-apps/outputs/duo-desktop/windows.json index b062bd6d9a7..d14ddc89ae5 100644 --- a/ee/maintained-apps/outputs/duo-desktop/windows.json +++ b/ee/maintained-apps/outputs/duo-desktop/windows.json @@ -1,15 +1,15 @@ { "versions": [ { - "version": "7.19.0", + "version": "7.20.0", "queries": { "exists": "SELECT 1 FROM programs WHERE name = 'Duo Desktop' AND publisher = 'Duo Security';", - "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM programs WHERE name = 'Duo Desktop' AND publisher = 'Duo Security' AND version_compare(version, '7.19.0') < 0);" + "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM programs WHERE name = 'Duo Desktop' AND publisher = 'Duo Security' AND version_compare(version, '7.20.0') < 0);" }, - "installer_url": "https://dl.duosecurity.com/DuoDesktop-7.19.0.msi", + "installer_url": "https://dl.duosecurity.com/DuoDesktop-7.20.0.msi", "install_script_ref": "22e48c46", "uninstall_script_ref": "0d338e9c", - "sha256": "55b4079170f6bb0fe085b331f448390198c0aa76a4c4ed3267ac0782e2f8b4bd", + "sha256": "76973ed35adf320ec92c8fcc1c0e91d419a47ab405bf6962103c4f0060c7046d", "default_categories": [ "Productivity" ], diff --git a/ee/maintained-apps/outputs/google-chrome/darwin.json b/ee/maintained-apps/outputs/google-chrome/darwin.json index 9bb15b32d6f..2f12bc96e5a 100644 --- a/ee/maintained-apps/outputs/google-chrome/darwin.json +++ b/ee/maintained-apps/outputs/google-chrome/darwin.json @@ -1,10 +1,10 @@ { "versions": [ { - "version": "151.0.7922.72", + "version": "151.0.7922.76", "queries": { "exists": "SELECT 1 FROM apps WHERE bundle_identifier = 'com.google.Chrome';", - "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'com.google.Chrome' AND version_compare(bundle_short_version, '151.0.7922.72') < 0);" + "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'com.google.Chrome' AND version_compare(bundle_short_version, '151.0.7922.76') < 0);" }, "installer_url": "https://dl.google.com/dl/chrome/mac/universal/stable/gcem/GoogleChrome.pkg", "install_script_ref": "02a1baed", diff --git a/ee/maintained-apps/outputs/google-chrome/windows.json b/ee/maintained-apps/outputs/google-chrome/windows.json index c440261029e..97d55e826ec 100644 --- a/ee/maintained-apps/outputs/google-chrome/windows.json +++ b/ee/maintained-apps/outputs/google-chrome/windows.json @@ -1,10 +1,10 @@ { "versions": [ { - "version": "151.0.7922.72", + "version": "151.0.7922.76", "queries": { "exists": "SELECT 1 FROM programs WHERE name = 'Google Chrome' AND publisher = 'Google LLC';", - "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM programs WHERE name = 'Google Chrome' AND publisher = 'Google LLC' AND version_compare(version, '151.0.7922.72') < 0);" + "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM programs WHERE name = 'Google Chrome' AND publisher = 'Google LLC' AND version_compare(version, '151.0.7922.76') < 0);" }, "installer_url": "https://dl.google.com/dl/chrome/install/googlechromestandaloneenterprise64.msi", "install_script_ref": "22e48c46", diff --git a/ee/maintained-apps/outputs/loom/darwin.json b/ee/maintained-apps/outputs/loom/darwin.json index e964eb88ad2..ed256569a64 100644 --- a/ee/maintained-apps/outputs/loom/darwin.json +++ b/ee/maintained-apps/outputs/loom/darwin.json @@ -1,15 +1,15 @@ { "versions": [ { - "version": "0.365.0", + "version": "0.366.0", "queries": { "exists": "SELECT 1 FROM apps WHERE bundle_identifier = 'com.loom.desktop';", - "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'com.loom.desktop' AND version_compare(bundle_short_version, '0.365.0') < 0);" + "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'com.loom.desktop' AND version_compare(bundle_short_version, '0.366.0') < 0);" }, - "installer_url": "https://packages.loom.com/desktop-packages/Loom-0.365.0-arm64.dmg", + "installer_url": "https://packages.loom.com/desktop-packages/Loom-0.366.0-arm64.dmg", "install_script_ref": "53e2b898", "uninstall_script_ref": "1a901a1f", - "sha256": "a6cba46f99f7cd39d305e6579115bc85b69713c9668a9426dc9e39010ac8e1e9", + "sha256": "b99271501cc18e07254f59691c44be35496b18d42e7a5e80e8d23a4526b0be29", "default_categories": [ "Productivity" ] diff --git a/ee/maintained-apps/outputs/loom/windows.json b/ee/maintained-apps/outputs/loom/windows.json index a73224e03f9..09f166bb3f2 100644 --- a/ee/maintained-apps/outputs/loom/windows.json +++ b/ee/maintained-apps/outputs/loom/windows.json @@ -1,15 +1,15 @@ { "versions": [ { - "version": "0.365.0", + "version": "0.366.0", "queries": { "exists": "SELECT 1 FROM programs WHERE name = 'Loom' AND publisher = 'Loom, Inc.';", - "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM programs WHERE name = 'Loom' AND publisher = 'Loom, Inc.' AND version_compare(version, '0.365.0') < 0);" + "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM programs WHERE name = 'Loom' AND publisher = 'Loom, Inc.' AND version_compare(version, '0.366.0') < 0);" }, - "installer_url": "https://cdn.loom.com/desktop-packages/Loom%20Setup%200.365.0.exe", + "installer_url": "https://cdn.loom.com/desktop-packages/Loom%20Setup%200.366.0.exe", "install_script_ref": "77327cbf", "uninstall_script_ref": "b012f1e7", - "sha256": "9bf4d6b485b8721b07cd318d2321d0e3578b85e43adbadee7ceba4067f5278b4", + "sha256": "4c0576fefd63f329c40a51c871f725babf2655445a5874026f294aaa57d43609", "default_categories": [ "Productivity" ] diff --git a/ee/maintained-apps/outputs/miro/windows.json b/ee/maintained-apps/outputs/miro/windows.json index 2f77ef78ef5..c391cbcbba7 100644 --- a/ee/maintained-apps/outputs/miro/windows.json +++ b/ee/maintained-apps/outputs/miro/windows.json @@ -1,15 +1,15 @@ { "versions": [ { - "version": "0.11.164", + "version": "0.11.168", "queries": { "exists": "SELECT 1 FROM programs WHERE name = 'Miro' AND publisher = 'Miro';", - "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM programs WHERE name = 'Miro' AND publisher = 'Miro' AND version_compare(version, '0.11.164') < 0);" + "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM programs WHERE name = 'Miro' AND publisher = 'Miro' AND version_compare(version, '0.11.168') < 0);" }, "installer_url": "https://desktop.miro.com/platforms/win32-nsis-pu/Miro-setup.exe", "install_script_ref": "c9d9747e", "uninstall_script_ref": "66f6a4de", - "sha256": "0e6f2095ad9e5983a70d5eeaa64b349887e05a964944e82f134ef35560931465", + "sha256": "e2d274630b25cd19e9473d48825d2077dff40f4c91e4376bded59a6b84d5382b", "default_categories": [ "Productivity" ] diff --git a/ee/maintained-apps/outputs/nudge/darwin.json b/ee/maintained-apps/outputs/nudge/darwin.json index 1f60cb915a6..decf478226e 100644 --- a/ee/maintained-apps/outputs/nudge/darwin.json +++ b/ee/maintained-apps/outputs/nudge/darwin.json @@ -1,15 +1,15 @@ { "versions": [ { - "version": "2.1.2.81856", + "version": "2.1.3.81860", "queries": { "exists": "SELECT 1 FROM apps WHERE bundle_identifier = 'com.github.macadmins.Nudge';", - "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'com.github.macadmins.Nudge' AND version_compare(bundle_short_version, '2.1.2.81856') < 0);" + "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'com.github.macadmins.Nudge' AND version_compare(bundle_short_version, '2.1.3.81860') < 0);" }, - "installer_url": "https://github.com/macadmins/nudge/releases/download/v2.1.2.81856/Nudge-2.1.2.81856.pkg", - "install_script_ref": "ac39d8ab", + "installer_url": "https://github.com/macadmins/nudge/releases/download/v2.1.3.81860/Nudge-2.1.3.81860.pkg", + "install_script_ref": "aa291dac", "uninstall_script_ref": "1f8d2677", - "sha256": "9a1850052aacc105a8c77dfc2e43e33afad673402d9781e1c107eeb98d31f30c", + "sha256": "277353d03208ba12039ebd132aff704199816f5000334913f33f3696f294f19a", "default_categories": [ "Productivity" ] @@ -17,6 +17,6 @@ ], "refs": { "1f8d2677": "#!/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\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_pkg_files 'com.github.macadmins.Nudge'\nforget_pkg 'com.github.macadmins.Nudge'\ntrash $LOGGED_IN_USER '~/Library/Preferences/com.github.macadmins.Nudge.plist'\n", - "ac39d8ab": "#!/bin/bash\n\n# variables\nAPPDIR=\"/Applications/\"\nTMPDIR=$(dirname \"$(realpath \"$INSTALLER_PATH\")\")\n# functions\n\nquit_and_track_application() {\n local bundle_id=\"$1\"\n local var_name=\"APP_WAS_RUNNING_$(echo \"$bundle_id\" | tr '.-' '__')\"\n local timeout_duration=10\n\n # check if the application is running\n local app_running\n app_running=$(osascript -e \"application id \\\"$bundle_id\\\" is running\" 2>/dev/null)\n if [[ \"$app_running\" != \"true\" ]]; then\n eval \"export $var_name=0\"\n return\n fi\n\n local console_user\n console_user=$(stat -f \"%Su\" /dev/console)\n if [[ -z \"$console_user\" || \"$console_user\" == \"root\" || \"$console_user\" == \"loginwindow\" ]]; then\n echo \"Not logged into a non-root GUI; skipping quitting application ID '$bundle_id'.\"\n eval \"export $var_name=0\"\n return\n fi\n\n # App was running, mark it for relaunch\n eval \"export $var_name=1\"\n echo \"Application '$bundle_id' was running; will relaunch after installation.\"\n\n echo \"Quitting application '$bundle_id'...\"\n\n # try to quit the application within the timeout period\n local quit_success=false\n SECONDS=0\n while (( SECONDS < timeout_duration )); do\n if osascript -e \"tell application id \\\"$bundle_id\\\" to quit\" >/dev/null 2>&1; then\n if ! pgrep -f \"$bundle_id\" >/dev/null 2>&1; then\n echo \"Application '$bundle_id' quit successfully.\"\n quit_success=true\n break\n fi\n fi\n sleep 1\n done\n\n if [[ \"$quit_success\" = false ]]; then\n echo \"Application '$bundle_id' did not quit.\"\n fi\n}\n\n\nrelaunch_application() {\n local bundle_id=\"$1\"\n local var_name=\"APP_WAS_RUNNING_$(echo \"$bundle_id\" | tr '.-' '__')\"\n local was_running\n\n # Check if the app was running before installation\n eval \"was_running=\\$$var_name\"\n if [[ \"$was_running\" != \"1\" ]]; then\n return\n fi\n\n local console_user\n console_user=$(stat -f \"%Su\" /dev/console)\n if [[ -z \"$console_user\" || \"$console_user\" == \"root\" || \"$console_user\" == \"loginwindow\" ]]; then\n echo \"Not logged into a non-root GUI; skipping relaunching application ID '$bundle_id'.\"\n return\n fi\n\n echo \"Relaunching application '$bundle_id'...\"\n\n # Launch the app in the logged-in user's GUI session. Apps launched by root\n # won't register with the user's Dock/GUI, so run 'open' as the console user.\n # Use 'launchctl asuser' to bootstrap into the console user's Mach namespace\n # and GUI session — 'sudo -u' alone doesn't do this, which can cause\n # LSOpenURLsWithRole() failures even when 'open' exits 0.\n local open_status=0\n if [[ $EUID -eq 0 ]]; then\n local console_uid\n console_uid=$(id -u \"$console_user\")\n /bin/launchctl asuser \"$console_uid\" sudo -u \"$console_user\" open -b \"$bundle_id\" >/dev/null 2>&1 || open_status=$?\n else\n open -b \"$bundle_id\" >/dev/null 2>&1 || open_status=$?\n fi\n\n if [[ $open_status -eq 0 ]]; then\n echo \"Application '$bundle_id' relaunched successfully.\"\n else\n echo \"Failed to relaunch application '$bundle_id'.\"\n fi\n}\n\n\n# install pkg files\nquit_and_track_application 'com.github.macadmins.Nudge'\nsudo installer -pkg \"$TMPDIR/Nudge-2.1.2.81856.pkg\" -target / || exit $?\nrelaunch_application 'com.github.macadmins.Nudge'\n" + "aa291dac": "#!/bin/bash\n\n# variables\nAPPDIR=\"/Applications/\"\nTMPDIR=$(dirname \"$(realpath \"$INSTALLER_PATH\")\")\n# functions\n\nquit_and_track_application() {\n local bundle_id=\"$1\"\n local var_name=\"APP_WAS_RUNNING_$(echo \"$bundle_id\" | tr '.-' '__')\"\n local timeout_duration=10\n\n # check if the application is running\n local app_running\n app_running=$(osascript -e \"application id \\\"$bundle_id\\\" is running\" 2>/dev/null)\n if [[ \"$app_running\" != \"true\" ]]; then\n eval \"export $var_name=0\"\n return\n fi\n\n local console_user\n console_user=$(stat -f \"%Su\" /dev/console)\n if [[ -z \"$console_user\" || \"$console_user\" == \"root\" || \"$console_user\" == \"loginwindow\" ]]; then\n echo \"Not logged into a non-root GUI; skipping quitting application ID '$bundle_id'.\"\n eval \"export $var_name=0\"\n return\n fi\n\n # App was running, mark it for relaunch\n eval \"export $var_name=1\"\n echo \"Application '$bundle_id' was running; will relaunch after installation.\"\n\n echo \"Quitting application '$bundle_id'...\"\n\n # try to quit the application within the timeout period\n local quit_success=false\n SECONDS=0\n while (( SECONDS < timeout_duration )); do\n if osascript -e \"tell application id \\\"$bundle_id\\\" to quit\" >/dev/null 2>&1; then\n if ! pgrep -f \"$bundle_id\" >/dev/null 2>&1; then\n echo \"Application '$bundle_id' quit successfully.\"\n quit_success=true\n break\n fi\n fi\n sleep 1\n done\n\n if [[ \"$quit_success\" = false ]]; then\n echo \"Application '$bundle_id' did not quit.\"\n fi\n}\n\n\nrelaunch_application() {\n local bundle_id=\"$1\"\n local var_name=\"APP_WAS_RUNNING_$(echo \"$bundle_id\" | tr '.-' '__')\"\n local was_running\n\n # Check if the app was running before installation\n eval \"was_running=\\$$var_name\"\n if [[ \"$was_running\" != \"1\" ]]; then\n return\n fi\n\n local console_user\n console_user=$(stat -f \"%Su\" /dev/console)\n if [[ -z \"$console_user\" || \"$console_user\" == \"root\" || \"$console_user\" == \"loginwindow\" ]]; then\n echo \"Not logged into a non-root GUI; skipping relaunching application ID '$bundle_id'.\"\n return\n fi\n\n echo \"Relaunching application '$bundle_id'...\"\n\n # Launch the app in the logged-in user's GUI session. Apps launched by root\n # won't register with the user's Dock/GUI, so run 'open' as the console user.\n # Use 'launchctl asuser' to bootstrap into the console user's Mach namespace\n # and GUI session — 'sudo -u' alone doesn't do this, which can cause\n # LSOpenURLsWithRole() failures even when 'open' exits 0.\n local open_status=0\n if [[ $EUID -eq 0 ]]; then\n local console_uid\n console_uid=$(id -u \"$console_user\")\n /bin/launchctl asuser \"$console_uid\" sudo -u \"$console_user\" open -b \"$bundle_id\" >/dev/null 2>&1 || open_status=$?\n else\n open -b \"$bundle_id\" >/dev/null 2>&1 || open_status=$?\n fi\n\n if [[ $open_status -eq 0 ]]; then\n echo \"Application '$bundle_id' relaunched successfully.\"\n else\n echo \"Failed to relaunch application '$bundle_id'.\"\n fi\n}\n\n\n# install pkg files\nquit_and_track_application 'com.github.macadmins.Nudge'\nsudo installer -pkg \"$TMPDIR/Nudge-2.1.3.81860.pkg\" -target / || exit $?\nrelaunch_application 'com.github.macadmins.Nudge'\n" } } diff --git a/ee/maintained-apps/outputs/plex-media-server/darwin.json b/ee/maintained-apps/outputs/plex-media-server/darwin.json index ceb3de7b64e..27123cd6055 100644 --- a/ee/maintained-apps/outputs/plex-media-server/darwin.json +++ b/ee/maintained-apps/outputs/plex-media-server/darwin.json @@ -1,15 +1,15 @@ { "versions": [ { - "version": "1.43.3.10828", + "version": "1.43.3.10861", "queries": { "exists": "SELECT 1 FROM apps WHERE bundle_identifier = 'com.plexapp.plexmediaserver';", - "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'com.plexapp.plexmediaserver' AND version_compare(bundle_short_version, '1.43.3.10828') < 0);" + "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'com.plexapp.plexmediaserver' AND version_compare(bundle_short_version, '1.43.3.10861') < 0);" }, - "installer_url": "https://downloads.plex.tv/plex-media-server-new/1.43.3.10828-00f62d37d/macos/PlexMediaServer-1.43.3.10828-00f62d37d-universal.zip", + "installer_url": "https://downloads.plex.tv/plex-media-server-new/1.43.3.10861-07dfddaeb/macos/PlexMediaServer-1.43.3.10861-07dfddaeb-universal.zip", "install_script_ref": "87eb0241", "uninstall_script_ref": "2c6d641f", - "sha256": "32f014ca977e856d2bd28c7a86d2f7effdc6d7fa7b83eec3a212845c7b5bebe8", + "sha256": "bf6b1466dbef552457b49be68e54020198987ea498622ec7cf95ae8252b243ee", "default_categories": [ "Productivity" ] diff --git a/ee/maintained-apps/outputs/reqable/windows.json b/ee/maintained-apps/outputs/reqable/windows.json index 923fda6a7c1..3842c7093af 100644 --- a/ee/maintained-apps/outputs/reqable/windows.json +++ b/ee/maintained-apps/outputs/reqable/windows.json @@ -1,15 +1,15 @@ { "versions": [ { - "version": "3.2.17", + "version": "3.2.19", "queries": { "exists": "SELECT 1 FROM programs WHERE name = 'Reqable' AND publisher = 'Reqqable Inc.';", - "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM programs WHERE name = 'Reqable' AND publisher = 'Reqqable Inc.' AND version_compare(version, '3.2.17') < 0);" + "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM programs WHERE name = 'Reqable' AND publisher = 'Reqqable Inc.' AND version_compare(version, '3.2.19') < 0);" }, - "installer_url": "https://github.com/reqable/reqable-app/releases/download/3.2.17/reqable-app-windows-x86_64.exe", + "installer_url": "https://github.com/reqable/reqable-app/releases/download/3.2.19/reqable-app-windows-x86_64.exe", "install_script_ref": "d2ffec58", "uninstall_script_ref": "b33fc442", - "sha256": "de2f8b54a1feb835963ecd1d3fd5579d39381383441ca7faa80fb8c1e4d6668c", + "sha256": "4c06b80481a21b41b9c10e6675fdbb57dc9e98437e6192414e8c598f7b1c6203", "default_categories": [ "Developer tools" ] diff --git a/ee/maintained-apps/outputs/santa/darwin.json b/ee/maintained-apps/outputs/santa/darwin.json index 826cc362ddc..cd2c6ad62f3 100644 --- a/ee/maintained-apps/outputs/santa/darwin.json +++ b/ee/maintained-apps/outputs/santa/darwin.json @@ -1,15 +1,15 @@ { "versions": [ { - "version": "2026.6", + "version": "2026.7", "queries": { "exists": "SELECT 1 FROM apps WHERE bundle_identifier = 'com.northpolesec.santa';", - "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'com.northpolesec.santa' AND version_compare(bundle_short_version, '2026.6') < 0);" + "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'com.northpolesec.santa' AND version_compare(bundle_short_version, '2026.7') < 0);" }, - "installer_url": "https://github.com/northpolesec/santa/releases/download/2026.6/santa-2026.6.dmg", - "install_script_ref": "e01d4393", + "installer_url": "https://github.com/northpolesec/santa/releases/download/2026.7/santa-2026.7.dmg", + "install_script_ref": "a542a793", "uninstall_script_ref": "8bd95da7", - "sha256": "7a0bc3a01bd9b3f1fdd5e870aff79eeda88f62e55e1b28200b5d1cda5710e081", + "sha256": "8504918fb6c00e23980f4c6d6037db07f4928e424181550d9c16b2a550b893ad", "default_categories": [ "Productivity" ] @@ -17,6 +17,6 @@ ], "refs": { "8bd95da7": "#!/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\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.northpolesec.santa'\nremove_launchctl_service 'com.northpolesec.santa.bundleservice'\nremove_launchctl_service 'com.northpolesec.santa.metricservice'\nremove_launchctl_service 'com.northpolesec.santa.syncservice'\nremove_launchctl_service 'com.northpolesec.santad'\nremove_pkg_files 'com.northpolesec.santa'\nforget_pkg 'com.northpolesec.santa'\nsudo rm -rf '/Applications/Santa.app'\nsudo rm -rf '/usr/local/bin/santactl'\nsudo rm -rf '/var/db/santa'\nsudo rm -rf '/var/log/santa*'\ntrash $LOGGED_IN_USER '/private/etc/asl/com.northpolesec.santa.asl.conf'\ntrash $LOGGED_IN_USER '/private/etc/newsyslog.d/com.northpolesec.santa.newsyslog.conf'\n", - "e01d4393": "#!/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.northpolesec.santa'\nsudo installer -pkg \"$TMPDIR/santa-2026.6.pkg\" -target / || exit $?\nrelaunch_application 'com.northpolesec.santa'\n" + "a542a793": "#!/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.northpolesec.santa'\nsudo installer -pkg \"$TMPDIR/santa-2026.7.pkg\" -target / || exit $?\nrelaunch_application 'com.northpolesec.santa'\n" } } diff --git a/ee/maintained-apps/outputs/superwhisper/darwin.json b/ee/maintained-apps/outputs/superwhisper/darwin.json index 3327cb94c85..570a7568dbd 100644 --- a/ee/maintained-apps/outputs/superwhisper/darwin.json +++ b/ee/maintained-apps/outputs/superwhisper/darwin.json @@ -1,15 +1,15 @@ { "versions": [ { - "version": "2.17.0", + "version": "2.17.1", "queries": { "exists": "SELECT 1 FROM apps WHERE bundle_identifier = 'com.superduper.superwhisper';", - "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'com.superduper.superwhisper' AND version_compare(bundle_short_version, '2.17.0') < 0);" + "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'com.superduper.superwhisper' AND version_compare(bundle_short_version, '2.17.1') < 0);" }, - "installer_url": "https://builds.superwhisper.com/v2.17.0/superwhisper.zip", + "installer_url": "https://builds.superwhisper.com/v2.17.1/superwhisper.zip", "install_script_ref": "8f427eb4", "uninstall_script_ref": "27ca9133", - "sha256": "7fb59708a77a3f3661356aafddf25db21f28ac3fbfb8f4be29f835708a7d85a4", + "sha256": "85a83aec8322269c7b0b18c12441e739c9795402bfa5d544e00f6037530f9597", "default_categories": [ "Productivity" ] diff --git a/ee/maintained-apps/outputs/thunderbird/darwin.json b/ee/maintained-apps/outputs/thunderbird/darwin.json index ccdd7f869b8..dba472177ef 100644 --- a/ee/maintained-apps/outputs/thunderbird/darwin.json +++ b/ee/maintained-apps/outputs/thunderbird/darwin.json @@ -1,15 +1,15 @@ { "versions": [ { - "version": "153.0.1", + "version": "153.0.2", "queries": { "exists": "SELECT 1 FROM apps WHERE bundle_identifier = 'org.mozilla.thunderbird';", - "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'org.mozilla.thunderbird' AND version_compare(bundle_short_version, '153.0.1') < 0);" + "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'org.mozilla.thunderbird' AND version_compare(bundle_short_version, '153.0.2') < 0);" }, - "installer_url": "https://download-installer.cdn.mozilla.net/pub/thunderbird/releases/153.0.1/mac/en-US/Thunderbird%20153.0.1.dmg", + "installer_url": "https://download-installer.cdn.mozilla.net/pub/thunderbird/releases/153.0.2/mac/en-US/Thunderbird%20153.0.2.dmg", "install_script_ref": "7ab956d5", "uninstall_script_ref": "907ef18f", - "sha256": "5a44fbd04f50cdf6de457b17126b37df2e7fd56379b762c65b8c9a7163818d38", + "sha256": "8e5e46242201a843070872e371acfb7467be34b48c982691b779a52bdc80b775", "default_categories": [ "Productivity" ] diff --git a/ee/maintained-apps/outputs/thunderbird/windows.json b/ee/maintained-apps/outputs/thunderbird/windows.json index 58012363033..f314cba6d58 100644 --- a/ee/maintained-apps/outputs/thunderbird/windows.json +++ b/ee/maintained-apps/outputs/thunderbird/windows.json @@ -1,15 +1,15 @@ { "versions": [ { - "version": "153.0.1", + "version": "153.0.2", "queries": { "exists": "SELECT 1 FROM programs WHERE name = 'Mozilla Thunderbird (x64 en-US)' AND publisher = 'Mozilla';", - "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM programs WHERE name = 'Mozilla Thunderbird (x64 en-US)' AND publisher = 'Mozilla' AND version_compare(version, '153.0.1') < 0);" + "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM programs WHERE name = 'Mozilla Thunderbird (x64 en-US)' AND publisher = 'Mozilla' AND version_compare(version, '153.0.2') < 0);" }, - "installer_url": "https://download-installer.cdn.mozilla.net/pub/thunderbird/releases/153.0.1/win64/en-US/Thunderbird%20Setup%20153.0.1.exe", + "installer_url": "https://download-installer.cdn.mozilla.net/pub/thunderbird/releases/153.0.2/win64/en-US/Thunderbird%20Setup%20153.0.2.exe", "install_script_ref": "26f2daf8", "uninstall_script_ref": "96113731", - "sha256": "744a51965ae6fe36a7ec660d8c080fd108cca732e9aec3f9a31324321c6be1ca", + "sha256": "aaa4fbe7e605594c5d75d5c97392e7226c77ecc1683abfb7f26b81d1a1d5da1e", "default_categories": [ "Productivity" ] diff --git a/ee/maintained-apps/outputs/todoist-app/darwin.json b/ee/maintained-apps/outputs/todoist-app/darwin.json index 54722ca4d03..fc8eb7265e4 100644 --- a/ee/maintained-apps/outputs/todoist-app/darwin.json +++ b/ee/maintained-apps/outputs/todoist-app/darwin.json @@ -1,15 +1,15 @@ { "versions": [ { - "version": "9.29.1", + "version": "9.30.0", "queries": { "exists": "SELECT 1 FROM apps WHERE bundle_identifier = 'com.todoist.mac.Todoist';", - "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'com.todoist.mac.Todoist' AND version_compare(bundle_short_version, '9.29.1') < 0);" + "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'com.todoist.mac.Todoist' AND version_compare(bundle_short_version, '9.30.0') < 0);" }, - "installer_url": "https://electron-dl.todoist.com/mac/Todoist-darwin-9.29.1-arm64-latest.dmg", + "installer_url": "https://electron-dl.todoist.com/mac/Todoist-darwin-9.30.0-arm64-latest.dmg", "install_script_ref": "f59ee413", "uninstall_script_ref": "1da1bede", - "sha256": "1f9291fab9e9713c7db890ae02906f19f04a83b9288fbcb2cd101b471592edf1", + "sha256": "3b0bdee906488c4f35588a2c9150df11f2c06fc5118e5661ee723d1f2eaad0c8", "default_categories": [ "Productivity" ] diff --git a/ee/maintained-apps/outputs/todoist-app/windows.json b/ee/maintained-apps/outputs/todoist-app/windows.json index b59eb396519..12460d6dfa9 100644 --- a/ee/maintained-apps/outputs/todoist-app/windows.json +++ b/ee/maintained-apps/outputs/todoist-app/windows.json @@ -1,15 +1,15 @@ { "versions": [ { - "version": "9.29.1", + "version": "9.30.0", "queries": { "exists": "SELECT 1 FROM programs WHERE name = 'Todoist' AND publisher = 'Doist';", - "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM programs WHERE name = 'Todoist' AND publisher = 'Doist' AND version_compare(version, '9.29.1') < 0);" + "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM programs WHERE name = 'Todoist' AND publisher = 'Doist' AND version_compare(version, '9.30.0') < 0);" }, - "installer_url": "https://electron-dl.todoist.net/windows/Todoist-win32-9.29.1-x64-latest.exe", + "installer_url": "https://electron-dl.todoist.net/windows/Todoist-win32-9.30.0-x64-latest.exe", "install_script_ref": "7ad1f815", "uninstall_script_ref": "3d6caa33", - "sha256": "0ded933c3af299075979786a1e785b7996cc08522701a677ce8195071b12b6c3", + "sha256": "a869f085490a99145852e1738995ea428e0ca9324b54710b0d4f9e7033c98e77", "default_categories": [ "Productivity" ] diff --git a/ee/maintained-apps/outputs/trezor-suite/darwin.json b/ee/maintained-apps/outputs/trezor-suite/darwin.json index 35dc7c6d23c..435147c2cb1 100644 --- a/ee/maintained-apps/outputs/trezor-suite/darwin.json +++ b/ee/maintained-apps/outputs/trezor-suite/darwin.json @@ -1,15 +1,15 @@ { "versions": [ { - "version": "26.7.3", + "version": "26.7.4", "queries": { "exists": "SELECT 1 FROM apps WHERE bundle_identifier = 'io.trezor.TrezorSuite';", - "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'io.trezor.TrezorSuite' AND version_compare(bundle_short_version, '26.7.3') < 0);" + "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'io.trezor.TrezorSuite' AND version_compare(bundle_short_version, '26.7.4') < 0);" }, - "installer_url": "https://data.trezor.io/suite/releases/desktop/latest/Trezor-Suite-26.7.3-mac-arm64.dmg", + "installer_url": "https://data.trezor.io/suite/releases/desktop/latest/Trezor-Suite-26.7.4-mac-arm64.dmg", "install_script_ref": "3f139099", "uninstall_script_ref": "9026a399", - "sha256": "bc77bde31935f9dc1148ae43e365da981ed55d25c4c3b1e4ebc14b7e76dac1b3", + "sha256": "606d6c00bc97e48c24dd1821c4568f822812f71a9204f324662ac3c18305b999", "default_categories": [ "Security" ] diff --git a/ee/maintained-apps/outputs/webex/windows.json b/ee/maintained-apps/outputs/webex/windows.json index 569f60158ac..c642cab212f 100644 --- a/ee/maintained-apps/outputs/webex/windows.json +++ b/ee/maintained-apps/outputs/webex/windows.json @@ -1,15 +1,15 @@ { "versions": [ { - "version": "46.7.0.35472", + "version": "46.8.0.35593", "queries": { "exists": "SELECT 1 FROM programs WHERE name = 'Cisco Webex' AND publisher = 'Cisco Systems, Inc';", - "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM programs WHERE name = 'Cisco Webex' AND publisher = 'Cisco Systems, Inc' AND version_compare(version, '46.7.0.35472') < 0);" + "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM programs WHERE name = 'Cisco Webex' AND publisher = 'Cisco Systems, Inc' AND version_compare(version, '46.8.0.35593') < 0);" }, - "installer_url": "https://binaries.webex.com/WebexDesktop-Win-64-Gold/20260721115417/Webex.msi", + "installer_url": "https://binaries.webex.com/WebexDesktop-Win-64-Gold/20260804173554/Webex.msi", "install_script_ref": "22e48c46", "uninstall_script_ref": "9832a568", - "sha256": "f70c0046b2acf91acca5f8c3b3cae8ed76033e668f3303b118e1bade94326aaa", + "sha256": "9d5a42e890838c3fdf1ee679bc691ba93cd5774c86793ce7409c5dce0fd44947", "default_categories": [ "Communication" ], diff --git a/ee/maintained-apps/outputs/whatsapp/darwin.json b/ee/maintained-apps/outputs/whatsapp/darwin.json index 7b228920bea..98159ea0f85 100644 --- a/ee/maintained-apps/outputs/whatsapp/darwin.json +++ b/ee/maintained-apps/outputs/whatsapp/darwin.json @@ -1,10 +1,10 @@ { "versions": [ { - "version": "26.31.14", + "version": "26.31.16", "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.31.14') < 0);" + "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'net.whatsapp.WhatsApp' AND version_compare(bundle_short_version, '26.31.16') < 0);" }, "installer_url": "https://web.whatsapp.com/desktop/mac_native/release/?configuration=Release&src=whatsapp_downloads_page", "install_script_ref": "e288a4cd", diff --git a/ee/maintained-apps/outputs/wispr-flow/darwin.json b/ee/maintained-apps/outputs/wispr-flow/darwin.json index d01ec0e9093..862639d73df 100644 --- a/ee/maintained-apps/outputs/wispr-flow/darwin.json +++ b/ee/maintained-apps/outputs/wispr-flow/darwin.json @@ -1,15 +1,15 @@ { "versions": [ { - "version": "1.6.326", + "version": "1.6.399", "queries": { "exists": "SELECT 1 FROM apps WHERE bundle_identifier = 'com.electron.wispr-flow';", - "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'com.electron.wispr-flow' AND version_compare(bundle_short_version, '1.6.326') < 0);" + "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'com.electron.wispr-flow' AND version_compare(bundle_short_version, '1.6.399') < 0);" }, - "installer_url": "https://dl.wisprflow.com/wispr-flow/darwin/arm64/dmgs/Flow-v1.6.326.dmg", + "installer_url": "https://dl.wisprflow.com/wispr-flow/darwin/arm64/dmgs/Flow-v1.6.399.dmg", "install_script_ref": "a95fa7bb", "uninstall_script_ref": "e0cf2e96", - "sha256": "e86e4fed4be5b321e87eec8ff21cd42a161183f18ac48df9a8182ce1f07f5d90", + "sha256": "483a169acf5080a78883af8a51589033daa159f99aaf903d28ab74fbba0642d3", "default_categories": [ "Productivity" ] diff --git a/ee/maintained-apps/outputs/workflowy/darwin.json b/ee/maintained-apps/outputs/workflowy/darwin.json index 755c1433dda..8db37b5c79a 100644 --- a/ee/maintained-apps/outputs/workflowy/darwin.json +++ b/ee/maintained-apps/outputs/workflowy/darwin.json @@ -1,15 +1,15 @@ { "versions": [ { - "version": "4.3.2607301322", + "version": "4.3.2608041311", "queries": { "exists": "SELECT 1 FROM apps WHERE bundle_identifier = 'com.workflowy.desktop';", - "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'com.workflowy.desktop' AND version_compare(bundle_short_version, '4.3.2607301322') < 0);" + "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'com.workflowy.desktop' AND version_compare(bundle_short_version, '4.3.2608041311') < 0);" }, - "installer_url": "https://github.com/workflowy/desktop/releases/download/v4.3.2607301322/WorkFlowy.zip", + "installer_url": "https://github.com/workflowy/desktop/releases/download/v4.3.2608041311/WorkFlowy.zip", "install_script_ref": "b65ecb27", "uninstall_script_ref": "71fe81c3", - "sha256": "ec768dce4843dcf923151eebe22d6b56a467792cc9269649e64c237fbb8c343e", + "sha256": "602a8b9336b3da3ec4d496f648cca88004e5cfdf993405aa26358be606644b6a", "default_categories": [ "Productivity" ] diff --git a/ee/maintained-apps/outputs/xnconvert/windows.json b/ee/maintained-apps/outputs/xnconvert/windows.json index a3d070349cc..2a5cf522394 100644 --- a/ee/maintained-apps/outputs/xnconvert/windows.json +++ b/ee/maintained-apps/outputs/xnconvert/windows.json @@ -1,15 +1,15 @@ { "versions": [ { - "version": "1.112.0.0", + "version": "1.114.0.0", "queries": { "exists": "SELECT 1 FROM programs WHERE name = 'XnConvert' AND publisher = 'Pierre-e Gougelet';", - "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM programs WHERE name = 'XnConvert' AND publisher = 'Pierre-e Gougelet' AND version_compare(version, '1.112.0.0') < 0);" + "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM programs WHERE name = 'XnConvert' AND publisher = 'Pierre-e Gougelet' AND version_compare(version, '1.114.0.0') < 0);" }, - "installer_url": "https://download.xnview.com/old_versions/XnConvert/XnConvert-1.112.0-win-x64.exe", + "installer_url": "https://download.xnview.com/old_versions/XnConvert/XnConvert-1.114.0-win-x64.exe", "install_script_ref": "7eb6b47e", "uninstall_script_ref": "1714e167", - "sha256": "aa9e31e7274e41e063dcae8dafe0df1a7e2b06d9d74791274d5ccabe81729504", + "sha256": "5d8d49122d4a2ad001a3329acd60695beb5e0e9fb5adb74a65cfc41b012ee5b8", "default_categories": [ "Productivity" ]