diff --git a/ee/maintained-apps/inputs/homebrew/filemaker-pro.json b/ee/maintained-apps/inputs/homebrew/filemaker-pro.json new file mode 100644 index 0000000000..2e24f93d8b --- /dev/null +++ b/ee/maintained-apps/inputs/homebrew/filemaker-pro.json @@ -0,0 +1,8 @@ +{ + "name": "FileMaker Pro", + "unique_identifier": "com.filemaker.client.pro12", + "token": "filemaker-pro", + "installer_format": "dmg", + "slug": "filemaker-pro/darwin", + "default_categories": ["Developer tools"] +} diff --git a/ee/maintained-apps/inputs/homebrew/nordpass.json b/ee/maintained-apps/inputs/homebrew/nordpass.json new file mode 100644 index 0000000000..273a08a87d --- /dev/null +++ b/ee/maintained-apps/inputs/homebrew/nordpass.json @@ -0,0 +1,8 @@ +{ + "name": "NordPass", + "unique_identifier": "com.nordsec.nordpass", + "token": "nordpass", + "installer_format": "dmg", + "slug": "nordpass/darwin", + "default_categories": ["Productivity"] +} diff --git a/ee/maintained-apps/inputs/homebrew/obs.json b/ee/maintained-apps/inputs/homebrew/obs.json new file mode 100644 index 0000000000..4a10e636f3 --- /dev/null +++ b/ee/maintained-apps/inputs/homebrew/obs.json @@ -0,0 +1,8 @@ +{ + "name": "OBS", + "unique_identifier": "com.obsproject.obs-studio", + "token": "obs", + "installer_format": "dmg", + "slug": "obs/darwin", + "default_categories": ["Productivity"] +} diff --git a/ee/maintained-apps/inputs/homebrew/obsidian.json b/ee/maintained-apps/inputs/homebrew/obsidian.json new file mode 100644 index 0000000000..42591f1ac0 --- /dev/null +++ b/ee/maintained-apps/inputs/homebrew/obsidian.json @@ -0,0 +1,8 @@ +{ + "name": "Obsidian", + "unique_identifier": "md.obsidian", + "token": "obsidian", + "installer_format": "dmg", + "slug": "obsidian/darwin", + "default_categories": ["Productivity"] +} diff --git a/ee/maintained-apps/inputs/homebrew/orbstack.json b/ee/maintained-apps/inputs/homebrew/orbstack.json new file mode 100644 index 0000000000..32be7fb789 --- /dev/null +++ b/ee/maintained-apps/inputs/homebrew/orbstack.json @@ -0,0 +1,8 @@ +{ + "name": "OrbStack", + "unique_identifier": "dev.kdrag0n.MacVirt", + "token": "orbstack", + "installer_format": "dmg", + "slug": "orbstack/darwin", + "default_categories": ["Developer tools"] +} diff --git a/ee/maintained-apps/inputs/homebrew/pgadmin4.json b/ee/maintained-apps/inputs/homebrew/pgadmin4.json new file mode 100644 index 0000000000..41ff81d98d --- /dev/null +++ b/ee/maintained-apps/inputs/homebrew/pgadmin4.json @@ -0,0 +1,8 @@ +{ + "name": "pgAdmin4", + "unique_identifier": "org.pgadmin.pgadmin4", + "token": "pgadmin4", + "installer_format": "dmg", + "slug": "pgadmin4/darwin", + "default_categories": ["Developer tools"] +} diff --git a/ee/maintained-apps/inputs/homebrew/rapidapi.json b/ee/maintained-apps/inputs/homebrew/rapidapi.json new file mode 100644 index 0000000000..32b9258af9 --- /dev/null +++ b/ee/maintained-apps/inputs/homebrew/rapidapi.json @@ -0,0 +1,8 @@ +{ + "name": "RapidAPI", + "unique_identifier": "com.luckymarmot.Paw", + "token": "rapidapi", + "installer_format": "zip", + "slug": "rapidapi/darwin", + "default_categories": ["Developer tools"] +} diff --git a/ee/maintained-apps/inputs/homebrew/royal-tsx.json b/ee/maintained-apps/inputs/homebrew/royal-tsx.json new file mode 100644 index 0000000000..252ca065c8 --- /dev/null +++ b/ee/maintained-apps/inputs/homebrew/royal-tsx.json @@ -0,0 +1,9 @@ +{ + "name": "Royal TSX", + "unique_identifier": "com.lemonmojo.RoyalTSX.App", + "token": "royal-tsx", + "installer_format": "dmg", + "slug": "royal-tsx/darwin", + "default_categories": ["Productivity"], + "install_script_path": "ee/maintained-apps/inputs/homebrew/scripts/royal-tsx-install.sh" +} diff --git a/ee/maintained-apps/inputs/homebrew/scripts/royal-tsx-install.sh b/ee/maintained-apps/inputs/homebrew/scripts/royal-tsx-install.sh new file mode 100755 index 0000000000..cb188bad16 --- /dev/null +++ b/ee/maintained-apps/inputs/homebrew/scripts/royal-tsx-install.sh @@ -0,0 +1,59 @@ +#!/bin/sh + +# variables +APPDIR="/Applications/" +TMPDIR=$(dirname "$(realpath $INSTALLER_PATH)") + +# functions + +quit_application() { + local bundle_id="$1" + local timeout_duration=10 + + # check if the application is running + if ! osascript -e "application id \"$bundle_id\" is running" 2>/dev/null; then + return + fi + + local console_user + console_user=$(stat -f "%Su" /dev/console) + if [[ $EUID -eq 0 && "$console_user" == "root" ]]; then + echo "Not logged into a non-root GUI; skipping quitting application ID '$bundle_id'." + return + fi + + echo "Quitting application '$bundle_id'..." + + # try to quit the application within the timeout period + local quit_success=false + SECONDS=0 + while (( SECONDS < timeout_duration )); do + if osascript -e "tell application id \"$bundle_id\" to quit" >/dev/null 2>&1; then + if ! pgrep -f "$bundle_id" >/dev/null 2>&1; then + echo "Application '$bundle_id' quit successfully." + quit_success=true + break + fi + fi + sleep 1 + done + + if [[ "$quit_success" = false ]]; then + echo "Application '$bundle_id' did not quit." + fi +} + +# extract contents +# Use 'yes' to automatically accept license agreement when mounting DMG +# This replicates Homebrew's behavior for DMG files with license agreements +MOUNT_POINT=$(mktemp -d /tmp/dmg_mount_XXXXXX) +yes | hdiutil attach -plist -nobrowse -readonly -mountpoint "$MOUNT_POINT" "$INSTALLER_PATH" || exit 1 +sudo cp -R "$MOUNT_POINT"/* "$TMPDIR" +hdiutil detach "$MOUNT_POINT" || true + +# copy to the applications folder +quit_application 'com.lemonmojo.RoyalTSX.App' +if [ -d "$APPDIR/Royal TSX.app" ]; then + sudo mv "$APPDIR/Royal TSX.app" "$TMPDIR/Royal TSX.app.bkp" +fi +sudo cp -R "$TMPDIR/Royal TSX.app" "$APPDIR" diff --git a/ee/maintained-apps/inputs/homebrew/shottr.json b/ee/maintained-apps/inputs/homebrew/shottr.json new file mode 100644 index 0000000000..c019dc68e9 --- /dev/null +++ b/ee/maintained-apps/inputs/homebrew/shottr.json @@ -0,0 +1,8 @@ +{ + "name": "Shottr", + "unique_identifier": "cc.ffitch.shottr", + "token": "shottr", + "installer_format": "dmg", + "slug": "shottr/darwin", + "default_categories": ["Productivity"] +} diff --git a/ee/maintained-apps/inputs/homebrew/splashtop-business.json b/ee/maintained-apps/inputs/homebrew/splashtop-business.json new file mode 100644 index 0000000000..08882296c5 --- /dev/null +++ b/ee/maintained-apps/inputs/homebrew/splashtop-business.json @@ -0,0 +1,8 @@ +{ + "name": "Splashtop Business", + "unique_identifier": "com.splashtop.stb.macosx", + "token": "splashtop-business", + "installer_format": "dmg", + "slug": "splashtop-business/darwin", + "default_categories": ["Productivity"] +} diff --git a/ee/maintained-apps/inputs/homebrew/splashtop-streamer.json b/ee/maintained-apps/inputs/homebrew/splashtop-streamer.json new file mode 100644 index 0000000000..530e59d515 --- /dev/null +++ b/ee/maintained-apps/inputs/homebrew/splashtop-streamer.json @@ -0,0 +1,8 @@ +{ + "name": "Splashtop Streamer", + "unique_identifier": "com.splashtop.Splashtop-Streamer", + "token": "splashtop-streamer", + "installer_format": "dmg", + "slug": "splashtop-streamer/darwin", + "default_categories": ["Productivity"] +} diff --git a/ee/maintained-apps/inputs/homebrew/stats.json b/ee/maintained-apps/inputs/homebrew/stats.json new file mode 100644 index 0000000000..ead5e0d0ab --- /dev/null +++ b/ee/maintained-apps/inputs/homebrew/stats.json @@ -0,0 +1,8 @@ +{ + "name": "Stats", + "unique_identifier": "eu.exelban.Stats", + "token": "stats", + "installer_format": "dmg", + "slug": "stats/darwin", + "default_categories": ["Productivity"] +} diff --git a/ee/maintained-apps/inputs/homebrew/sublime-merge.json b/ee/maintained-apps/inputs/homebrew/sublime-merge.json new file mode 100644 index 0000000000..0e092d5e17 --- /dev/null +++ b/ee/maintained-apps/inputs/homebrew/sublime-merge.json @@ -0,0 +1,8 @@ +{ + "name": "Sublime Merge", + "unique_identifier": "com.sublimemerge", + "token": "sublime-merge", + "installer_format": "zip", + "slug": "sublime-merge/darwin", + "default_categories": ["Developer tools"] +} diff --git a/ee/maintained-apps/inputs/homebrew/surfshark.json b/ee/maintained-apps/inputs/homebrew/surfshark.json new file mode 100644 index 0000000000..119231d956 --- /dev/null +++ b/ee/maintained-apps/inputs/homebrew/surfshark.json @@ -0,0 +1,8 @@ +{ + "name": "Surfshark", + "unique_identifier": "com.surfshark.vpnclient.macos.direct", + "token": "surfshark", + "installer_format": "dmg", + "slug": "surfshark/darwin", + "default_categories": ["Productivity"] +} diff --git a/ee/maintained-apps/inputs/homebrew/suspicious-package.json b/ee/maintained-apps/inputs/homebrew/suspicious-package.json new file mode 100644 index 0000000000..562264d673 --- /dev/null +++ b/ee/maintained-apps/inputs/homebrew/suspicious-package.json @@ -0,0 +1,8 @@ +{ + "name": "Suspicious Package", + "unique_identifier": "com.mothersruin.SuspiciousPackage", + "token": "suspicious-package", + "installer_format": "dmg", + "slug": "suspicious-package/darwin", + "default_categories": ["Developer tools"] +} diff --git a/ee/maintained-apps/outputs/apps.json b/ee/maintained-apps/outputs/apps.json index 333f1a7795..f90d1160c0 100644 --- a/ee/maintained-apps/outputs/apps.json +++ b/ee/maintained-apps/outputs/apps.json @@ -561,6 +561,13 @@ "unique_identifier": "Figma", "description": "Figma is a collaborative design tool for teams to create, prototype, and share designs in real time." }, + { + "name": "FileMaker Pro", + "slug": "filemaker-pro/darwin", + "platform": "darwin", + "unique_identifier": "com.filemaker.client.pro12", + "description": "FileMaker Pro is a relational database and rapid application development platform." + }, { "name": "Mozilla Firefox", "slug": "firefox/darwin", @@ -932,6 +939,13 @@ "unique_identifier": "com.oracle.workbench.MySQLWorkbench", "description": "MySQL Workbench is a visual tool to design, develop and administer MySQL servers." }, + { + "name": "NordPass", + "slug": "nordpass/darwin", + "platform": "darwin", + "unique_identifier": "com.nordsec.nordpass", + "description": "NordPass is a password manager." + }, { "name": "NordVPN", "slug": "nordvpn/darwin", @@ -967,6 +981,20 @@ "unique_identifier": "com.github.macadmins.Nudge", "description": "Nudge is an application for enforcing OS updates." }, + { + "name": "OBS", + "slug": "obs/darwin", + "platform": "darwin", + "unique_identifier": "com.obsproject.obs-studio", + "description": "OBS is open-source software for live streaming and screen recording." + }, + { + "name": "Obsidian", + "slug": "obsidian/darwin", + "platform": "darwin", + "unique_identifier": "md.obsidian", + "description": "Obsidian is a knowledge base that works on top of a local folder of plain text Markdown files." + }, { "name": "OmniGraffle", "slug": "omnigraffle/darwin", @@ -995,6 +1023,13 @@ "unique_identifier": "com.operasoftware.Opera", "description": "Opera is a web browser." }, + { + "name": "OrbStack", + "slug": "orbstack/darwin", + "platform": "darwin", + "unique_identifier": "dev.kdrag0n.MacVirt", + "description": "OrbStack is a replacement for Docker Desktop." + }, { "name": "P4V", "slug": "p4v/darwin", @@ -1009,6 +1044,13 @@ "unique_identifier": "com.parallels.desktop.console", "description": "Parallels Desktop is virtualization software." }, + { + "name": "pgAdmin4", + "slug": "pgadmin4/darwin", + "platform": "darwin", + "unique_identifier": "org.pgadmin.pgadmin4", + "description": "pgAdmin4 is an administration and development platform for PostgreSQL." + }, { "name": "PhpStorm", "slug": "phpstorm/darwin", @@ -1086,6 +1128,13 @@ "unique_identifier": "io.rancherdesktop.app", "description": "Rancher Desktop is an app for kubernetes and container management on the desktop." }, + { + "name": "RapidAPI", + "slug": "rapidapi/darwin", + "platform": "darwin", + "unique_identifier": "com.luckymarmot.Paw", + "description": "RapidAPI is an HTTP client that helps testing and describing APIs." + }, { "name": "Raycast", "slug": "raycast/darwin", @@ -1107,6 +1156,13 @@ "unique_identifier": "com.jetbrains.rider", "description": "Rider is a .NET IDE by JetBrains." }, + { + "name": "Royal TSX", + "slug": "royal-tsx/darwin", + "platform": "darwin", + "unique_identifier": "com.lemonmojo.RoyalTSX.App", + "description": "Royal TSX is a remote management solution." + }, { "name": "RubyMine", "slug": "rubymine/darwin", @@ -1128,6 +1184,13 @@ "unique_identifier": "com.northpolesec.santa", "description": "Santa is a binary authorization system for macOS." }, + { + "name": "Shottr", + "slug": "shottr/darwin", + "platform": "darwin", + "unique_identifier": "cc.ffitch.shottr", + "description": "Shottr is a screenshot measurement and annotation tool." + }, { "name": "Signal", "slug": "signal/darwin", @@ -1170,6 +1233,20 @@ "unique_identifier": "com.torusknot.SourceTreeNotMAS", "description": "SourceTree is a graphical client for Git version control." }, + { + "name": "Splashtop Business", + "slug": "splashtop-business/darwin", + "platform": "darwin", + "unique_identifier": "com.splashtop.stb.macosx", + "description": "Splashtop Business is remote access software." + }, + { + "name": "Splashtop Streamer", + "slug": "splashtop-streamer/darwin", + "platform": "darwin", + "unique_identifier": "com.splashtop.Splashtop-Streamer", + "description": "Splashtop Streamer is used to connect to and control computers." + }, { "name": "Spotify", "slug": "spotify/darwin", @@ -1177,6 +1254,20 @@ "unique_identifier": "com.spotify.client", "description": "Spotify is a music streaming app." }, + { + "name": "Stats", + "slug": "stats/darwin", + "platform": "darwin", + "unique_identifier": "eu.exelban.Stats", + "description": "Stats is a system monitor for the menu bar." + }, + { + "name": "Sublime Merge", + "slug": "sublime-merge/darwin", + "platform": "darwin", + "unique_identifier": "com.sublimemerge", + "description": "Sublime Merge is a git client." + }, { "name": "Sublime Text", "slug": "sublime-text/darwin", @@ -1191,6 +1282,20 @@ "unique_identifier": "Sublime Text", "description": "Sublime Text is a text editor for code, markup, and prose." }, + { + "name": "Surfshark", + "slug": "surfshark/darwin", + "platform": "darwin", + "unique_identifier": "com.surfshark.vpnclient.macos.direct", + "description": "Surfshark is a VPN client for secure internet access and private browsing." + }, + { + "name": "Suspicious Package", + "slug": "suspicious-package/darwin", + "platform": "darwin", + "unique_identifier": "com.mothersruin.SuspiciousPackage", + "description": "Suspicious Package is an application for inspecting installer packages." + }, { "name": "Tableau Desktop", "slug": "tableau/darwin", diff --git a/ee/maintained-apps/outputs/filemaker-pro/darwin.json b/ee/maintained-apps/outputs/filemaker-pro/darwin.json new file mode 100644 index 0000000000..4d9e2589e4 --- /dev/null +++ b/ee/maintained-apps/outputs/filemaker-pro/darwin.json @@ -0,0 +1,21 @@ +{ + "versions": [ + { + "version": "22.0.4.406", + "queries": { + "exists": "SELECT 1 FROM apps WHERE bundle_identifier = 'com.filemaker.client.pro12';" + }, + "installer_url": "https://downloads.claris.com/esd/fmp_22.0.4.406.dmg", + "install_script_ref": "33525d56", + "uninstall_script_ref": "f4f1edf6", + "sha256": "6ab11d3331ac8ffe203280c509a1aa7ce68f251dc2bf01d2f4910af78bd691d2", + "default_categories": [ + "Developer tools" + ] + } + ], + "refs": { + "33525d56": "#!/bin/sh\n\n# variables\nAPPDIR=\"/Applications/\"\nTMPDIR=$(dirname \"$(realpath $INSTALLER_PATH)\")\n# functions\n\nquit_application() {\n local bundle_id=\"$1\"\n local timeout_duration=10\n\n # check if the application is running\n if ! osascript -e \"application id \\\"$bundle_id\\\" is running\" 2>/dev/null; then\n return\n fi\n\n local console_user\n console_user=$(stat -f \"%Su\" /dev/console)\n if [[ $EUID -eq 0 && \"$console_user\" == \"root\" ]]; then\n echo \"Not logged into a non-root GUI; skipping quitting application ID '$bundle_id'.\"\n return\n fi\n\n echo \"Quitting application '$bundle_id'...\"\n\n # try to quit the application within the timeout period\n local quit_success=false\n SECONDS=0\n while (( SECONDS < timeout_duration )); do\n if osascript -e \"tell application id \\\"$bundle_id\\\" to quit\" >/dev/null 2>&1; then\n if ! pgrep -f \"$bundle_id\" >/dev/null 2>&1; then\n echo \"Application '$bundle_id' quit successfully.\"\n quit_success=true\n break\n fi\n fi\n sleep 1\n done\n\n if [[ \"$quit_success\" = false ]]; then\n echo \"Application '$bundle_id' did not quit.\"\n fi\n}\n\n\n# extract contents\nMOUNT_POINT=$(mktemp -d /tmp/dmg_mount_XXXXXX)\nhdiutil attach -plist -nobrowse -readonly -mountpoint \"$MOUNT_POINT\" \"$INSTALLER_PATH\"\nsudo cp -R \"$MOUNT_POINT\"/* \"$TMPDIR\"\nhdiutil detach \"$MOUNT_POINT\"\n# copy to the applications folder\nquit_application 'com.filemaker.client.pro12'\nif [ -d \"$APPDIR/FileMaker Pro.app\" ]; then\n\tsudo mv \"$APPDIR/FileMaker Pro.app\" \"$TMPDIR/FileMaker Pro.app.bkp\"\nfi\nsudo cp -R \"$TMPDIR/FileMaker Pro.app\" \"$APPDIR\"\n", + "f4f1edf6": "#!/bin/sh\n\n# variables\nAPPDIR=\"/Applications/\"\nLOGGED_IN_USER=$(scutil <<< \"show State:/Users/ConsoleUser\" | awk '/Name :/ { print $3 }')\n# functions\n\ntrash() {\n local logged_in_user=\"$1\"\n local target_file=\"$2\"\n local timestamp=\"$(date +%Y-%m-%d-%s)\"\n local rand=\"$(jot -r 1 0 99999)\"\n\n # replace ~ with /Users/$logged_in_user\n if [[ \"$target_file\" == ~* ]]; then\n target_file=\"/Users/$logged_in_user${target_file:1}\"\n fi\n\n local trash=\"/Users/$logged_in_user/.Trash\"\n local file_name=\"$(basename \"${target_file}\")\"\n\n if [[ -e \"$target_file\" ]]; then\n echo \"removing $target_file.\"\n mv -f \"$target_file\" \"$trash/${file_name}_${timestamp}_${rand}\"\n else\n echo \"$target_file doesn't exist.\"\n fi\n}\n\nsudo rm -rf \"$APPDIR/FileMaker Pro.app\"\ntrash $LOGGED_IN_USER '/Users/Shared/FileMaker'\ntrash $LOGGED_IN_USER '~/Library/Application Support/FileMaker'\ntrash $LOGGED_IN_USER '~/Library/Caches/com.filemaker.client.pro12'\ntrash $LOGGED_IN_USER '~/Library/Caches/FileMaker'\ntrash $LOGGED_IN_USER '~/Library/HTTPStorages/com.filemaker.client.pro12'\ntrash $LOGGED_IN_USER '~/Library/Preferences/com.filemaker.client.pro12.plist'\ntrash $LOGGED_IN_USER '~/Library/Saved Application State/com.filemaker.client.pro12.savedState'\ntrash $LOGGED_IN_USER '~/Library/WebKit/com.filemaker.client.pro12'\n" + } +} diff --git a/ee/maintained-apps/outputs/nordpass/darwin.json b/ee/maintained-apps/outputs/nordpass/darwin.json new file mode 100644 index 0000000000..a9e0febed0 --- /dev/null +++ b/ee/maintained-apps/outputs/nordpass/darwin.json @@ -0,0 +1,21 @@ +{ + "versions": [ + { + "version": "7.2.15", + "queries": { + "exists": "SELECT 1 FROM apps WHERE bundle_identifier = 'com.nordsec.nordpass';" + }, + "installer_url": "https://downloads.npass.app/mac/arm/NordPass.dmg", + "install_script_ref": "d6c888b5", + "uninstall_script_ref": "eff0e667", + "sha256": "no_check", + "default_categories": [ + "Productivity" + ] + } + ], + "refs": { + "d6c888b5": "#!/bin/sh\n\n# variables\nAPPDIR=\"/Applications/\"\nTMPDIR=$(dirname \"$(realpath $INSTALLER_PATH)\")\n# functions\n\nquit_application() {\n local bundle_id=\"$1\"\n local timeout_duration=10\n\n # check if the application is running\n if ! osascript -e \"application id \\\"$bundle_id\\\" is running\" 2>/dev/null; then\n return\n fi\n\n local console_user\n console_user=$(stat -f \"%Su\" /dev/console)\n if [[ $EUID -eq 0 && \"$console_user\" == \"root\" ]]; then\n echo \"Not logged into a non-root GUI; skipping quitting application ID '$bundle_id'.\"\n return\n fi\n\n echo \"Quitting application '$bundle_id'...\"\n\n # try to quit the application within the timeout period\n local quit_success=false\n SECONDS=0\n while (( SECONDS < timeout_duration )); do\n if osascript -e \"tell application id \\\"$bundle_id\\\" to quit\" >/dev/null 2>&1; then\n if ! pgrep -f \"$bundle_id\" >/dev/null 2>&1; then\n echo \"Application '$bundle_id' quit successfully.\"\n quit_success=true\n break\n fi\n fi\n sleep 1\n done\n\n if [[ \"$quit_success\" = false ]]; then\n echo \"Application '$bundle_id' did not quit.\"\n fi\n}\n\n\n# extract contents\nMOUNT_POINT=$(mktemp -d /tmp/dmg_mount_XXXXXX)\nhdiutil attach -plist -nobrowse -readonly -mountpoint \"$MOUNT_POINT\" \"$INSTALLER_PATH\"\nsudo cp -R \"$MOUNT_POINT\"/* \"$TMPDIR\"\nhdiutil detach \"$MOUNT_POINT\"\n# copy to the applications folder\nquit_application 'com.nordsec.nordpass'\nif [ -d \"$APPDIR/NordPass.app\" ]; then\n\tsudo mv \"$APPDIR/NordPass.app\" \"$TMPDIR/NordPass.app.bkp\"\nfi\nsudo cp -R \"$TMPDIR/NordPass.app\" \"$APPDIR\"\n", + "eff0e667": "#!/bin/sh\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 if ! osascript -e \"application id \\\"$bundle_id\\\" is running\" 2>/dev/null; then\n return\n fi\n\n local console_user\n console_user=$(stat -f \"%Su\" /dev/console)\n if [[ $EUID -eq 0 && \"$console_user\" == \"root\" ]]; then\n echo \"Not logged into a non-root GUI; skipping quitting application ID '$bundle_id'.\"\n return\n fi\n\n echo \"Quitting application '$bundle_id'...\"\n\n # try to quit the application within the timeout period\n local quit_success=false\n SECONDS=0\n while (( SECONDS < timeout_duration )); do\n if osascript -e \"tell application id \\\"$bundle_id\\\" to quit\" >/dev/null 2>&1; then\n if ! pgrep -f \"$bundle_id\" >/dev/null 2>&1; then\n echo \"Application '$bundle_id' quit successfully.\"\n quit_success=true\n break\n fi\n fi\n sleep 1\n done\n\n if [[ \"$quit_success\" = false ]]; then\n echo \"Application '$bundle_id' did not quit.\"\n fi\n}\n\n\ntrash() {\n local logged_in_user=\"$1\"\n local target_file=\"$2\"\n local timestamp=\"$(date +%Y-%m-%d-%s)\"\n local rand=\"$(jot -r 1 0 99999)\"\n\n # replace ~ with /Users/$logged_in_user\n if [[ \"$target_file\" == ~* ]]; then\n target_file=\"/Users/$logged_in_user${target_file:1}\"\n fi\n\n local trash=\"/Users/$logged_in_user/.Trash\"\n local file_name=\"$(basename \"${target_file}\")\"\n\n if [[ -e \"$target_file\" ]]; then\n echo \"removing $target_file.\"\n mv -f \"$target_file\" \"$trash/${file_name}_${timestamp}_${rand}\"\n else\n echo \"$target_file doesn't exist.\"\n fi\n}\n\nquit_application 'com.nordsec.nordpass'\nsudo rm -rf \"$APPDIR/NordPass.app\"\ntrash $LOGGED_IN_USER '/Library/Application Support/NordPass'\ntrash $LOGGED_IN_USER '~/Library/Application Scripts/com.nordsec.nordpass.safari.extension'\ntrash $LOGGED_IN_USER '~/Library/Application Support/NordPass'\ntrash $LOGGED_IN_USER '~/Library/Containers/com.nordsec.nordpass.safari.extension'\ntrash $LOGGED_IN_USER '~/Library/Preferences/com.nordsec.nordpass.plist'\ntrash $LOGGED_IN_USER '~/Library/Saved Application State/com.nordsec.nordpass.savedState'\n" + } +} diff --git a/ee/maintained-apps/outputs/obs/darwin.json b/ee/maintained-apps/outputs/obs/darwin.json new file mode 100644 index 0000000000..9898b66334 --- /dev/null +++ b/ee/maintained-apps/outputs/obs/darwin.json @@ -0,0 +1,21 @@ +{ + "versions": [ + { + "version": "32.0.3", + "queries": { + "exists": "SELECT 1 FROM apps WHERE bundle_identifier = 'com.obsproject.obs-studio';" + }, + "installer_url": "https://cdn-fastly.obsproject.com/downloads/obs-studio-32.0.3-macos-apple.dmg", + "install_script_ref": "d435f99c", + "uninstall_script_ref": "b577d75e", + "sha256": "5efd7ec3871fa5f217644425e6777354716425dd25c0759c9373b163cc9de6e8", + "default_categories": [ + "Productivity" + ] + } + ], + "refs": { + "b577d75e": "#!/bin/sh\n\n# variables\nAPPDIR=\"/Applications/\"\nLOGGED_IN_USER=$(scutil <<< \"show State:/Users/ConsoleUser\" | awk '/Name :/ { print $3 }')\n# functions\n\ntrash() {\n local logged_in_user=\"$1\"\n local target_file=\"$2\"\n local timestamp=\"$(date +%Y-%m-%d-%s)\"\n local rand=\"$(jot -r 1 0 99999)\"\n\n # replace ~ with /Users/$logged_in_user\n if [[ \"$target_file\" == ~* ]]; then\n target_file=\"/Users/$logged_in_user${target_file:1}\"\n fi\n\n local trash=\"/Users/$logged_in_user/.Trash\"\n local file_name=\"$(basename \"${target_file}\")\"\n\n if [[ -e \"$target_file\" ]]; then\n echo \"removing $target_file.\"\n mv -f \"$target_file\" \"$trash/${file_name}_${timestamp}_${rand}\"\n else\n echo \"$target_file doesn't exist.\"\n fi\n}\n\nsudo rm -rf '/Library/CoreMediaIO/Plug-Ins/DAL/obs-mac-virtualcam.plugin'\nsudo rm -rf \"$APPDIR/OBS.app\"\nsudo rm -rf 'obs'\ntrash $LOGGED_IN_USER '~/Library/Application Support/obs-studio'\ntrash $LOGGED_IN_USER '~/Library/HTTPStorages/com.obsproject.obs-studio'\ntrash $LOGGED_IN_USER '~/Library/Preferences/com.obsproject.obs-studio.plist'\ntrash $LOGGED_IN_USER '~/Library/Saved Application State/com.obsproject.obs-studio.savedState'\n", + "d435f99c": "#!/bin/sh\n\n# variables\nAPPDIR=\"/Applications/\"\nTMPDIR=$(dirname \"$(realpath $INSTALLER_PATH)\")\n# functions\n\nquit_application() {\n local bundle_id=\"$1\"\n local timeout_duration=10\n\n # check if the application is running\n if ! osascript -e \"application id \\\"$bundle_id\\\" is running\" 2>/dev/null; then\n return\n fi\n\n local console_user\n console_user=$(stat -f \"%Su\" /dev/console)\n if [[ $EUID -eq 0 && \"$console_user\" == \"root\" ]]; then\n echo \"Not logged into a non-root GUI; skipping quitting application ID '$bundle_id'.\"\n return\n fi\n\n echo \"Quitting application '$bundle_id'...\"\n\n # try to quit the application within the timeout period\n local quit_success=false\n SECONDS=0\n while (( SECONDS < timeout_duration )); do\n if osascript -e \"tell application id \\\"$bundle_id\\\" to quit\" >/dev/null 2>&1; then\n if ! pgrep -f \"$bundle_id\" >/dev/null 2>&1; then\n echo \"Application '$bundle_id' quit successfully.\"\n quit_success=true\n break\n fi\n fi\n sleep 1\n done\n\n if [[ \"$quit_success\" = false ]]; then\n echo \"Application '$bundle_id' did not quit.\"\n fi\n}\n\n\n# extract contents\nMOUNT_POINT=$(mktemp -d /tmp/dmg_mount_XXXXXX)\nhdiutil attach -plist -nobrowse -readonly -mountpoint \"$MOUNT_POINT\" \"$INSTALLER_PATH\"\nsudo cp -R \"$MOUNT_POINT\"/* \"$TMPDIR\"\nhdiutil detach \"$MOUNT_POINT\"\n# copy to the applications folder\nquit_application 'com.obsproject.obs-studio'\nif [ -d \"$APPDIR/OBS.app\" ]; then\n\tsudo mv \"$APPDIR/OBS.app\" \"$TMPDIR/OBS.app.bkp\"\nfi\nsudo cp -R \"$TMPDIR/OBS.app\" \"$APPDIR\"\n" + } +} diff --git a/ee/maintained-apps/outputs/obsidian/darwin.json b/ee/maintained-apps/outputs/obsidian/darwin.json new file mode 100644 index 0000000000..1e14bbb7ed --- /dev/null +++ b/ee/maintained-apps/outputs/obsidian/darwin.json @@ -0,0 +1,21 @@ +{ + "versions": [ + { + "version": "1.10.6", + "queries": { + "exists": "SELECT 1 FROM apps WHERE bundle_identifier = 'md.obsidian';" + }, + "installer_url": "https://github.com/obsidianmd/obsidian-releases/releases/download/v1.10.6/Obsidian-1.10.6.dmg", + "install_script_ref": "6044324c", + "uninstall_script_ref": "b982bfc2", + "sha256": "a7fbd87353d7802933a13e3d90f55c39114c419ac48d459a356bdab73c128a8a", + "default_categories": [ + "Productivity" + ] + } + ], + "refs": { + "6044324c": "#!/bin/sh\n\n# variables\nAPPDIR=\"/Applications/\"\nTMPDIR=$(dirname \"$(realpath $INSTALLER_PATH)\")\n# functions\n\nquit_application() {\n local bundle_id=\"$1\"\n local timeout_duration=10\n\n # check if the application is running\n if ! osascript -e \"application id \\\"$bundle_id\\\" is running\" 2>/dev/null; then\n return\n fi\n\n local console_user\n console_user=$(stat -f \"%Su\" /dev/console)\n if [[ $EUID -eq 0 && \"$console_user\" == \"root\" ]]; then\n echo \"Not logged into a non-root GUI; skipping quitting application ID '$bundle_id'.\"\n return\n fi\n\n echo \"Quitting application '$bundle_id'...\"\n\n # try to quit the application within the timeout period\n local quit_success=false\n SECONDS=0\n while (( SECONDS < timeout_duration )); do\n if osascript -e \"tell application id \\\"$bundle_id\\\" to quit\" >/dev/null 2>&1; then\n if ! pgrep -f \"$bundle_id\" >/dev/null 2>&1; then\n echo \"Application '$bundle_id' quit successfully.\"\n quit_success=true\n break\n fi\n fi\n sleep 1\n done\n\n if [[ \"$quit_success\" = false ]]; then\n echo \"Application '$bundle_id' did not quit.\"\n fi\n}\n\n\n# extract contents\nMOUNT_POINT=$(mktemp -d /tmp/dmg_mount_XXXXXX)\nhdiutil attach -plist -nobrowse -readonly -mountpoint \"$MOUNT_POINT\" \"$INSTALLER_PATH\"\nsudo cp -R \"$MOUNT_POINT\"/* \"$TMPDIR\"\nhdiutil detach \"$MOUNT_POINT\"\n# copy to the applications folder\nquit_application 'md.obsidian'\nif [ -d \"$APPDIR/Obsidian.app\" ]; then\n\tsudo mv \"$APPDIR/Obsidian.app\" \"$TMPDIR/Obsidian.app.bkp\"\nfi\nsudo cp -R \"$TMPDIR/Obsidian.app\" \"$APPDIR\"\n", + "b982bfc2": "#!/bin/sh\n\n# variables\nAPPDIR=\"/Applications/\"\nLOGGED_IN_USER=$(scutil <<< \"show State:/Users/ConsoleUser\" | awk '/Name :/ { print $3 }')\n# functions\n\ntrash() {\n local logged_in_user=\"$1\"\n local target_file=\"$2\"\n local timestamp=\"$(date +%Y-%m-%d-%s)\"\n local rand=\"$(jot -r 1 0 99999)\"\n\n # replace ~ with /Users/$logged_in_user\n if [[ \"$target_file\" == ~* ]]; then\n target_file=\"/Users/$logged_in_user${target_file:1}\"\n fi\n\n local trash=\"/Users/$logged_in_user/.Trash\"\n local file_name=\"$(basename \"${target_file}\")\"\n\n if [[ -e \"$target_file\" ]]; then\n echo \"removing $target_file.\"\n mv -f \"$target_file\" \"$trash/${file_name}_${timestamp}_${rand}\"\n else\n echo \"$target_file doesn't exist.\"\n fi\n}\n\nsudo rm -rf \"$APPDIR/Obsidian.app\"\ntrash $LOGGED_IN_USER '~/Library/Application Support/com.apple.sharedfilelist/com.apple.LSSharedFileList.ApplicationRecentDocuments/md.obsidian.sfl*'\ntrash $LOGGED_IN_USER '~/Library/Application Support/obsidian'\ntrash $LOGGED_IN_USER '~/Library/Preferences/md.obsidian.plist'\ntrash $LOGGED_IN_USER '~/Library/Saved Application State/md.obsidian.savedState'\n" + } +} diff --git a/ee/maintained-apps/outputs/orbstack/darwin.json b/ee/maintained-apps/outputs/orbstack/darwin.json new file mode 100644 index 0000000000..f65922d610 --- /dev/null +++ b/ee/maintained-apps/outputs/orbstack/darwin.json @@ -0,0 +1,21 @@ +{ + "versions": [ + { + "version": "2.0.5", + "queries": { + "exists": "SELECT 1 FROM apps WHERE bundle_identifier = 'dev.kdrag0n.MacVirt';" + }, + "installer_url": "https://cdn-updates.orbstack.dev/arm64/OrbStack_v2.0.5_19905_arm64.dmg", + "install_script_ref": "14115520", + "uninstall_script_ref": "401d288b", + "sha256": "601889551cdfdc7feee148b7fdb0480fa0ba5c0db0be8f1c047fc840886a7571", + "default_categories": [ + "Developer tools" + ] + } + ], + "refs": { + "14115520": "#!/bin/sh\n\n# variables\nAPPDIR=\"/Applications/\"\nTMPDIR=$(dirname \"$(realpath $INSTALLER_PATH)\")\n# functions\n\nquit_application() {\n local bundle_id=\"$1\"\n local timeout_duration=10\n\n # check if the application is running\n if ! osascript -e \"application id \\\"$bundle_id\\\" is running\" 2>/dev/null; then\n return\n fi\n\n local console_user\n console_user=$(stat -f \"%Su\" /dev/console)\n if [[ $EUID -eq 0 && \"$console_user\" == \"root\" ]]; then\n echo \"Not logged into a non-root GUI; skipping quitting application ID '$bundle_id'.\"\n return\n fi\n\n echo \"Quitting application '$bundle_id'...\"\n\n # try to quit the application within the timeout period\n local quit_success=false\n SECONDS=0\n while (( SECONDS < timeout_duration )); do\n if osascript -e \"tell application id \\\"$bundle_id\\\" to quit\" >/dev/null 2>&1; then\n if ! pgrep -f \"$bundle_id\" >/dev/null 2>&1; then\n echo \"Application '$bundle_id' quit successfully.\"\n quit_success=true\n break\n fi\n fi\n sleep 1\n done\n\n if [[ \"$quit_success\" = false ]]; then\n echo \"Application '$bundle_id' did not quit.\"\n fi\n}\n\n\n# extract contents\nMOUNT_POINT=$(mktemp -d /tmp/dmg_mount_XXXXXX)\nhdiutil attach -plist -nobrowse -readonly -mountpoint \"$MOUNT_POINT\" \"$INSTALLER_PATH\"\nsudo cp -R \"$MOUNT_POINT\"/* \"$TMPDIR\"\nhdiutil detach \"$MOUNT_POINT\"\n# copy to the applications folder\nquit_application 'dev.kdrag0n.MacVirt'\nif [ -d \"$APPDIR/OrbStack.app\" ]; then\n\tsudo mv \"$APPDIR/OrbStack.app\" \"$TMPDIR/OrbStack.app.bkp\"\nfi\nsudo cp -R \"$TMPDIR/OrbStack.app\" \"$APPDIR\"\n", + "401d288b": "#!/bin/sh\n\n# variables\nAPPDIR=\"/Applications/\"\nLOGGED_IN_USER=$(scutil <<< \"show State:/Users/ConsoleUser\" | awk '/Name :/ { print $3 }')\n# functions\n\ntrash() {\n local logged_in_user=\"$1\"\n local target_file=\"$2\"\n local timestamp=\"$(date +%Y-%m-%d-%s)\"\n local rand=\"$(jot -r 1 0 99999)\"\n\n # replace ~ with /Users/$logged_in_user\n if [[ \"$target_file\" == ~* ]]; then\n target_file=\"/Users/$logged_in_user${target_file:1}\"\n fi\n\n local trash=\"/Users/$logged_in_user/.Trash\"\n local file_name=\"$(basename \"${target_file}\")\"\n\n if [[ -e \"$target_file\" ]]; then\n echo \"removing $target_file.\"\n mv -f \"$target_file\" \"$trash/${file_name}_${timestamp}_${rand}\"\n else\n echo \"$target_file doesn't exist.\"\n fi\n}\n\n(cd /Users/$LOGGED_IN_USER && '$APPDIR/OrbStack.app/Contents/MacOS/bin/orbctl' '_internal' 'brew-uninstall')\nsudo rm -rf \"$APPDIR/OrbStack.app\"\nsudo rmdir '~/OrbStack'\ntrash $LOGGED_IN_USER '~/.orbstack'\ntrash $LOGGED_IN_USER '~/Library/Caches/dev.kdrag0n.MacVirt'\ntrash $LOGGED_IN_USER '~/Library/Group Containers/*.dev.orbstack'\ntrash $LOGGED_IN_USER '~/Library/HTTPStorages/dev.kdrag0n.MacVirt'\ntrash $LOGGED_IN_USER '~/Library/HTTPStorages/dev.kdrag0n.MacVirt.binarycookies'\ntrash $LOGGED_IN_USER '~/Library/Preferences/dev.kdrag0n.MacVirt.plist'\ntrash $LOGGED_IN_USER '~/Library/Saved Application State/dev.kdrag0n.MacVirt.savedState'\ntrash $LOGGED_IN_USER '~/Library/WebKit/dev.kdrag0n.MacVirt'\n" + } +} diff --git a/ee/maintained-apps/outputs/pgadmin4/darwin.json b/ee/maintained-apps/outputs/pgadmin4/darwin.json new file mode 100644 index 0000000000..b2a7480208 --- /dev/null +++ b/ee/maintained-apps/outputs/pgadmin4/darwin.json @@ -0,0 +1,21 @@ +{ + "versions": [ + { + "version": "9.10", + "queries": { + "exists": "SELECT 1 FROM apps WHERE bundle_identifier = 'org.pgadmin.pgadmin4';" + }, + "installer_url": "https://ftp.postgresql.org/pub/pgadmin/pgadmin4/v9.10/macos/pgadmin4-9.10-arm64.dmg", + "install_script_ref": "6b8f50b9", + "uninstall_script_ref": "f1163b80", + "sha256": "9d654ccb7eb5d7379c7f004d4824de251c54dc51074bcb938b530593e50fb736", + "default_categories": [ + "Developer tools" + ] + } + ], + "refs": { + "6b8f50b9": "#!/bin/sh\n\n# variables\nAPPDIR=\"/Applications/\"\nTMPDIR=$(dirname \"$(realpath $INSTALLER_PATH)\")\n# functions\n\nquit_application() {\n local bundle_id=\"$1\"\n local timeout_duration=10\n\n # check if the application is running\n if ! osascript -e \"application id \\\"$bundle_id\\\" is running\" 2>/dev/null; then\n return\n fi\n\n local console_user\n console_user=$(stat -f \"%Su\" /dev/console)\n if [[ $EUID -eq 0 && \"$console_user\" == \"root\" ]]; then\n echo \"Not logged into a non-root GUI; skipping quitting application ID '$bundle_id'.\"\n return\n fi\n\n echo \"Quitting application '$bundle_id'...\"\n\n # try to quit the application within the timeout period\n local quit_success=false\n SECONDS=0\n while (( SECONDS < timeout_duration )); do\n if osascript -e \"tell application id \\\"$bundle_id\\\" to quit\" >/dev/null 2>&1; then\n if ! pgrep -f \"$bundle_id\" >/dev/null 2>&1; then\n echo \"Application '$bundle_id' quit successfully.\"\n quit_success=true\n break\n fi\n fi\n sleep 1\n done\n\n if [[ \"$quit_success\" = false ]]; then\n echo \"Application '$bundle_id' did not quit.\"\n fi\n}\n\n\n# extract contents\nMOUNT_POINT=$(mktemp -d /tmp/dmg_mount_XXXXXX)\nhdiutil attach -plist -nobrowse -readonly -mountpoint \"$MOUNT_POINT\" \"$INSTALLER_PATH\"\nsudo cp -R \"$MOUNT_POINT\"/* \"$TMPDIR\"\nhdiutil detach \"$MOUNT_POINT\"\n# copy to the applications folder\nquit_application 'org.pgadmin.pgadmin4'\nif [ -d \"$APPDIR/pgAdmin 4.app\" ]; then\n\tsudo mv \"$APPDIR/pgAdmin 4.app\" \"$TMPDIR/pgAdmin 4.app.bkp\"\nfi\nsudo cp -R \"$TMPDIR/pgAdmin 4.app\" \"$APPDIR\"\n", + "f1163b80": "#!/bin/sh\n\n# variables\nAPPDIR=\"/Applications/\"\nLOGGED_IN_USER=$(scutil <<< \"show State:/Users/ConsoleUser\" | awk '/Name :/ { print $3 }')\n# functions\n\ntrash() {\n local logged_in_user=\"$1\"\n local target_file=\"$2\"\n local timestamp=\"$(date +%Y-%m-%d-%s)\"\n local rand=\"$(jot -r 1 0 99999)\"\n\n # replace ~ with /Users/$logged_in_user\n if [[ \"$target_file\" == ~* ]]; then\n target_file=\"/Users/$logged_in_user${target_file:1}\"\n fi\n\n local trash=\"/Users/$logged_in_user/.Trash\"\n local file_name=\"$(basename \"${target_file}\")\"\n\n if [[ -e \"$target_file\" ]]; then\n echo \"removing $target_file.\"\n mv -f \"$target_file\" \"$trash/${file_name}_${timestamp}_${rand}\"\n else\n echo \"$target_file doesn't exist.\"\n fi\n}\n\nsudo rm -rf \"$APPDIR/pgAdmin 4.app\"\ntrash $LOGGED_IN_USER '~/.pgadmin'\ntrash $LOGGED_IN_USER '~/Library/Application Support/com.apple.sharedfilelist/com.apple.LSSharedFileList.ApplicationRecentDocuments/org.pgadmin.pgadmin4.sfl*'\ntrash $LOGGED_IN_USER '~/Library/Application Support/pgAdmin 4'\ntrash $LOGGED_IN_USER '~/Library/Caches/pgAdmin 4'\ntrash $LOGGED_IN_USER '~/Library/Preferences/org.pgadmin.pgadmin4.plist'\ntrash $LOGGED_IN_USER '~/Library/Saved Application State/org.pgadmin.pgAdmin4.savedState'\n" + } +} diff --git a/ee/maintained-apps/outputs/rapidapi/darwin.json b/ee/maintained-apps/outputs/rapidapi/darwin.json new file mode 100644 index 0000000000..87ff524133 --- /dev/null +++ b/ee/maintained-apps/outputs/rapidapi/darwin.json @@ -0,0 +1,21 @@ +{ + "versions": [ + { + "version": "4.5.2", + "queries": { + "exists": "SELECT 1 FROM apps WHERE bundle_identifier = 'com.luckymarmot.Paw';" + }, + "installer_url": "https://cdn-builds.paw.cloud/paw/RapidAPI-4.5.2.zip", + "install_script_ref": "28cca0da", + "uninstall_script_ref": "eb82b992", + "sha256": "aad9446c07fe06121466aebc4cb79dccfba4dd1d0edcfeff37e9c312dbefd562", + "default_categories": [ + "Developer tools" + ] + } + ], + "refs": { + "28cca0da": "#!/bin/sh\n\n# variables\nAPPDIR=\"/Applications/\"\nTMPDIR=$(dirname \"$(realpath $INSTALLER_PATH)\")\n# functions\n\nquit_application() {\n local bundle_id=\"$1\"\n local timeout_duration=10\n\n # check if the application is running\n if ! osascript -e \"application id \\\"$bundle_id\\\" is running\" 2>/dev/null; then\n return\n fi\n\n local console_user\n console_user=$(stat -f \"%Su\" /dev/console)\n if [[ $EUID -eq 0 && \"$console_user\" == \"root\" ]]; then\n echo \"Not logged into a non-root GUI; skipping quitting application ID '$bundle_id'.\"\n return\n fi\n\n echo \"Quitting application '$bundle_id'...\"\n\n # try to quit the application within the timeout period\n local quit_success=false\n SECONDS=0\n while (( SECONDS < timeout_duration )); do\n if osascript -e \"tell application id \\\"$bundle_id\\\" to quit\" >/dev/null 2>&1; then\n if ! pgrep -f \"$bundle_id\" >/dev/null 2>&1; then\n echo \"Application '$bundle_id' quit successfully.\"\n quit_success=true\n break\n fi\n fi\n sleep 1\n done\n\n if [[ \"$quit_success\" = false ]]; then\n echo \"Application '$bundle_id' did not quit.\"\n fi\n}\n\n\n# extract contents\nunzip \"$INSTALLER_PATH\" -d \"$TMPDIR\"\n# copy to the applications folder\nquit_application 'com.luckymarmot.Paw'\nif [ -d \"$APPDIR/RapidAPI.app\" ]; then\n\tsudo mv \"$APPDIR/RapidAPI.app\" \"$TMPDIR/RapidAPI.app.bkp\"\nfi\nsudo cp -R \"$TMPDIR/RapidAPI.app\" \"$APPDIR\"\n", + "eb82b992": "#!/bin/sh\n\n# variables\nAPPDIR=\"/Applications/\"\nLOGGED_IN_USER=$(scutil <<< \"show State:/Users/ConsoleUser\" | awk '/Name :/ { print $3 }')\n# functions\n\ntrash() {\n local logged_in_user=\"$1\"\n local target_file=\"$2\"\n local timestamp=\"$(date +%Y-%m-%d-%s)\"\n local rand=\"$(jot -r 1 0 99999)\"\n\n # replace ~ with /Users/$logged_in_user\n if [[ \"$target_file\" == ~* ]]; then\n target_file=\"/Users/$logged_in_user${target_file:1}\"\n fi\n\n local trash=\"/Users/$logged_in_user/.Trash\"\n local file_name=\"$(basename \"${target_file}\")\"\n\n if [[ -e \"$target_file\" ]]; then\n echo \"removing $target_file.\"\n mv -f \"$target_file\" \"$trash/${file_name}_${timestamp}_${rand}\"\n else\n echo \"$target_file doesn't exist.\"\n fi\n}\n\nsudo rm -rf \"$APPDIR/RapidAPI.app\"\ntrash $LOGGED_IN_USER '~/Library/Application Scripts/com.luckymarmot.Paw'\ntrash $LOGGED_IN_USER '~/Library/Application Support/com.apple.sharedfilelist/com.apple.LSSharedFileList.ApplicationRecentDocuments/com.luckymarmot.paw.sfl*'\ntrash $LOGGED_IN_USER '~/Library/Containers/com.luckymarmot.Paw'\ntrash $LOGGED_IN_USER '~/Library/Preferences/com.luckymarmot.Paw.plist'\ntrash $LOGGED_IN_USER '~/Library/Saved Application State/com.luckymarmot.Paw.savedState'\n" + } +} diff --git a/ee/maintained-apps/outputs/royal-tsx/darwin.json b/ee/maintained-apps/outputs/royal-tsx/darwin.json new file mode 100644 index 0000000000..64ab7151e2 --- /dev/null +++ b/ee/maintained-apps/outputs/royal-tsx/darwin.json @@ -0,0 +1,21 @@ +{ + "versions": [ + { + "version": "6.3.0.1000", + "queries": { + "exists": "SELECT 1 FROM apps WHERE bundle_identifier = 'com.lemonmojo.RoyalTSX.App';" + }, + "installer_url": "https://royaltsx-v6.royalapps.com/updates/royaltsx_6.3.0.1000.dmg", + "install_script_ref": "0f402271", + "uninstall_script_ref": "3f764c08", + "sha256": "934ce7ef770b4fc876c08a50f22b0814ccd66d8c0d2542685ddef61609263bcf", + "default_categories": [ + "Productivity" + ] + } + ], + "refs": { + "0f402271": "#!/bin/sh\n\n# variables\nAPPDIR=\"/Applications/\"\nTMPDIR=$(dirname \"$(realpath $INSTALLER_PATH)\")\n\n# functions\n\nquit_application() {\n local bundle_id=\"$1\"\n local timeout_duration=10\n\n # check if the application is running\n if ! osascript -e \"application id \\\"$bundle_id\\\" is running\" 2>/dev/null; then\n return\n fi\n\n local console_user\n console_user=$(stat -f \"%Su\" /dev/console)\n if [[ $EUID -eq 0 && \"$console_user\" == \"root\" ]]; then\n echo \"Not logged into a non-root GUI; skipping quitting application ID '$bundle_id'.\"\n return\n fi\n\n echo \"Quitting application '$bundle_id'...\"\n\n # try to quit the application within the timeout period\n local quit_success=false\n SECONDS=0\n while (( SECONDS < timeout_duration )); do\n if osascript -e \"tell application id \\\"$bundle_id\\\" to quit\" >/dev/null 2>&1; then\n if ! pgrep -f \"$bundle_id\" >/dev/null 2>&1; then\n echo \"Application '$bundle_id' quit successfully.\"\n quit_success=true\n break\n fi\n fi\n sleep 1\n done\n\n if [[ \"$quit_success\" = false ]]; then\n echo \"Application '$bundle_id' did not quit.\"\n fi\n}\n\n# extract contents\n# Use 'yes' to automatically accept license agreement when mounting DMG\n# This replicates Homebrew's behavior for DMG files with license agreements\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\n# copy to the applications folder\nquit_application 'com.lemonmojo.RoyalTSX.App'\nif [ -d \"$APPDIR/Royal TSX.app\" ]; then\n\tsudo mv \"$APPDIR/Royal TSX.app\" \"$TMPDIR/Royal TSX.app.bkp\"\nfi\nsudo cp -R \"$TMPDIR/Royal TSX.app\" \"$APPDIR\"\n", + "3f764c08": "#!/bin/sh\n\n# variables\nAPPDIR=\"/Applications/\"\nLOGGED_IN_USER=$(scutil <<< \"show State:/Users/ConsoleUser\" | awk '/Name :/ { print $3 }')\n# functions\n\ntrash() {\n local logged_in_user=\"$1\"\n local target_file=\"$2\"\n local timestamp=\"$(date +%Y-%m-%d-%s)\"\n local rand=\"$(jot -r 1 0 99999)\"\n\n # replace ~ with /Users/$logged_in_user\n if [[ \"$target_file\" == ~* ]]; then\n target_file=\"/Users/$logged_in_user${target_file:1}\"\n fi\n\n local trash=\"/Users/$logged_in_user/.Trash\"\n local file_name=\"$(basename \"${target_file}\")\"\n\n if [[ -e \"$target_file\" ]]; then\n echo \"removing $target_file.\"\n mv -f \"$target_file\" \"$trash/${file_name}_${timestamp}_${rand}\"\n else\n echo \"$target_file doesn't exist.\"\n fi\n}\n\nsudo rm -rf \"$APPDIR/Royal TSX.app\"\ntrash $LOGGED_IN_USER '~/Library/Application Support/com.lemonmojo.RoyalTSX.App'\ntrash $LOGGED_IN_USER '~/Library/Application Support/Royal TSX'\ntrash $LOGGED_IN_USER '~/Library/Caches/com.lemonmojo.RoyalTSX.App'\ntrash $LOGGED_IN_USER '~/Library/Preferences/com.lemonmojo.RoyalTSX.App.plist'\n" + } +} diff --git a/ee/maintained-apps/outputs/shottr/darwin.json b/ee/maintained-apps/outputs/shottr/darwin.json new file mode 100644 index 0000000000..075ec2f8aa --- /dev/null +++ b/ee/maintained-apps/outputs/shottr/darwin.json @@ -0,0 +1,21 @@ +{ + "versions": [ + { + "version": "1.9", + "queries": { + "exists": "SELECT 1 FROM apps WHERE bundle_identifier = 'cc.ffitch.shottr';" + }, + "installer_url": "https://shottr.cc/dl/Shottr-1.9.dmg", + "install_script_ref": "03afa124", + "uninstall_script_ref": "cc55e70b", + "sha256": "664d95023406c7fa87d88c149a0302fb8ab43bb4aadf3c7f7a9bc9a4447805b0", + "default_categories": [ + "Productivity" + ] + } + ], + "refs": { + "03afa124": "#!/bin/sh\n\n# variables\nAPPDIR=\"/Applications/\"\nTMPDIR=$(dirname \"$(realpath $INSTALLER_PATH)\")\n# functions\n\nquit_application() {\n local bundle_id=\"$1\"\n local timeout_duration=10\n\n # check if the application is running\n if ! osascript -e \"application id \\\"$bundle_id\\\" is running\" 2>/dev/null; then\n return\n fi\n\n local console_user\n console_user=$(stat -f \"%Su\" /dev/console)\n if [[ $EUID -eq 0 && \"$console_user\" == \"root\" ]]; then\n echo \"Not logged into a non-root GUI; skipping quitting application ID '$bundle_id'.\"\n return\n fi\n\n echo \"Quitting application '$bundle_id'...\"\n\n # try to quit the application within the timeout period\n local quit_success=false\n SECONDS=0\n while (( SECONDS < timeout_duration )); do\n if osascript -e \"tell application id \\\"$bundle_id\\\" to quit\" >/dev/null 2>&1; then\n if ! pgrep -f \"$bundle_id\" >/dev/null 2>&1; then\n echo \"Application '$bundle_id' quit successfully.\"\n quit_success=true\n break\n fi\n fi\n sleep 1\n done\n\n if [[ \"$quit_success\" = false ]]; then\n echo \"Application '$bundle_id' did not quit.\"\n fi\n}\n\n\n# extract contents\nMOUNT_POINT=$(mktemp -d /tmp/dmg_mount_XXXXXX)\nhdiutil attach -plist -nobrowse -readonly -mountpoint \"$MOUNT_POINT\" \"$INSTALLER_PATH\"\nsudo cp -R \"$MOUNT_POINT\"/* \"$TMPDIR\"\nhdiutil detach \"$MOUNT_POINT\"\n# copy to the applications folder\nquit_application 'cc.ffitch.shottr'\nif [ -d \"$APPDIR/Shottr.app\" ]; then\n\tsudo mv \"$APPDIR/Shottr.app\" \"$TMPDIR/Shottr.app.bkp\"\nfi\nsudo cp -R \"$TMPDIR/Shottr.app\" \"$APPDIR\"\n", + "cc55e70b": "#!/bin/sh\n\n# variables\nAPPDIR=\"/Applications/\"\nLOGGED_IN_USER=$(scutil <<< \"show State:/Users/ConsoleUser\" | awk '/Name :/ { print $3 }')\n# functions\n\ntrash() {\n local logged_in_user=\"$1\"\n local target_file=\"$2\"\n local timestamp=\"$(date +%Y-%m-%d-%s)\"\n local rand=\"$(jot -r 1 0 99999)\"\n\n # replace ~ with /Users/$logged_in_user\n if [[ \"$target_file\" == ~* ]]; then\n target_file=\"/Users/$logged_in_user${target_file:1}\"\n fi\n\n local trash=\"/Users/$logged_in_user/.Trash\"\n local file_name=\"$(basename \"${target_file}\")\"\n\n if [[ -e \"$target_file\" ]]; then\n echo \"removing $target_file.\"\n mv -f \"$target_file\" \"$trash/${file_name}_${timestamp}_${rand}\"\n else\n echo \"$target_file doesn't exist.\"\n fi\n}\n\nsudo rm -rf \"$APPDIR/Shottr.app\"\ntrash $LOGGED_IN_USER '~/Library/Application Scripts/cc.ffitch.shottr'\ntrash $LOGGED_IN_USER '~/Library/Application Scripts/cc.ffitch.shottr-LaunchAtLoginHelper'\ntrash $LOGGED_IN_USER '~/Library/Containers/cc.ffitch.shottr'\ntrash $LOGGED_IN_USER '~/Library/Containers/cc.ffitch.shottr-LaunchAtLoginHelper'\n" + } +} diff --git a/ee/maintained-apps/outputs/splashtop-business/darwin.json b/ee/maintained-apps/outputs/splashtop-business/darwin.json new file mode 100644 index 0000000000..3423d0549f --- /dev/null +++ b/ee/maintained-apps/outputs/splashtop-business/darwin.json @@ -0,0 +1,21 @@ +{ + "versions": [ + { + "version": "3.8.0.1", + "queries": { + "exists": "SELECT 1 FROM apps WHERE bundle_identifier = 'com.splashtop.stb.macosx';" + }, + "installer_url": "https://d17kmd0va0f0mp.cloudfront.net/macclient/STB/Splashtop_Business_Mac_INSTALLER_v3.8.0.1.dmg", + "install_script_ref": "8fdc3286", + "uninstall_script_ref": "76f9b2e9", + "sha256": "9dc906efdbe7acbee26cf9fdcc4f239a5196e30f54064b52025c65458fe4e207", + "default_categories": [ + "Productivity" + ] + } + ], + "refs": { + "76f9b2e9": "#!/bin/sh\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 if ! osascript -e \"application id \\\"$bundle_id\\\" is running\" 2>/dev/null; then\n return\n fi\n\n local console_user\n console_user=$(stat -f \"%Su\" /dev/console)\n if [[ $EUID -eq 0 && \"$console_user\" == \"root\" ]]; then\n echo \"Not logged into a non-root GUI; skipping quitting application ID '$bundle_id'.\"\n return\n fi\n\n echo \"Quitting application '$bundle_id'...\"\n\n # try to quit the application within the timeout period\n local quit_success=false\n SECONDS=0\n while (( SECONDS < timeout_duration )); do\n if osascript -e \"tell application id \\\"$bundle_id\\\" to quit\" >/dev/null 2>&1; then\n if ! pgrep -f \"$bundle_id\" >/dev/null 2>&1; then\n echo \"Application '$bundle_id' quit successfully.\"\n quit_success=true\n break\n fi\n fi\n sleep 1\n done\n\n if [[ \"$quit_success\" = false ]]; then\n echo \"Application '$bundle_id' did not quit.\"\n fi\n}\n\n\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 for should_sudo in \"${booleans[@]}\"; do\n plist_status=$(launchctl list \"${service}\" 2>/dev/null)\n\n if [[ $plist_status == \\{* ]]; then\n if [[ $should_sudo == \"true\" ]]; then\n sudo launchctl remove \"${service}\"\n else\n launchctl remove \"${service}\"\n fi\n sleep 1\n fi\n\n paths=(\n \"/Library/LaunchAgents/${service}.plist\"\n \"/Library/LaunchDaemons/${service}.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}\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 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.stb.macosx.helper.autoupdate'\nquit_application 'com.splashtop.stb.macosx'\nremove_pkg_files 'com.splashtop.splashtopBusiness.*'\nforget_pkg 'com.splashtop.splashtopBusiness.*'\nremove_pkg_files 'com.splashtop.stb.*'\nforget_pkg 'com.splashtop.stb.*'\ntrash $LOGGED_IN_USER '~/Library/Application Support/Splashtop Business'\ntrash $LOGGED_IN_USER '~/Library/Caches/com.splashtop.stb.macosx'\ntrash $LOGGED_IN_USER '~/Library/HTTPStorages/com.splashtop.stb.macosx'\ntrash $LOGGED_IN_USER '~/Library/Preferences/com.splashtop.stb.macosx.plist'\n", + "8fdc3286": "#!/bin/sh\n\n# variables\nAPPDIR=\"/Applications/\"\nTMPDIR=$(dirname \"$(realpath $INSTALLER_PATH)\")\n\n# extract contents\nMOUNT_POINT=$(mktemp -d /tmp/dmg_mount_XXXXXX)\nhdiutil attach -plist -nobrowse -readonly -mountpoint \"$MOUNT_POINT\" \"$INSTALLER_PATH\"\nsudo cp -R \"$MOUNT_POINT\"/* \"$TMPDIR\"\nhdiutil detach \"$MOUNT_POINT\"\n# install pkg files\nsudo installer -pkg \"$TMPDIR/Splashtop Business.pkg\" -target /\n" + } +} diff --git a/ee/maintained-apps/outputs/splashtop-streamer/darwin.json b/ee/maintained-apps/outputs/splashtop-streamer/darwin.json new file mode 100644 index 0000000000..40c6c560a5 --- /dev/null +++ b/ee/maintained-apps/outputs/splashtop-streamer/darwin.json @@ -0,0 +1,21 @@ +{ + "versions": [ + { + "version": "3.8.0.2", + "queries": { + "exists": "SELECT 1 FROM apps WHERE bundle_identifier = 'com.splashtop.Splashtop-Streamer';" + }, + "installer_url": "https://d17kmd0va0f0mp.cloudfront.net/mac/Splashtop_Streamer_Mac_INSTALLER_v3.8.0.2.dmg", + "install_script_ref": "9e1a200f", + "uninstall_script_ref": "ee983d15", + "sha256": "64690656fd7dcf59fcdc2cb20b6c96775e24fab6f7b0bff6bd500af3f579059b", + "default_categories": [ + "Productivity" + ] + } + ], + "refs": { + "9e1a200f": "#!/bin/sh\n\n# variables\nAPPDIR=\"/Applications/\"\nTMPDIR=$(dirname \"$(realpath $INSTALLER_PATH)\")\n\n# extract contents\nMOUNT_POINT=$(mktemp -d /tmp/dmg_mount_XXXXXX)\nhdiutil attach -plist -nobrowse -readonly -mountpoint \"$MOUNT_POINT\" \"$INSTALLER_PATH\"\nsudo cp -R \"$MOUNT_POINT\"/* \"$TMPDIR\"\nhdiutil detach \"$MOUNT_POINT\"\n# install pkg files\nsudo installer -pkg \"$TMPDIR/Splashtop Streamer.pkg\" -target /\n", + "ee983d15": "#!/bin/sh\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 if ! osascript -e \"application id \\\"$bundle_id\\\" is running\" 2>/dev/null; then\n return\n fi\n\n local console_user\n console_user=$(stat -f \"%Su\" /dev/console)\n if [[ $EUID -eq 0 && \"$console_user\" == \"root\" ]]; then\n echo \"Not logged into a non-root GUI; skipping quitting application ID '$bundle_id'.\"\n return\n fi\n\n echo \"Quitting application '$bundle_id'...\"\n\n # try to quit the application within the timeout period\n local quit_success=false\n SECONDS=0\n while (( SECONDS < timeout_duration )); do\n if osascript -e \"tell application id \\\"$bundle_id\\\" to quit\" >/dev/null 2>&1; then\n if ! pgrep -f \"$bundle_id\" >/dev/null 2>&1; then\n echo \"Application '$bundle_id' quit successfully.\"\n quit_success=true\n break\n fi\n fi\n sleep 1\n done\n\n if [[ \"$quit_success\" = false ]]; then\n echo \"Application '$bundle_id' did not quit.\"\n fi\n}\n\n\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 for should_sudo in \"${booleans[@]}\"; do\n plist_status=$(launchctl list \"${service}\" 2>/dev/null)\n\n if [[ $plist_status == \\{* ]]; then\n if [[ $should_sudo == \"true\" ]]; then\n sudo launchctl remove \"${service}\"\n else\n launchctl remove \"${service}\"\n fi\n sleep 1\n fi\n\n paths=(\n \"/Library/LaunchAgents/${service}.plist\"\n \"/Library/LaunchDaemons/${service}.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}\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 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" + } +} diff --git a/ee/maintained-apps/outputs/stats/darwin.json b/ee/maintained-apps/outputs/stats/darwin.json new file mode 100644 index 0000000000..d629b1939b --- /dev/null +++ b/ee/maintained-apps/outputs/stats/darwin.json @@ -0,0 +1,21 @@ +{ + "versions": [ + { + "version": "2.11.62", + "queries": { + "exists": "SELECT 1 FROM apps WHERE bundle_identifier = 'eu.exelban.Stats';" + }, + "installer_url": "https://github.com/exelban/stats/releases/download/v2.11.62/Stats.dmg", + "install_script_ref": "512089ad", + "uninstall_script_ref": "38a63041", + "sha256": "db7c533f535b278dde5884842c052eeda66e216d9caf93bc8d5da7469a62f58c", + "default_categories": [ + "Productivity" + ] + } + ], + "refs": { + "38a63041": "#!/bin/sh\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 if ! osascript -e \"application id \\\"$bundle_id\\\" is running\" 2>/dev/null; then\n return\n fi\n\n local console_user\n console_user=$(stat -f \"%Su\" /dev/console)\n if [[ $EUID -eq 0 && \"$console_user\" == \"root\" ]]; then\n echo \"Not logged into a non-root GUI; skipping quitting application ID '$bundle_id'.\"\n return\n fi\n\n echo \"Quitting application '$bundle_id'...\"\n\n # try to quit the application within the timeout period\n local quit_success=false\n SECONDS=0\n while (( SECONDS < timeout_duration )); do\n if osascript -e \"tell application id \\\"$bundle_id\\\" to quit\" >/dev/null 2>&1; then\n if ! pgrep -f \"$bundle_id\" >/dev/null 2>&1; then\n echo \"Application '$bundle_id' quit successfully.\"\n quit_success=true\n break\n fi\n fi\n sleep 1\n done\n\n if [[ \"$quit_success\" = false ]]; then\n echo \"Application '$bundle_id' did not quit.\"\n fi\n}\n\n\ntrash() {\n local logged_in_user=\"$1\"\n local target_file=\"$2\"\n local timestamp=\"$(date +%Y-%m-%d-%s)\"\n local rand=\"$(jot -r 1 0 99999)\"\n\n # replace ~ with /Users/$logged_in_user\n if [[ \"$target_file\" == ~* ]]; then\n target_file=\"/Users/$logged_in_user${target_file:1}\"\n fi\n\n local trash=\"/Users/$logged_in_user/.Trash\"\n local file_name=\"$(basename \"${target_file}\")\"\n\n if [[ -e \"$target_file\" ]]; then\n echo \"removing $target_file.\"\n mv -f \"$target_file\" \"$trash/${file_name}_${timestamp}_${rand}\"\n else\n echo \"$target_file doesn't exist.\"\n fi\n}\n\nquit_application 'eu.exelban.Stats'\nsudo rm -rf \"$APPDIR/Stats.app\"\nsudo rm -rf '/Library/LaunchDaemons/eu.exelban.Stats.SMC.Helper.plist'\ntrash $LOGGED_IN_USER '~/Library/Application Scripts/eu.exelban.Stats.LaunchAtLogin'\ntrash $LOGGED_IN_USER '~/Library/Application Scripts/eu.exelban.Stats.Widgets'\ntrash $LOGGED_IN_USER '~/Library/Caches/eu.exelban.Stats'\ntrash $LOGGED_IN_USER '~/Library/Containers/eu.exelban.Stats.LaunchAtLogin'\ntrash $LOGGED_IN_USER '~/Library/Containers/eu.exelban.Stats.Widgets'\ntrash $LOGGED_IN_USER '~/Library/Cookies/eu.exelban.Stats.binarycookies'\ntrash $LOGGED_IN_USER '~/Library/Group Containers/eu.exelban.Stats.widgets'\ntrash $LOGGED_IN_USER '~/Library/HTTPStorages/eu.exelban.Stats'\ntrash $LOGGED_IN_USER '~/Library/Preferences/eu.exelban.Stats.plist'\n", + "512089ad": "#!/bin/sh\n\n# variables\nAPPDIR=\"/Applications/\"\nTMPDIR=$(dirname \"$(realpath $INSTALLER_PATH)\")\n# functions\n\nquit_application() {\n local bundle_id=\"$1\"\n local timeout_duration=10\n\n # check if the application is running\n if ! osascript -e \"application id \\\"$bundle_id\\\" is running\" 2>/dev/null; then\n return\n fi\n\n local console_user\n console_user=$(stat -f \"%Su\" /dev/console)\n if [[ $EUID -eq 0 && \"$console_user\" == \"root\" ]]; then\n echo \"Not logged into a non-root GUI; skipping quitting application ID '$bundle_id'.\"\n return\n fi\n\n echo \"Quitting application '$bundle_id'...\"\n\n # try to quit the application within the timeout period\n local quit_success=false\n SECONDS=0\n while (( SECONDS < timeout_duration )); do\n if osascript -e \"tell application id \\\"$bundle_id\\\" to quit\" >/dev/null 2>&1; then\n if ! pgrep -f \"$bundle_id\" >/dev/null 2>&1; then\n echo \"Application '$bundle_id' quit successfully.\"\n quit_success=true\n break\n fi\n fi\n sleep 1\n done\n\n if [[ \"$quit_success\" = false ]]; then\n echo \"Application '$bundle_id' did not quit.\"\n fi\n}\n\n\n# extract contents\nMOUNT_POINT=$(mktemp -d /tmp/dmg_mount_XXXXXX)\nhdiutil attach -plist -nobrowse -readonly -mountpoint \"$MOUNT_POINT\" \"$INSTALLER_PATH\"\nsudo cp -R \"$MOUNT_POINT\"/* \"$TMPDIR\"\nhdiutil detach \"$MOUNT_POINT\"\n# copy to the applications folder\nquit_application 'eu.exelban.Stats'\nif [ -d \"$APPDIR/Stats.app\" ]; then\n\tsudo mv \"$APPDIR/Stats.app\" \"$TMPDIR/Stats.app.bkp\"\nfi\nsudo cp -R \"$TMPDIR/Stats.app\" \"$APPDIR\"\n" + } +} diff --git a/ee/maintained-apps/outputs/sublime-merge/darwin.json b/ee/maintained-apps/outputs/sublime-merge/darwin.json new file mode 100644 index 0000000000..9c14ac833d --- /dev/null +++ b/ee/maintained-apps/outputs/sublime-merge/darwin.json @@ -0,0 +1,21 @@ +{ + "versions": [ + { + "version": "2112", + "queries": { + "exists": "SELECT 1 FROM apps WHERE bundle_identifier = 'com.sublimemerge';" + }, + "installer_url": "https://download.sublimetext.com/sublime_merge_build_2112_mac.zip", + "install_script_ref": "0afac373", + "uninstall_script_ref": "cd1ff75d", + "sha256": "a9a6c5cf3760b4d6a767cf32847a7fc47fdeeb8bad893e6f834dbfbfef7f33e5", + "default_categories": [ + "Developer tools" + ] + } + ], + "refs": { + "0afac373": "#!/bin/sh\n\n# variables\nAPPDIR=\"/Applications/\"\nTMPDIR=$(dirname \"$(realpath $INSTALLER_PATH)\")\n# functions\n\nquit_application() {\n local bundle_id=\"$1\"\n local timeout_duration=10\n\n # check if the application is running\n if ! osascript -e \"application id \\\"$bundle_id\\\" is running\" 2>/dev/null; then\n return\n fi\n\n local console_user\n console_user=$(stat -f \"%Su\" /dev/console)\n if [[ $EUID -eq 0 && \"$console_user\" == \"root\" ]]; then\n echo \"Not logged into a non-root GUI; skipping quitting application ID '$bundle_id'.\"\n return\n fi\n\n echo \"Quitting application '$bundle_id'...\"\n\n # try to quit the application within the timeout period\n local quit_success=false\n SECONDS=0\n while (( SECONDS < timeout_duration )); do\n if osascript -e \"tell application id \\\"$bundle_id\\\" to quit\" >/dev/null 2>&1; then\n if ! pgrep -f \"$bundle_id\" >/dev/null 2>&1; then\n echo \"Application '$bundle_id' quit successfully.\"\n quit_success=true\n break\n fi\n fi\n sleep 1\n done\n\n if [[ \"$quit_success\" = false ]]; then\n echo \"Application '$bundle_id' did not quit.\"\n fi\n}\n\n\n# extract contents\nunzip \"$INSTALLER_PATH\" -d \"$TMPDIR\"\n# copy to the applications folder\nquit_application 'com.sublimemerge'\nif [ -d \"$APPDIR/Sublime Merge.app\" ]; then\n\tsudo mv \"$APPDIR/Sublime Merge.app\" \"$TMPDIR/Sublime Merge.app.bkp\"\nfi\nsudo cp -R \"$TMPDIR/Sublime Merge.app\" \"$APPDIR\"\n", + "cd1ff75d": "#!/bin/sh\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 if ! osascript -e \"application id \\\"$bundle_id\\\" is running\" 2>/dev/null; then\n return\n fi\n\n local console_user\n console_user=$(stat -f \"%Su\" /dev/console)\n if [[ $EUID -eq 0 && \"$console_user\" == \"root\" ]]; then\n echo \"Not logged into a non-root GUI; skipping quitting application ID '$bundle_id'.\"\n return\n fi\n\n echo \"Quitting application '$bundle_id'...\"\n\n # try to quit the application within the timeout period\n local quit_success=false\n SECONDS=0\n while (( SECONDS < timeout_duration )); do\n if osascript -e \"tell application id \\\"$bundle_id\\\" to quit\" >/dev/null 2>&1; then\n if ! pgrep -f \"$bundle_id\" >/dev/null 2>&1; then\n echo \"Application '$bundle_id' quit successfully.\"\n quit_success=true\n break\n fi\n fi\n sleep 1\n done\n\n if [[ \"$quit_success\" = false ]]; then\n echo \"Application '$bundle_id' did not quit.\"\n fi\n}\n\n\ntrash() {\n local logged_in_user=\"$1\"\n local target_file=\"$2\"\n local timestamp=\"$(date +%Y-%m-%d-%s)\"\n local rand=\"$(jot -r 1 0 99999)\"\n\n # replace ~ with /Users/$logged_in_user\n if [[ \"$target_file\" == ~* ]]; then\n target_file=\"/Users/$logged_in_user${target_file:1}\"\n fi\n\n local trash=\"/Users/$logged_in_user/.Trash\"\n local file_name=\"$(basename \"${target_file}\")\"\n\n if [[ -e \"$target_file\" ]]; then\n echo \"removing $target_file.\"\n mv -f \"$target_file\" \"$trash/${file_name}_${timestamp}_${rand}\"\n else\n echo \"$target_file doesn't exist.\"\n fi\n}\n\nquit_application 'com.sublimemerge'\nsudo rm -rf \"$APPDIR/Sublime Merge.app\"\ntrash $LOGGED_IN_USER '~/Library/Application Support/com.apple.sharedfilelist/com.apple.LSSharedFileList.ApplicationRecentDocuments/com.sublimemerge.sfl*'\ntrash $LOGGED_IN_USER '~/Library/Application Support/Sublime Merge'\ntrash $LOGGED_IN_USER '~/Library/Caches/com.sublimemerge'\ntrash $LOGGED_IN_USER '~/Library/Preferences/com.sublimemerge.plist'\ntrash $LOGGED_IN_USER '~/Library/Saved Application State/com.sublimemerge.savedState'\n" + } +} diff --git a/ee/maintained-apps/outputs/surfshark/darwin.json b/ee/maintained-apps/outputs/surfshark/darwin.json new file mode 100644 index 0000000000..c5f747dc6f --- /dev/null +++ b/ee/maintained-apps/outputs/surfshark/darwin.json @@ -0,0 +1,21 @@ +{ + "versions": [ + { + "version": "4.24.1", + "queries": { + "exists": "SELECT 1 FROM apps WHERE bundle_identifier = 'com.surfshark.vpnclient.macos.direct';" + }, + "installer_url": "https://downloads.surfshark.com/macOS/stable/4.24.1/4031/Surfshark.dmg", + "install_script_ref": "b1bee585", + "uninstall_script_ref": "a2b88fd6", + "sha256": "13e662272be822a6dfd9316fa1503e9c26ad97e9cdcfae6738bcfa97e4ab34dc", + "default_categories": [ + "Productivity" + ] + } + ], + "refs": { + "a2b88fd6": "#!/bin/sh\n\n# variables\nAPPDIR=\"/Applications/\"\nLOGGED_IN_USER=$(scutil <<< \"show State:/Users/ConsoleUser\" | awk '/Name :/ { print $3 }')\n# functions\n\ntrash() {\n local logged_in_user=\"$1\"\n local target_file=\"$2\"\n local timestamp=\"$(date +%Y-%m-%d-%s)\"\n local rand=\"$(jot -r 1 0 99999)\"\n\n # replace ~ with /Users/$logged_in_user\n if [[ \"$target_file\" == ~* ]]; then\n target_file=\"/Users/$logged_in_user${target_file:1}\"\n fi\n\n local trash=\"/Users/$logged_in_user/.Trash\"\n local file_name=\"$(basename \"${target_file}\")\"\n\n if [[ -e \"$target_file\" ]]; then\n echo \"removing $target_file.\"\n mv -f \"$target_file\" \"$trash/${file_name}_${timestamp}_${rand}\"\n else\n echo \"$target_file doesn't exist.\"\n fi\n}\n\nsudo rm -rf \"$APPDIR/Surfshark.app\"\ntrash $LOGGED_IN_USER '~/Library/Application Scripts/com.surfshark.vpnclient.macos*'\ntrash $LOGGED_IN_USER '~/Library/Application Support/CrashReporter/Surfshark.OpenVPN_*.plist'\ntrash $LOGGED_IN_USER '~/Library/Containers/com.surfshark.vpnclient.macos*'\ntrash $LOGGED_IN_USER '~/Library/Group Containers/YHUG37CKN8.com.surfshark.vpn'\ntrash $LOGGED_IN_USER '~/Library/Saved Application State/com.surfshark.vpnclient.macos.savedState'\n", + "b1bee585": "#!/bin/sh\n\n# variables\nAPPDIR=\"/Applications/\"\nTMPDIR=$(dirname \"$(realpath $INSTALLER_PATH)\")\n# functions\n\nquit_application() {\n local bundle_id=\"$1\"\n local timeout_duration=10\n\n # check if the application is running\n if ! osascript -e \"application id \\\"$bundle_id\\\" is running\" 2>/dev/null; then\n return\n fi\n\n local console_user\n console_user=$(stat -f \"%Su\" /dev/console)\n if [[ $EUID -eq 0 && \"$console_user\" == \"root\" ]]; then\n echo \"Not logged into a non-root GUI; skipping quitting application ID '$bundle_id'.\"\n return\n fi\n\n echo \"Quitting application '$bundle_id'...\"\n\n # try to quit the application within the timeout period\n local quit_success=false\n SECONDS=0\n while (( SECONDS < timeout_duration )); do\n if osascript -e \"tell application id \\\"$bundle_id\\\" to quit\" >/dev/null 2>&1; then\n if ! pgrep -f \"$bundle_id\" >/dev/null 2>&1; then\n echo \"Application '$bundle_id' quit successfully.\"\n quit_success=true\n break\n fi\n fi\n sleep 1\n done\n\n if [[ \"$quit_success\" = false ]]; then\n echo \"Application '$bundle_id' did not quit.\"\n fi\n}\n\n\n# extract contents\nMOUNT_POINT=$(mktemp -d /tmp/dmg_mount_XXXXXX)\nhdiutil attach -plist -nobrowse -readonly -mountpoint \"$MOUNT_POINT\" \"$INSTALLER_PATH\"\nsudo cp -R \"$MOUNT_POINT\"/* \"$TMPDIR\"\nhdiutil detach \"$MOUNT_POINT\"\n# copy to the applications folder\nquit_application 'com.surfshark.vpnclient.macos.direct'\nif [ -d \"$APPDIR/Surfshark.app\" ]; then\n\tsudo mv \"$APPDIR/Surfshark.app\" \"$TMPDIR/Surfshark.app.bkp\"\nfi\nsudo cp -R \"$TMPDIR/Surfshark.app\" \"$APPDIR\"\n" + } +} diff --git a/ee/maintained-apps/outputs/suspicious-package/darwin.json b/ee/maintained-apps/outputs/suspicious-package/darwin.json new file mode 100644 index 0000000000..674f9f70bc --- /dev/null +++ b/ee/maintained-apps/outputs/suspicious-package/darwin.json @@ -0,0 +1,21 @@ +{ + "versions": [ + { + "version": "4.6", + "queries": { + "exists": "SELECT 1 FROM apps WHERE bundle_identifier = 'com.mothersruin.SuspiciousPackage';" + }, + "installer_url": "https://www.mothersruin.com/software/downloads/SuspiciousPackage.dmg", + "install_script_ref": "f6117813", + "uninstall_script_ref": "80330be8", + "sha256": "no_check", + "default_categories": [ + "Developer tools" + ] + } + ], + "refs": { + "80330be8": "#!/bin/sh\n\n# variables\nAPPDIR=\"/Applications/\"\nLOGGED_IN_USER=$(scutil <<< \"show State:/Users/ConsoleUser\" | awk '/Name :/ { print $3 }')\n# functions\n\ntrash() {\n local logged_in_user=\"$1\"\n local target_file=\"$2\"\n local timestamp=\"$(date +%Y-%m-%d-%s)\"\n local rand=\"$(jot -r 1 0 99999)\"\n\n # replace ~ with /Users/$logged_in_user\n if [[ \"$target_file\" == ~* ]]; then\n target_file=\"/Users/$logged_in_user${target_file:1}\"\n fi\n\n local trash=\"/Users/$logged_in_user/.Trash\"\n local file_name=\"$(basename \"${target_file}\")\"\n\n if [[ -e \"$target_file\" ]]; then\n echo \"removing $target_file.\"\n mv -f \"$target_file\" \"$trash/${file_name}_${timestamp}_${rand}\"\n else\n echo \"$target_file doesn't exist.\"\n fi\n}\n\nsudo rm -rf \"$APPDIR/Suspicious Package.app\"\ntrash $LOGGED_IN_USER '~/Library/Application Scripts/com.mothersruin.SuspiciousPackageApp.QLPreview'\ntrash $LOGGED_IN_USER '~/Library/Application Support/com.apple.sharedfilelist/com.apple.LSSharedFileList.ApplicationRecentDocuments/com.mothersruin.suspiciouspackageapp.sfl*'\ntrash $LOGGED_IN_USER '~/Library/Caches/com.mothersruin.SuspiciousPackageApp'\ntrash $LOGGED_IN_USER '~/Library/Caches/com.mothersruin.XPCService.UpdateChecker'\ntrash $LOGGED_IN_USER '~/Library/Containers/com.mothersruin.SuspiciousPackageApp.QLPreview'\ntrash $LOGGED_IN_USER '~/Library/Preferences/com.mothersruin.SuspiciousPackage.plist'\ntrash $LOGGED_IN_USER '~/Library/Preferences/com.mothersruin.SuspiciousPackageApp.plist'\ntrash $LOGGED_IN_USER '~/Library/Saved Application State/com.mothersruin.SuspiciousPackageApp.savedState'\ntrash $LOGGED_IN_USER '~/Library/WebKit/com.mothersruin.SuspiciousPackageApp'\n", + "f6117813": "#!/bin/sh\n\n# variables\nAPPDIR=\"/Applications/\"\nTMPDIR=$(dirname \"$(realpath $INSTALLER_PATH)\")\n# functions\n\nquit_application() {\n local bundle_id=\"$1\"\n local timeout_duration=10\n\n # check if the application is running\n if ! osascript -e \"application id \\\"$bundle_id\\\" is running\" 2>/dev/null; then\n return\n fi\n\n local console_user\n console_user=$(stat -f \"%Su\" /dev/console)\n if [[ $EUID -eq 0 && \"$console_user\" == \"root\" ]]; then\n echo \"Not logged into a non-root GUI; skipping quitting application ID '$bundle_id'.\"\n return\n fi\n\n echo \"Quitting application '$bundle_id'...\"\n\n # try to quit the application within the timeout period\n local quit_success=false\n SECONDS=0\n while (( SECONDS < timeout_duration )); do\n if osascript -e \"tell application id \\\"$bundle_id\\\" to quit\" >/dev/null 2>&1; then\n if ! pgrep -f \"$bundle_id\" >/dev/null 2>&1; then\n echo \"Application '$bundle_id' quit successfully.\"\n quit_success=true\n break\n fi\n fi\n sleep 1\n done\n\n if [[ \"$quit_success\" = false ]]; then\n echo \"Application '$bundle_id' did not quit.\"\n fi\n}\n\n\n# extract contents\nMOUNT_POINT=$(mktemp -d /tmp/dmg_mount_XXXXXX)\nhdiutil attach -plist -nobrowse -readonly -mountpoint \"$MOUNT_POINT\" \"$INSTALLER_PATH\"\nsudo cp -R \"$MOUNT_POINT\"/* \"$TMPDIR\"\nhdiutil detach \"$MOUNT_POINT\"\n# copy to the applications folder\nquit_application 'com.mothersruin.SuspiciousPackage'\nif [ -d \"$APPDIR/Suspicious Package.app\" ]; then\n\tsudo mv \"$APPDIR/Suspicious Package.app\" \"$TMPDIR/Suspicious Package.app.bkp\"\nfi\nsudo cp -R \"$TMPDIR/Suspicious Package.app\" \"$APPDIR\"\n" + } +} diff --git a/frontend/pages/SoftwarePage/components/icons/FileMakerPro.tsx b/frontend/pages/SoftwarePage/components/icons/FileMakerPro.tsx new file mode 100644 index 0000000000..b7eb485a50 --- /dev/null +++ b/frontend/pages/SoftwarePage/components/icons/FileMakerPro.tsx @@ -0,0 +1,14 @@ +import * as React from "react"; + +import type { SVGProps } from "react"; + +const FileMakerPro = (props: SVGProps) => ( + + + +); +export default FileMakerPro; diff --git a/frontend/pages/SoftwarePage/components/icons/Nordpass.tsx b/frontend/pages/SoftwarePage/components/icons/Nordpass.tsx new file mode 100644 index 0000000000..dcdb6b6d58 --- /dev/null +++ b/frontend/pages/SoftwarePage/components/icons/Nordpass.tsx @@ -0,0 +1,14 @@ +import * as React from "react"; + +import type { SVGProps } from "react"; + +const Nordpass = (props: SVGProps) => ( + + + +); +export default Nordpass; diff --git a/frontend/pages/SoftwarePage/components/icons/Obs.tsx b/frontend/pages/SoftwarePage/components/icons/Obs.tsx new file mode 100644 index 0000000000..d4a586ba03 --- /dev/null +++ b/frontend/pages/SoftwarePage/components/icons/Obs.tsx @@ -0,0 +1,14 @@ +import * as React from "react"; + +import type { SVGProps } from "react"; + +const Obs = (props: SVGProps) => ( + + + +); +export default Obs; diff --git a/frontend/pages/SoftwarePage/components/icons/Obsidian.tsx b/frontend/pages/SoftwarePage/components/icons/Obsidian.tsx new file mode 100644 index 0000000000..400da29c2e --- /dev/null +++ b/frontend/pages/SoftwarePage/components/icons/Obsidian.tsx @@ -0,0 +1,14 @@ +import * as React from "react"; + +import type { SVGProps } from "react"; + +const Obsidian = (props: SVGProps) => ( + + + +); +export default Obsidian; diff --git a/frontend/pages/SoftwarePage/components/icons/OrbStack.tsx b/frontend/pages/SoftwarePage/components/icons/OrbStack.tsx new file mode 100644 index 0000000000..dbab108dec --- /dev/null +++ b/frontend/pages/SoftwarePage/components/icons/OrbStack.tsx @@ -0,0 +1,14 @@ +import * as React from "react"; + +import type { SVGProps } from "react"; + +const OrbStack = (props: SVGProps) => ( + + + +); +export default OrbStack; diff --git a/frontend/pages/SoftwarePage/components/icons/PgAdmin4.tsx b/frontend/pages/SoftwarePage/components/icons/PgAdmin4.tsx new file mode 100644 index 0000000000..0bdf6a04b9 --- /dev/null +++ b/frontend/pages/SoftwarePage/components/icons/PgAdmin4.tsx @@ -0,0 +1,14 @@ +import * as React from "react"; + +import type { SVGProps } from "react"; + +const PgAdmin4 = (props: SVGProps) => ( + + + +); +export default PgAdmin4; diff --git a/frontend/pages/SoftwarePage/components/icons/RapidApi.tsx b/frontend/pages/SoftwarePage/components/icons/RapidApi.tsx new file mode 100644 index 0000000000..f89b8ecce2 --- /dev/null +++ b/frontend/pages/SoftwarePage/components/icons/RapidApi.tsx @@ -0,0 +1,14 @@ +import * as React from "react"; + +import type { SVGProps } from "react"; + +const RapidApi = (props: SVGProps) => ( + + + +); +export default RapidApi; diff --git a/frontend/pages/SoftwarePage/components/icons/RoyalTsx.tsx b/frontend/pages/SoftwarePage/components/icons/RoyalTsx.tsx new file mode 100644 index 0000000000..10b3c32a6c --- /dev/null +++ b/frontend/pages/SoftwarePage/components/icons/RoyalTsx.tsx @@ -0,0 +1,14 @@ +import * as React from "react"; + +import type { SVGProps } from "react"; + +const RoyalTsx = (props: SVGProps) => ( + + + +); +export default RoyalTsx; diff --git a/frontend/pages/SoftwarePage/components/icons/Shottr.tsx b/frontend/pages/SoftwarePage/components/icons/Shottr.tsx new file mode 100644 index 0000000000..5b9d66639b --- /dev/null +++ b/frontend/pages/SoftwarePage/components/icons/Shottr.tsx @@ -0,0 +1,14 @@ +import * as React from "react"; + +import type { SVGProps } from "react"; + +const Shottr = (props: SVGProps) => ( + + + +); +export default Shottr; diff --git a/frontend/pages/SoftwarePage/components/icons/SplashtopBusiness.tsx b/frontend/pages/SoftwarePage/components/icons/SplashtopBusiness.tsx new file mode 100644 index 0000000000..a304c94d89 --- /dev/null +++ b/frontend/pages/SoftwarePage/components/icons/SplashtopBusiness.tsx @@ -0,0 +1,14 @@ +import * as React from "react"; + +import type { SVGProps } from "react"; + +const SplashtopBusiness = (props: SVGProps) => ( + + + +); +export default SplashtopBusiness; diff --git a/frontend/pages/SoftwarePage/components/icons/SplashtopStreamer.tsx b/frontend/pages/SoftwarePage/components/icons/SplashtopStreamer.tsx new file mode 100644 index 0000000000..a0bce90ddb --- /dev/null +++ b/frontend/pages/SoftwarePage/components/icons/SplashtopStreamer.tsx @@ -0,0 +1,14 @@ +import * as React from "react"; + +import type { SVGProps } from "react"; + +const SplashtopStreamer = (props: SVGProps) => ( + + + +); +export default SplashtopStreamer; diff --git a/frontend/pages/SoftwarePage/components/icons/Stats.tsx b/frontend/pages/SoftwarePage/components/icons/Stats.tsx new file mode 100644 index 0000000000..16a0efb5a8 --- /dev/null +++ b/frontend/pages/SoftwarePage/components/icons/Stats.tsx @@ -0,0 +1,14 @@ +import * as React from "react"; + +import type { SVGProps } from "react"; + +const Stats = (props: SVGProps) => ( + + + +); +export default Stats; diff --git a/frontend/pages/SoftwarePage/components/icons/SublimeMerge.tsx b/frontend/pages/SoftwarePage/components/icons/SublimeMerge.tsx new file mode 100644 index 0000000000..b7742f8326 --- /dev/null +++ b/frontend/pages/SoftwarePage/components/icons/SublimeMerge.tsx @@ -0,0 +1,14 @@ +import * as React from "react"; + +import type { SVGProps } from "react"; + +const SublimeMerge = (props: SVGProps) => ( + + + +); +export default SublimeMerge; diff --git a/frontend/pages/SoftwarePage/components/icons/Surfshark.tsx b/frontend/pages/SoftwarePage/components/icons/Surfshark.tsx new file mode 100644 index 0000000000..c279dab2f0 --- /dev/null +++ b/frontend/pages/SoftwarePage/components/icons/Surfshark.tsx @@ -0,0 +1,14 @@ +import * as React from "react"; + +import type { SVGProps } from "react"; + +const Surfshark = (props: SVGProps) => ( + + + +); +export default Surfshark; diff --git a/frontend/pages/SoftwarePage/components/icons/SuspiciousPackage.tsx b/frontend/pages/SoftwarePage/components/icons/SuspiciousPackage.tsx new file mode 100644 index 0000000000..070c316835 --- /dev/null +++ b/frontend/pages/SoftwarePage/components/icons/SuspiciousPackage.tsx @@ -0,0 +1,14 @@ +import * as React from "react"; + +import type { SVGProps } from "react"; + +const SuspiciousPackage = (props: SVGProps) => ( + + + +); +export default SuspiciousPackage; diff --git a/frontend/pages/SoftwarePage/components/icons/index.ts b/frontend/pages/SoftwarePage/components/icons/index.ts index 57e7d59b56..07da5ae769 100644 --- a/frontend/pages/SoftwarePage/components/icons/index.ts +++ b/frontend/pages/SoftwarePage/components/icons/index.ts @@ -77,6 +77,7 @@ import ExpressVpn from "./ExpressVpn"; import Extension from "./Extension"; import Falcon from "./Falcon"; import Figma from "./Figma"; +import FileMakerPro from "./FileMakerPro"; import Firefox from "./Firefox"; import Fork from "./Fork"; import Front from "./Front"; @@ -123,19 +124,24 @@ import MicrosoftPowerPoint from "./MicrosoftPowerPoint"; import Miro from "./Miro"; import MongoDbCompass from "./MongoDbCompass"; import MySqlWorkbench from "./MySqlWorkbench"; +import Nordpass from "./Nordpass"; import NordVpn from "./NordVpn"; import Notion from "./Notion"; import NotionCalendar from "./NotionCalendar"; import Nova from "./Nova"; import Nudge from "./Nudge"; +import Obs from "./Obs"; +import Obsidian from "./Obsidian"; import OmniGraffle from "./OmniGraffle"; import OmnissaHorizonClient from "./OmnissaHorizonClient"; import OneDrive from "./OneDrive"; import OnePassword from "./OnePassword"; import Opera from "./Opera"; +import OrbStack from "./OrbStack"; import P4V from "./P4V"; import Package from "./Package"; import ParallelsDesktop from "./ParallelsDesktop"; +import PgAdmin4 from "./PgAdmin4"; import PhpStorm from "./PhpStorm"; import PodmanDesktop from "./PodmanDesktop"; import Postman from "./Postman"; @@ -147,20 +153,29 @@ import PyCharm from "./PyCharm"; import PyCharmCe from "./PyCharmCe"; import Quip from "./Quip"; import RancherDesktop from "./RancherDesktop"; +import RapidApi from "./RapidApi"; import Raycast from "./Raycast"; import Rectangle from "./Rectangle"; import Rider from "./Rider"; +import RoyalTsx from "./RoyalTsx"; import RubyMine from "./RubyMine"; import RustRover from "./RustRover"; import Safari from "./Safari"; import Santa from "./Santa"; +import Shottr from "./Shottr"; import Signal from "./Signal"; import Sketch from "./Sketch"; import Slack from "./Slack"; import Snagit from "./Snagit"; import Sourcetree from "./Sourcetree"; +import SplashtopBusiness from "./SplashtopBusiness"; +import SplashtopStreamer from "./SplashtopStreamer"; import Spotify from "./Spotify"; +import Stats from "./Stats"; +import SublimeMerge from "./SublimeMerge"; import SublimeText from "./SublimeText"; +import Surfshark from "./Surfshark"; +import SuspiciousPackage from "./SuspiciousPackage"; import TableauDesktop from "./TableauDesktop"; import TablePlus from "./TablePlus"; import Tailscale from "./Tailscale"; @@ -273,6 +288,7 @@ export const SOFTWARE_NAME_TO_ICON_MAP = { expressvpn: ExpressVpn, falcon: Falcon, figma: Figma, + "filemaker pro": FileMakerPro, firefox: Firefox, fork: Fork, front: Front, @@ -322,18 +338,23 @@ export const SOFTWARE_NAME_TO_ICON_MAP = { miro: Miro, "mysql workbench": MySqlWorkbench, "nord vpn": NordVpn, + nordpass: Nordpass, nordvpn: NordVpn, "notion calendar": NotionCalendar, notion: Notion, nova: Nova, nudge: Nudge, + obs: Obs, + obsidian: Obsidian, omnigraffle: OmniGraffle, "omnissa horizon client": OmnissaHorizonClient, onedrive: OneDrive, opera: Opera, + orbstack: OrbStack, package: Package, "parallels desktop": ParallelsDesktop, p4v: P4V, + "pgadmin 4": PgAdmin4, phpstorm: PhpStorm, "podman desktop": PodmanDesktop, postman: Postman, @@ -345,21 +366,30 @@ export const SOFTWARE_NAME_TO_ICON_MAP = { pycharm: PyCharm, quip: Quip, "rancher desktop": RancherDesktop, + rapidapi: RapidApi, raycast: Raycast, rectangle: Rectangle, rider: Rider, + "royal tsx": RoyalTsx, rubymine: RubyMine, rustrover: RustRover, safari: Safari, santa: Santa, + shottr: Shottr, signal: Signal, sketch: Sketch, slack: Slack, snagit: Snagit, sourcetree: Sourcetree, + "splashtop business": SplashtopBusiness, + "splashtop streamer": SplashtopStreamer, spotify: Spotify, + stats: Stats, "stream deck": ElgatoStreamDeck, + "sublime merge": SublimeMerge, "sublime text": SublimeText, + surfshark: Surfshark, + "suspicious package": SuspiciousPackage, tableau: TableauDesktop, tableplus: TablePlus, tailscale: Tailscale, diff --git a/website/assets/images/app-icon-filemaker-pro-60x60@2x.png b/website/assets/images/app-icon-filemaker-pro-60x60@2x.png new file mode 100644 index 0000000000..46379e22ca Binary files /dev/null and b/website/assets/images/app-icon-filemaker-pro-60x60@2x.png differ diff --git a/website/assets/images/app-icon-nordpass-60x60@2x.png b/website/assets/images/app-icon-nordpass-60x60@2x.png new file mode 100644 index 0000000000..e0bdbdcc1b Binary files /dev/null and b/website/assets/images/app-icon-nordpass-60x60@2x.png differ diff --git a/website/assets/images/app-icon-obs-60x60@2x.png b/website/assets/images/app-icon-obs-60x60@2x.png new file mode 100644 index 0000000000..2c8a4a3296 Binary files /dev/null and b/website/assets/images/app-icon-obs-60x60@2x.png differ diff --git a/website/assets/images/app-icon-obsidian-60x60@2x.png b/website/assets/images/app-icon-obsidian-60x60@2x.png new file mode 100644 index 0000000000..e4fea0a69b Binary files /dev/null and b/website/assets/images/app-icon-obsidian-60x60@2x.png differ diff --git a/website/assets/images/app-icon-orbstack-60x60@2x.png b/website/assets/images/app-icon-orbstack-60x60@2x.png new file mode 100644 index 0000000000..b549f0374a Binary files /dev/null and b/website/assets/images/app-icon-orbstack-60x60@2x.png differ diff --git a/website/assets/images/app-icon-pgadmin4-60x60@2x.png b/website/assets/images/app-icon-pgadmin4-60x60@2x.png new file mode 100644 index 0000000000..8060347f23 Binary files /dev/null and b/website/assets/images/app-icon-pgadmin4-60x60@2x.png differ diff --git a/website/assets/images/app-icon-rapidapi-60x60@2x.png b/website/assets/images/app-icon-rapidapi-60x60@2x.png new file mode 100644 index 0000000000..8122fa4af8 Binary files /dev/null and b/website/assets/images/app-icon-rapidapi-60x60@2x.png differ diff --git a/website/assets/images/app-icon-royal-tsx-60x60@2x.png b/website/assets/images/app-icon-royal-tsx-60x60@2x.png new file mode 100644 index 0000000000..067613503a Binary files /dev/null and b/website/assets/images/app-icon-royal-tsx-60x60@2x.png differ diff --git a/website/assets/images/app-icon-shottr-60x60@2x.png b/website/assets/images/app-icon-shottr-60x60@2x.png new file mode 100644 index 0000000000..e1aa62cbdc Binary files /dev/null and b/website/assets/images/app-icon-shottr-60x60@2x.png differ diff --git a/website/assets/images/app-icon-splashtop-business-60x60@2x.png b/website/assets/images/app-icon-splashtop-business-60x60@2x.png new file mode 100644 index 0000000000..47fc4cb123 Binary files /dev/null and b/website/assets/images/app-icon-splashtop-business-60x60@2x.png differ diff --git a/website/assets/images/app-icon-splashtop-streamer-60x60@2x.png b/website/assets/images/app-icon-splashtop-streamer-60x60@2x.png new file mode 100644 index 0000000000..d2fa010a23 Binary files /dev/null and b/website/assets/images/app-icon-splashtop-streamer-60x60@2x.png differ diff --git a/website/assets/images/app-icon-stats-60x60@2x.png b/website/assets/images/app-icon-stats-60x60@2x.png new file mode 100644 index 0000000000..300ee5c986 Binary files /dev/null and b/website/assets/images/app-icon-stats-60x60@2x.png differ diff --git a/website/assets/images/app-icon-sublime-merge-60x60@2x.png b/website/assets/images/app-icon-sublime-merge-60x60@2x.png new file mode 100644 index 0000000000..1cf951c44d Binary files /dev/null and b/website/assets/images/app-icon-sublime-merge-60x60@2x.png differ diff --git a/website/assets/images/app-icon-surfshark-60x60@2x.png b/website/assets/images/app-icon-surfshark-60x60@2x.png new file mode 100644 index 0000000000..9b9ceb4060 Binary files /dev/null and b/website/assets/images/app-icon-surfshark-60x60@2x.png differ diff --git a/website/assets/images/app-icon-suspicious-package-60x60@2x.png b/website/assets/images/app-icon-suspicious-package-60x60@2x.png new file mode 100644 index 0000000000..b29138dcb9 Binary files /dev/null and b/website/assets/images/app-icon-suspicious-package-60x60@2x.png differ