Skip to content

Update Fleet-maintained apps - #46680

Closed
fleet-release wants to merge 1 commit into
mainfrom
fma-2606022058
Closed

Update Fleet-maintained apps#46680
fleet-release wants to merge 1 commit into
mainfrom
fma-2606022058

Conversation

@fleet-release

@fleet-release fleet-release commented Jun 2, 2026

Copy link
Copy Markdown
Contributor

Automated ingestion of latest Fleet-maintained app data.

Summary by CodeRabbit

Chores

  • Updated maintained app metadata for 14 applications to support the latest available versions, including 1Password, Android Studio, Camtasia, Claude, Cursor, Figma, Firefox, GitKraken, Google Gemini, JetBrains Toolbox, Microsoft Outlook, Miro, NordPass, and WhatsApp across macOS and Windows platforms.

Generated automatically with cmd/maintained-apps.

@claude claude Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Claude Code Review

This repository is configured for manual code reviews. Comment @claude review to trigger a review and subscribe this PR to future pushes, or @claude review once for a one-time review.

Tip: disable this comment in your organization's Code Review settings.

@github-actions

github-actions Bot commented Jun 2, 2026

Copy link
Copy Markdown
Contributor

Script Diff Results

ee/maintained-apps/outputs/1password/darwin.json

=== Install Script (no changes) ===
=== Uninstall Script (no changes) ===

ee/maintained-apps/outputs/android-studio/darwin.json

=== Install Script (no changes) ===
=== Uninstall // 237e23f1 -> aa386b1a ===

--- /tmp/old.p8bAtO	2026-06-02 21:03:15.174372327 +0000
+++ /tmp/new.lgMz1k	2026-06-02 21:03:15.174372327 +0000
@@ -57,9 +57,9 @@
 sudo rmdir '~/Library/Android'
 trash $LOGGED_IN_USER '~/.android'
 trash $LOGGED_IN_USER '~/Library/Android/sdk'
-trash $LOGGED_IN_USER '~/Library/Application Support/Google/AndroidStudio2025.3'
-trash $LOGGED_IN_USER '~/Library/Caches/Google/AndroidStudio2025.3'
-trash $LOGGED_IN_USER '~/Library/Logs/Google/AndroidStudio2025.3'
+trash $LOGGED_IN_USER '~/Library/Application Support/Google/AndroidStudio2026.1'
+trash $LOGGED_IN_USER '~/Library/Caches/Google/AndroidStudio2026.1'
+trash $LOGGED_IN_USER '~/Library/Logs/Google/AndroidStudio2026.1'
 trash $LOGGED_IN_USER '~/Library/Preferences/com.android.Emulator.plist'
 trash $LOGGED_IN_USER '~/Library/Preferences/com.google.android.studio.plist'
 trash $LOGGED_IN_USER '~/Library/Saved Application State/com.google.android.studio.savedState'

ee/maintained-apps/outputs/android-studio/windows.json

=== Install Script (no changes) ===
=== Uninstall Script (no changes) ===

ee/maintained-apps/outputs/camtasia/darwin.json

=== Install Script (no changes) ===
=== Uninstall Script (no changes) ===

ee/maintained-apps/outputs/claude/windows.json

=== Install Script (no changes) ===
=== Uninstall Script (no changes) ===

ee/maintained-apps/outputs/cursor/windows.json

=== Install Script (no changes) ===
=== Uninstall Script (no changes) ===

ee/maintained-apps/outputs/figma/windows.json

=== Install Script (no changes) ===
=== Uninstall Script (no changes) ===

ee/maintained-apps/outputs/firefox/darwin.json

=== Install Script (no changes) ===
=== Uninstall Script (no changes) ===

ee/maintained-apps/outputs/firefox/windows.json

=== Install Script (no changes) ===
=== Uninstall Script (no changes) ===

ee/maintained-apps/outputs/gitkraken/darwin.json

=== Install Script (no changes) ===
=== Uninstall Script (no changes) ===

ee/maintained-apps/outputs/google-gemini/darwin.json

=== Install Script (no changes) ===
=== Uninstall Script (no changes) ===

ee/maintained-apps/outputs/jetbrains-toolbox/darwin.json

=== Install Script (no changes) ===
=== Uninstall Script (no changes) ===

ee/maintained-apps/outputs/jetbrains-toolbox/windows.json

=== Install Script (no changes) ===
=== Uninstall Script (no changes) ===

ee/maintained-apps/outputs/microsoft-outlook/darwin.json

=== Install // 0e4e4b82 -> 6372af77 ===

--- /tmp/old.f2cLxs	2026-06-02 21:03:15.480372213 +0000
+++ /tmp/new.xqR80G	2026-06-02 21:03:15.480372213 +0000
@@ -117,6 +117,6 @@
 
 EOF
 
-sudo installer -pkg "$TMPDIR"/Microsoft_Outlook_16.109.26052523_Installer.pkg -target / -applyChoiceChangesXML "$CHOICE_XML"
+sudo installer -pkg "$TMPDIR"/Microsoft_Outlook_16.109.26053122_Installer.pkg -target / -applyChoiceChangesXML "$CHOICE_XML"
 
 relaunch_application 'com.microsoft.Outlook'

=== Uninstall Script (no changes) ===

ee/maintained-apps/outputs/miro/darwin.json

=== Install Script (no changes) ===
=== Uninstall Script (no changes) ===

ee/maintained-apps/outputs/nordpass/windows.json

=== Install Script (no changes) ===
=== Uninstall Script (no changes) ===

ee/maintained-apps/outputs/whatsapp/darwin.json

=== Install Script (no changes) ===
=== Uninstall Script (no changes) ===

@coderabbitai

coderabbitai Bot commented Jun 2, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

Walkthrough

This PR updates version metadata across 16 maintained-app JSON files in Fleet's enterprise module. Each file receives a version bump to its version field and corresponding queries.patched SQL version-comparison threshold, with installer URL and SHA-256 checksum updates. Two updates (Android Studio and Microsoft Outlook) also introduce new script reference IDs in the refs section, replacing prior uninstall and install script payloads to reflect the target versions' installer requirements.

Possibly related PRs

  • fleetdm/fleet#46204: Both PRs modify ee/maintained-apps/outputs/whatsapp/darwin.json, specifically the versions[0].version value and the queries.patched version_compare(bundle_short_version, ...) threshold.
  • fleetdm/fleet#45933: Both PRs directly modify the same maintained-app definition in ee/maintained-apps/outputs/figma/windows.json by updating the Windows version, queries.patched version threshold, and related installer_url/sha256.
  • fleetdm/fleet#45972: Both PRs update the same maintained-app metadata in ee/maintained-apps/outputs/1password/darwin.json by bumping versions[0] and the queries.patched version_compare(bundle_short_version, ...) threshold in tandem.
🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 inconclusive)

Check name Status Explanation Resolution
Description check ❓ Inconclusive The description is minimal but appropriate for an automated ingestion process. However, it lacks detail about what was updated and omits required template sections like changes files, testing, and validation checklist items. Clarify whether changes files are needed for this automated update, and confirm that testing/validation was performed for the updated application versions.
✅ Passed checks (4 passed)
Check name Status Explanation
Title check ✅ Passed The title 'Update Fleet-maintained apps' clearly and concisely summarizes the main change: updating version metadata for multiple Fleet-maintained applications.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch fma-2606022058

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@ee/maintained-apps/outputs/android-studio/darwin.json`:
- Line 19: The uninstall script is passing literal '~' because the rmdir calls
use single quotes (e.g. the lines calling sudo rmdir '~/AndroidStudioProjects'
and sudo rmdir '~/Library/Android'), so those paths never expand to the actual
user home; change those calls to use an expanded home path (either unquoted ~ or
explicitly /Users/$LOGGED_IN_USER) so the commands target the real directories
(you can also reuse the existing LOGGED_IN_USER variable or the trash() helper
for consistency).

In `@ee/maintained-apps/outputs/microsoft-outlook/darwin.json`:
- Around line 4-12: The JSON currently sets "version": "16.109" and the
"queries.patched" threshold to '16.109', but the installer
"Microsoft_Outlook_16.109.26053122_Installer.pkg" actually installs 16.109.2;
update the "version" field to "16.109.2" and change the comparisons used in
queries.patched (the string in the WHERE clause that compares
bundle_short_version) from '16.109' to '16.109.2' so hosts running
16.109.0/16.109.1 are not treated as compliant.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: 962af6a2-8623-48eb-ab3c-513fb8b27e7a

📥 Commits

Reviewing files that changed from the base of the PR and between 4022d1b and 63f0535.

📒 Files selected for processing (17)
  • ee/maintained-apps/outputs/1password/darwin.json
  • ee/maintained-apps/outputs/android-studio/darwin.json
  • ee/maintained-apps/outputs/android-studio/windows.json
  • ee/maintained-apps/outputs/camtasia/darwin.json
  • ee/maintained-apps/outputs/claude/windows.json
  • ee/maintained-apps/outputs/cursor/windows.json
  • ee/maintained-apps/outputs/figma/windows.json
  • ee/maintained-apps/outputs/firefox/darwin.json
  • ee/maintained-apps/outputs/firefox/windows.json
  • ee/maintained-apps/outputs/gitkraken/darwin.json
  • ee/maintained-apps/outputs/google-gemini/darwin.json
  • ee/maintained-apps/outputs/jetbrains-toolbox/darwin.json
  • ee/maintained-apps/outputs/jetbrains-toolbox/windows.json
  • ee/maintained-apps/outputs/microsoft-outlook/darwin.json
  • ee/maintained-apps/outputs/miro/darwin.json
  • ee/maintained-apps/outputs/nordpass/windows.json
  • ee/maintained-apps/outputs/whatsapp/darwin.json

],
"refs": {
"237e23f1": "#!/bin/bash\n\n# variables\nAPPDIR=\"/Applications/\"\nLOGGED_IN_USER=$(scutil <<< \"show State:/Users/ConsoleUser\" | awk '/Name :/ { print $3 }')\n# functions\n\ntrash() {\n local logged_in_user=\"$1\"\n local target_file=\"$2\"\n local timestamp=\"$(date +%Y-%m-%d-%s)\"\n local rand=\"$(jot -r 1 0 99999)\"\n\n # replace ~ with /Users/$logged_in_user\n if [[ \"$target_file\" == ~* ]]; then\n target_file=\"/Users/$logged_in_user${target_file:1}\"\n fi\n\n local trash=\"/Users/$logged_in_user/.Trash\"\n\n # If the target contains glob characters, expand it and move each match.\n if [[ \"$target_file\" == *[*?[]* ]]; then\n local file file_name\n local matched=false\n local i=0\n # compgen -G expands the (quoted) pattern itself, so paths containing\n # spaces glob correctly; reading line by line keeps each match intact.\n while IFS= read -r file; do\n [[ -n \"$file\" ]] || continue\n [[ -e \"$file\" || -L \"$file\" ]] || continue\n matched=true\n i=$((i + 1))\n file_name=\"$(basename \"$file\")\"\n echo \"removing $file.\"\n # The per-match counter keeps matches that share a basename from\n # overwriting each other in the trash.\n mv -f \"$file\" \"$trash/${file_name}_${timestamp}_${rand}_${i}\"\n done < <(compgen -G \"$target_file\" 2>/dev/null)\n if [[ \"$matched\" == false ]]; then\n echo \"$target_file doesn't exist.\"\n fi\n return\n fi\n\n local file_name=\"$(basename \"${target_file}\")\"\n\n if [[ -e \"$target_file\" ]]; then\n echo \"removing $target_file.\"\n mv -f \"$target_file\" \"$trash/${file_name}_${timestamp}_${rand}\"\n else\n echo \"$target_file doesn't exist.\"\n fi\n}\n\nsudo rm -rf \"$APPDIR/Android Studio.app\"\nsudo rmdir '~/AndroidStudioProjects'\nsudo rmdir '~/Library/Android'\ntrash $LOGGED_IN_USER '~/.android'\ntrash $LOGGED_IN_USER '~/Library/Android/sdk'\ntrash $LOGGED_IN_USER '~/Library/Application Support/Google/AndroidStudio2025.3'\ntrash $LOGGED_IN_USER '~/Library/Caches/Google/AndroidStudio2025.3'\ntrash $LOGGED_IN_USER '~/Library/Logs/Google/AndroidStudio2025.3'\ntrash $LOGGED_IN_USER '~/Library/Preferences/com.android.Emulator.plist'\ntrash $LOGGED_IN_USER '~/Library/Preferences/com.google.android.studio.plist'\ntrash $LOGGED_IN_USER '~/Library/Saved Application State/com.google.android.studio.savedState'\n",
"aa386b1a": "#!/bin/bash\n\n# variables\nAPPDIR=\"/Applications/\"\nLOGGED_IN_USER=$(scutil <<< \"show State:/Users/ConsoleUser\" | awk '/Name :/ { print $3 }')\n# functions\n\ntrash() {\n local logged_in_user=\"$1\"\n local target_file=\"$2\"\n local timestamp=\"$(date +%Y-%m-%d-%s)\"\n local rand=\"$(jot -r 1 0 99999)\"\n\n # replace ~ with /Users/$logged_in_user\n if [[ \"$target_file\" == ~* ]]; then\n target_file=\"/Users/$logged_in_user${target_file:1}\"\n fi\n\n local trash=\"/Users/$logged_in_user/.Trash\"\n\n # If the target contains glob characters, expand it and move each match.\n if [[ \"$target_file\" == *[*?[]* ]]; then\n local file file_name\n local matched=false\n local i=0\n # compgen -G expands the (quoted) pattern itself, so paths containing\n # spaces glob correctly; reading line by line keeps each match intact.\n while IFS= read -r file; do\n [[ -n \"$file\" ]] || continue\n [[ -e \"$file\" || -L \"$file\" ]] || continue\n matched=true\n i=$((i + 1))\n file_name=\"$(basename \"$file\")\"\n echo \"removing $file.\"\n # The per-match counter keeps matches that share a basename from\n # overwriting each other in the trash.\n mv -f \"$file\" \"$trash/${file_name}_${timestamp}_${rand}_${i}\"\n done < <(compgen -G \"$target_file\" 2>/dev/null)\n if [[ \"$matched\" == false ]]; then\n echo \"$target_file doesn't exist.\"\n fi\n return\n fi\n\n local file_name=\"$(basename \"${target_file}\")\"\n\n if [[ -e \"$target_file\" ]]; then\n echo \"removing $target_file.\"\n mv -f \"$target_file\" \"$trash/${file_name}_${timestamp}_${rand}\"\n else\n echo \"$target_file doesn't exist.\"\n fi\n}\n\nsudo rm -rf \"$APPDIR/Android Studio.app\"\nsudo rmdir '~/AndroidStudioProjects'\nsudo rmdir '~/Library/Android'\ntrash $LOGGED_IN_USER '~/.android'\ntrash $LOGGED_IN_USER '~/Library/Android/sdk'\ntrash $LOGGED_IN_USER '~/Library/Application Support/Google/AndroidStudio2026.1'\ntrash $LOGGED_IN_USER '~/Library/Caches/Google/AndroidStudio2026.1'\ntrash $LOGGED_IN_USER '~/Library/Logs/Google/AndroidStudio2026.1'\ntrash $LOGGED_IN_USER '~/Library/Preferences/com.android.Emulator.plist'\ntrash $LOGGED_IN_USER '~/Library/Preferences/com.google.android.studio.plist'\ntrash $LOGGED_IN_USER '~/Library/Saved Application State/com.google.android.studio.savedState'\n",

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Fix the user-home paths in the new uninstall payload.

Line 19's new script calls sudo rmdir '~/AndroidStudioProjects' and sudo rmdir '~/Library/Android'. Because ~ is single-quoted, it is passed literally instead of resolving to /Users/$LOGGED_IN_USER, so this new uninstall_script_ref never removes those directories even when they are empty.

Proposed fix
-sudo rmdir '~/AndroidStudioProjects'
-sudo rmdir '~/Library/Android'
+sudo rmdir "/Users/$LOGGED_IN_USER/AndroidStudioProjects" 2>/dev/null || true
+sudo rmdir "/Users/$LOGGED_IN_USER/Library/Android" 2>/dev/null || true
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
"aa386b1a": "#!/bin/bash\n\n# variables\nAPPDIR=\"/Applications/\"\nLOGGED_IN_USER=$(scutil <<< \"show State:/Users/ConsoleUser\" | awk '/Name :/ { print $3 }')\n# functions\n\ntrash() {\n local logged_in_user=\"$1\"\n local target_file=\"$2\"\n local timestamp=\"$(date +%Y-%m-%d-%s)\"\n local rand=\"$(jot -r 1 0 99999)\"\n\n # replace ~ with /Users/$logged_in_user\n if [[ \"$target_file\" == ~* ]]; then\n target_file=\"/Users/$logged_in_user${target_file:1}\"\n fi\n\n local trash=\"/Users/$logged_in_user/.Trash\"\n\n # If the target contains glob characters, expand it and move each match.\n if [[ \"$target_file\" == *[*?[]* ]]; then\n local file file_name\n local matched=false\n local i=0\n # compgen -G expands the (quoted) pattern itself, so paths containing\n # spaces glob correctly; reading line by line keeps each match intact.\n while IFS= read -r file; do\n [[ -n \"$file\" ]] || continue\n [[ -e \"$file\" || -L \"$file\" ]] || continue\n matched=true\n i=$((i + 1))\n file_name=\"$(basename \"$file\")\"\n echo \"removing $file.\"\n # The per-match counter keeps matches that share a basename from\n # overwriting each other in the trash.\n mv -f \"$file\" \"$trash/${file_name}_${timestamp}_${rand}_${i}\"\n done < <(compgen -G \"$target_file\" 2>/dev/null)\n if [[ \"$matched\" == false ]]; then\n echo \"$target_file doesn't exist.\"\n fi\n return\n fi\n\n local file_name=\"$(basename \"${target_file}\")\"\n\n if [[ -e \"$target_file\" ]]; then\n echo \"removing $target_file.\"\n mv -f \"$target_file\" \"$trash/${file_name}_${timestamp}_${rand}\"\n else\n echo \"$target_file doesn't exist.\"\n fi\n}\n\nsudo rm -rf \"$APPDIR/Android Studio.app\"\nsudo rmdir '~/AndroidStudioProjects'\nsudo rmdir '~/Library/Android'\ntrash $LOGGED_IN_USER '~/.android'\ntrash $LOGGED_IN_USER '~/Library/Android/sdk'\ntrash $LOGGED_IN_USER '~/Library/Application Support/Google/AndroidStudio2026.1'\ntrash $LOGGED_IN_USER '~/Library/Caches/Google/AndroidStudio2026.1'\ntrash $LOGGED_IN_USER '~/Library/Logs/Google/AndroidStudio2026.1'\ntrash $LOGGED_IN_USER '~/Library/Preferences/com.android.Emulator.plist'\ntrash $LOGGED_IN_USER '~/Library/Preferences/com.google.android.studio.plist'\ntrash $LOGGED_IN_USER '~/Library/Saved Application State/com.google.android.studio.savedState'\n",
"aa386b1a": "#!/bin/bash\n\n# variables\nAPPDIR=\"/Applications/\"\nLOGGED_IN_USER=$(scutil <<< \"show State:/Users/ConsoleUser\" | awk '/Name :/ { print $3 }')\n# functions\n\ntrash() {\n local logged_in_user=\"$1\"\n local target_file=\"$2\"\n local timestamp=\"$(date +%Y-%m-%d-%s)\"\n local rand=\"$(jot -r 1 0 99999)\"\n\n # replace ~ with /Users/$logged_in_user\n if [[ \"$target_file\" == ~* ]]; then\n target_file=\"/Users/$logged_in_user${target_file:1}\"\n fi\n\n local trash=\"/Users/$logged_in_user/.Trash\"\n\n # If the target contains glob characters, expand it and move each match.\n if [[ \"$target_file\" == *[*?[]* ]]; then\n local file file_name\n local matched=false\n local i=0\n # compgen -G expands the (quoted) pattern itself, so paths containing\n # spaces glob correctly; reading line by line keeps each match intact.\n while IFS= read -r file; do\n [[ -n \"$file\" ]] || continue\n [[ -e \"$file\" || -L \"$file\" ]] || continue\n matched=true\n i=$((i + 1))\n file_name=\"$(basename \"$file\")\"\n echo \"removing $file.\"\n # The per-match counter keeps matches that share a basename from\n # overwriting each other in the trash.\n mv -f \"$file\" \"$trash/${file_name}_${timestamp}_${rand}_${i}\"\n done < <(compgen -G \"$target_file\" 2>/dev/null)\n if [[ \"$matched\" == false ]]; then\n echo \"$target_file doesn't exist.\"\n fi\n return\n fi\n\n local file_name=\"$(basename \"${target_file}\")\"\n\n if [[ -e \"$target_file\" ]]; then\n echo \"removing $target_file.\"\n mv -f \"$target_file\" \"$trash/${file_name}_${timestamp}_${rand}\"\n else\n echo \"$target_file doesn't exist.\"\n fi\n}\n\nsudo rm -rf \"$APPDIR/Android Studio.app\"\nsudo rmdir \"/Users/$LOGGED_IN_USER/AndroidStudioProjects\" 2>/dev/null || true\nsudo rmdir \"/Users/$LOGGED_IN_USER/Library/Android\" 2>/dev/null || true\ntrash $LOGGED_IN_USER '~/.android'\ntrash $LOGGED_IN_USER '~/Library/Android/sdk'\ntrash $LOGGED_IN_USER '~/Library/Application Support/Google/AndroidStudio2026.1'\ntrash $LOGGED_IN_USER '~/Library/Caches/Google/AndroidStudio2026.1'\ntrash $LOGGED_IN_USER '~/Library/Logs/Google/AndroidStudio2026.1'\ntrash $LOGGED_IN_USER '~/Library/Preferences/com.android.Emulator.plist'\ntrash $LOGGED_IN_USER '~/Library/Preferences/com.google.android.studio.plist'\ntrash $LOGGED_IN_USER '~/Library/Saved Application State/com.google.android.studio.savedState'\n",
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@ee/maintained-apps/outputs/android-studio/darwin.json` at line 19, The
uninstall script is passing literal '~' because the rmdir calls use single
quotes (e.g. the lines calling sudo rmdir '~/AndroidStudioProjects' and sudo
rmdir '~/Library/Android'), so those paths never expand to the actual user home;
change those calls to use an expanded home path (either unquoted ~ or explicitly
/Users/$LOGGED_IN_USER) so the commands target the real directories (you can
also reuse the existing LOGGED_IN_USER variable or the trash() helper for
consistency).

Comment on lines +4 to +12
"version": "16.109",
"queries": {
"exists": "SELECT 1 FROM apps WHERE bundle_identifier = 'com.microsoft.Outlook';",
"patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'com.microsoft.Outlook' AND version_compare(bundle_short_version, '16.109.2') < 0);"
"patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'com.microsoft.Outlook' AND version_compare(bundle_short_version, '16.109') < 0);"
},
"installer_url": "https://officecdnmac.microsoft.com/pr/C1297A47-86C4-4C1F-97FA-950631F94777/MacAutoupdate/Microsoft_Outlook_16.109.26052523_Installer.pkg",
"install_script_ref": "0e4e4b82",
"installer_url": "https://officecdnmac.microsoft.com/pr/C1297A47-86C4-4C1F-97FA-950631F94777/MacAutoupdate/Microsoft_Outlook_16.109.26053122_Installer.pkg",
"install_script_ref": "6372af77",
"uninstall_script_ref": "f89a23ed",
"sha256": "f02cc11e6f7f107d161395a6eb2ed3e1d3c1ac191949a3934f427e55998b8108",
"sha256": "1c95d6c9b8310a97f0d13f612bd2ce94c0ec546abab0d978aed12cb6d3dfbe12",

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major | ⚡ Quick win

🧩 Analysis chain

🌐 Web query:

What app version does the macOS package Microsoft_Outlook_16.109.26053122_Installer.pkginstall:16.109, 16.109.1, or 16.109.2?

💡 Result:

The macOS installer package Microsoft_Outlook_16.109.26053122_Installer.pkg installs version 16.109.2 of Microsoft Outlook [1]. While Microsoft Outlook version numbering typically follows the format Major.Minor.Build (where 16.109 is the major/minor release and 26053122 represents the specific build number), the installer in question corresponds to the 16.109.2 release [1]. Official Microsoft update history documentation lists 16.109.2 (26052523) as a release [1], and build numbers in filenames (such as 26053122) represent the specific compilation of that release version [1]. Thus, it installs the 16.109.2 version.

Citations:


🏁 Script executed:

#!/bin/bash
set -euo pipefail
FILE="ee/maintained-apps/outputs/microsoft-outlook/darwin.json"
if [ -f "$FILE" ]; then
  nl -ba "$FILE" | sed -n '1,120p'
else
  echo "Missing file: $FILE" >&2
fi

Repository: fleetdm/fleet

Length of output: 100


🏁 Script executed:

#!/bin/bash
set -euo pipefail
FILE="ee/maintained-apps/outputs/microsoft-outlook/darwin.json"

if [ ! -f "$FILE" ]; then
  echo "Missing file: $FILE" >&2
  exit 1
fi

python3 - <<'PY'
path = "ee/maintained-apps/outputs/microsoft-outlook/darwin.json"
with open(path, "r", encoding="utf-8") as f:
    for i, line in enumerate(f, start=1):
        if i <= 200:
            print(f"{i:4d}: {line.rstrip()}")
        else:
            break
PY

Repository: fleetdm/fleet

Length of output: 12021


Align Outlook’s tracked version with the shipped macOS installer (16.109.2)

ee/maintained-apps/outputs/microsoft-outlook/darwin.json tracks "version": "16.109" and queries.patched treats hosts as compliant when bundle_short_version >= 16.109, but Microsoft_Outlook_16.109.26053122_Installer.pkg installs Microsoft Outlook 16.109.2 and the install script downloads/applies that exact pkg. Update "version" and the queries.patched threshold to 16.109.2 so 16.109.0/16.109.1 aren’t incorrectly considered compliant.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@ee/maintained-apps/outputs/microsoft-outlook/darwin.json` around lines 4 -
12, The JSON currently sets "version": "16.109" and the "queries.patched"
threshold to '16.109', but the installer
"Microsoft_Outlook_16.109.26053122_Installer.pkg" actually installs 16.109.2;
update the "version" field to "16.109.2" and change the comparisons used in
queries.patched (the string in the WHERE clause that compares
bundle_short_version) from '16.109' to '16.109.2' so hosts running
16.109.0/16.109.1 are not treated as compliant.

@github-actions

github-actions Bot commented Jun 3, 2026

Copy link
Copy Markdown
Contributor

Closing in favor of #46695.

@github-actions github-actions Bot closed this Jun 3, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants