Commit Graph
2579 Commits
Author SHA1 Message Date
kitzy 5fa8a0a9ea Add Microsoft .NET Desktop Runtime 10 as a Windows FMA (#50361)
**Related issue:** Resolves #50360

Adds Microsoft .NET Desktop Runtime 10 as a Windows Fleet-maintained
app, from winget `Microsoft.DotNet.DesktopRuntime.10` (10.0.10, WiX burn
bundle, x64).

This closes the gap opened by HandBrake (#50323 / #50352). HandBrake
requires the .NET **Desktop** Runtime and its install script now
hard-fails without it, but Fleet had no FMA that could satisfy that — we
ship `microsoft-dotnet-runtime-8`/`-10`, which are the *base* runtime, a
different package with its own Add/Remove Programs entry. The customer's
ManageEngine catalog also deploys the Desktop Runtime directly.

## Verification

The winget manifest supplies `AppsAndFeaturesEntries`, and I confirmed
each value against the real installer by extracting the burn bundle's
registration data:

```
Microsoft Windows Desktop Runtime 10.0.10 (x64)
Publisher="Microsoft Corporation"
Version="10.0.10.50000"
```

- Installer SHA confirmed against a local download (`e82fc901…84d1`).
- The `DisplayName` carries both version and architecture, so the exists
query uses the same `LIKE 'Microsoft Windows Desktop Runtime 10.%' AND
name LIKE '%(x64)'` shape as the existing base-runtime FMAs.
- The bundle exposes several ProductCodes (the bundle plus its MSI
components), which is exactly the shape the existing uninstall script
already documents and handles.

**`use_display_version_for_patch` is required here.** The registry
`DisplayVersion` is `10.0.10.50000` but the winget package version is
`10.0.10`. Without the flag the patch policy would compare against the
marketing version and mis-order against what osquery reports. The
generated patched query correctly compares against `10.0.10.50000`.

## Reuse rather than duplication

- **Scripts:** this reuses `microsoft_dotnet_runtime_install.ps1` /
`_uninstall.ps1` unchanged. The Desktop Runtime is the same burn bundle
shape, and the uninstaller already resolves the bundle from the injected
`$PACKAGE_ID` with a Package Cache fallback. Those scripts are already
shared by the two base-runtime FMAs, so this follows the existing
pattern rather than adding a near-identical copy.
- **Icon:** reuses the existing `MicrosoftDotnetRuntime` component and
its `.NET` artwork. The burn bundle only carries a 32×32 icon, so
extracting one would have meant shipping a blurry upscale of the same
logo.

The new map key is `"microsoft .net desktop runtime"` (no version). Icon
lookup is a loose *prefix* match — `s === key || s.startsWith(key + "
")` — so one key covers 10 and any future major, mirroring how
`"microsoft .net runtime"` already serves both base-runtime FMAs. It is
longer than that key, and lookup sorts longest-first, so the desktop
runtime cannot be mis-matched to the base runtime icon.

# Checklist for submitter

- [x] QA'd all new/changed functionality manually


<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->

## Summary by CodeRabbit

* **New Features**
* Added Microsoft .NET Desktop Runtime 10 to the Windows software
catalog.
* Added support for installing and uninstalling the x64 desktop runtime,
including version detection and reboot handling.
* Added a dedicated Microsoft .NET Runtime icon for the software
listing.

<!-- end of auto-generated comment: release notes by coderabbit.ai -->
2026-08-02 22:10:40 -05:00
kitzy b35904ccfa Add HandBrake as a Windows FMA (#50352)
**Related issue:** Resolves #50323

Adds HandBrake as a Windows Fleet-maintained app, from winget
`HandBrake.HandBrake` (1.11.2, NSIS, machine scope, x64). Found in a
customer's ManageEngine ServiceDesk Plus Windows deployment catalog with
no Fleet equivalent.

Per @allenhouchins' guidance on the issue, the `.NET Desktop Runtime 10`
prerequisite is handled in the install script with a clear failure
message rather than left to fail silently after install.

## The prerequisite check

HandBrake's own installer text states it plainly:

> HandBrake requires Microsoft .NET *Desktop* Runtime 10. If this is not
installed, you will be prompted to install it when you first run the
app.

The installer neither bundles nor installs that runtime, and the FMA
ingester drops winget's `Dependencies` field. Without a check, Fleet
would install HandBrake, register it in Add/Remove Programs, report
success, and the user would hit a runtime prompt on first launch. The
script now checks
`%ProgramFiles%\dotnet\shared\Microsoft.WindowsDesktop.App\10.*` and
exits 1 with an actionable message when it is absent.

Two things worth reviewers' judgement:

- **We fail rather than warn.** The vendor does prompt the user at first
run, so an install without the runtime is recoverable by hand. I chose
to fail because in a SYSTEM-context managed deployment an end-user
runtime prompt is a support ticket, and a truthful "install failed, here
is why" is more useful than a silently unusable app. Easy to soften to a
warning + `Exit 0` if we would rather defer to the vendor's prompt.
- **We ship no `.NET Desktop Runtime` FMA today.** Fleet has
`microsoft-dotnet-runtime-8`/`-10`, but those are the *base* runtime,
not the Desktop runtime — a separate package with its own ARP entry. So
there is currently no in-product way to satisfy this prerequisite; an
admin has to deploy the runtime by other means. That gap is worth its
own issue.

## Identity — two traps, both from reading the vendor's NSIS script

HandBrake's
[`Installer64.nsi`](https://github.com/HandBrake/HandBrake/blob/master/win/CS/HandBrake.Nsis.Installer/Installer64.nsi)
writes only four values:

```nsis
Name "${PRODUCT_NAME} ${PRODUCT_VERSION}"
...
WriteRegStr HKLM "${PRODUCT_UNINST_KEY}" "DisplayName"     "$(^Name)"
WriteRegStr HKLM "${PRODUCT_UNINST_KEY}" "UninstallString" "$INSTDIR\uninst.exe"
WriteRegStr HKLM "${PRODUCT_UNINST_KEY}" "DisplayIcon"     "$INSTDIR\HandBrake.exe"
WriteRegStr HKLM "${PRODUCT_UNINST_KEY}" "DisplayVersion"  "${PRODUCT_VERSION}"
```

1. **`DisplayName` is version-suffixed** (`HandBrake 1.11.2`), so the
exists query is a prefix match, not equality.
2. **No `Publisher` is ever written.** The default generated query would
have pinned `publisher = 'The HandBrake Team'` from the winget locale
manifest and matched nothing, forever, while the validator still passed.
The exists query is overridden to drop the publisher clause.

`UninstallString` is also an unquoted path containing spaces
(`C:\Program Files\HandBrake\uninst.exe`), which the defensive parser in
the uninstall script handles by capturing through `.exe`.

The uninstall script additionally waits for the registry entry to
disappear: a silent NSIS uninstaller returns before removal completes,
so its exit code alone is not a reliable completion signal.

## Verification

- Installer SHA confirmed against a local download (`6becb8e5…f8cd`);
the URL is GitHub Releases, so none of the SourceForge trouble from
#50322 applies.
- **No icon work needed.** Reusing the catalog name `HandBrake` means
this shares the existing `handbrake` icon with `handbrake-app/darwin`,
and the two group together in the FMA library.

# Checklist for submitter

- [x] QA'd all new/changed functionality manually


<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->

## Summary by CodeRabbit

* **New Features**
* Added HandBrake 1.11.2 to the Windows maintained applications catalog.
* Added support for silent installation and uninstallation, including
version detection and installer verification.
* Added validation for the required .NET Desktop Runtime 10
prerequisite.
* Added handling for installation completion, reboot-required results,
and uninstall status reporting.

<!-- end of auto-generated comment: release notes by coderabbit.ai -->
2026-08-02 22:00:08 -05:00
kitzyandAllen Houchins 194df72c90 Add Scribe as a Windows Fleet-maintained app (#50341)
**Related issue:** Resolves #50331

Adds Scribe as a Windows Fleet-maintained app, from winget
`ColonyLabs.ScribeDesktopCapture` (6.7.23.0, MSI, machine scope, x64).
Found in a customer's ManageEngine ServiceDesk Plus Windows deployment
catalog with no Fleet equivalent.

The simplest of this batch: a plain machine-scope MSI, so the install
and upgrade-code uninstall scripts are auto-generated and no custom
scripts are needed.

## Verification

Identity read directly from the MSI Property table rather than inferred
from winget:

```
ProductName    Scribe
Manufacturer   Colony Labs, Inc
ProductCode    {87a51b1f-554d-414d-92a4-002a0916c91c}
UpgradeCode    {351EF756-3AF5-4117-8697-53AB61427040}
ALLUSERS       2
```

`Manufacturer` matches the winget locale `Publisher` exactly, so no
`program_publisher` override is needed. `ALLUSERS=2` confirms
per-machine install when elevated, which is how Fleet runs it. No
`ARPSYSTEMCOMPONENT`, so this is a real product entry and not a
bootstrapper.

- Installer SHA confirmed against a local download of
`Scribe_6.7.23.msi` (`41004c21…9b74`).
- Icon extracted from the MSI's own `Scribe for Windows.exe` resource,
not sourced from the web.

## Note on the name

`Scribe` is a generic `DisplayName`, so the exists query pins `publisher
= 'Colony Labs, Inc'` to avoid matching an unrelated product of the same
name.

This is **not** related to `timescribe/darwin`, which is already in the
catalog — different vendor, different product. It deliberately does not
share that catalog name or icon.

# Checklist for submitter

- [x] QA'd all new/changed functionality manually


<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit

* **New Features**
  * Added Scribe to the maintained applications catalog for Windows.
* Added support for installing and uninstalling Scribe MSI packages,
including version detection and installer metadata.
* Added reliable installation handling with logging, elevated execution,
restart control, and support for standard successful installer exit
codes.
  * Added the Scribe app icon to the software interface.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->

---------

Co-authored-by: Allen Houchins <allenhouchins@mac.com>
2026-08-02 21:08:51 -05:00
kitzyandAllen Houchins da1947cd1f Add Paint.NET as a Windows Fleet-maintained app (#50340)
**Related issue:** Resolves #50330

Adds Paint.NET as a Windows Fleet-maintained app, from winget
`dotPDN.PaintDotNet` (5.1.12, machine scope, x64). Found in a customer's
ManageEngine ServiceDesk Plus Windows deployment catalog with no Fleet
equivalent.

## Identity: winget's metadata is wrong here

The winget locale manifest gives `PackageName: paint.net` (lowercase).
The actual registry `DisplayName` is **`Paint.NET`**, read straight out
of the MSI Property table:

```
ProductName    Paint.NET
Manufacturer   dotPDN LLC
UpgradeCode    {04A40F40-A207-4B48-AED7-6AA532E43275}
ALLUSERS       2
```

There is no `ARPDISPLAYNAME` override and no `ARPSYSTEMCOMPONENT`, so
`ProductName` is what lands in Add/Remove Programs. Taking the winget
name at face value would have produced an exists query that silently
never matches. `ALLUSERS=2` confirms it installs per-machine when run
elevated, which is how Fleet runs it.

## This is a zip-wrapped installer

Paint.NET publishes **only** `.zip` assets — there is no bare `.exe` or
`.msi` on the vendor's GitHub releases. So this uses `installer_type:
zip` with custom scripts, following the existing precedent of
`agent-ransack`, `adobe-acrobat-pro`, `vnc-server`, and `vnc-viewer`.
The install script extracts the archive and runs the nested installer
with `/auto`, the vendor's silent switch per the manifest's
`InstallerSwitches`.

**Uninstall resolves the product from the UpgradeCode, not the
ProductCode.** Paint.NET's ProductCode changes with every release, and
the `.exe` and `.msi` variants register *different* ProductCodes. The
UpgradeCode is stable — I verified it is identical across 5.1.10 and
5.1.12 — so `RelatedProducts` on it removes whichever variant is
present.

## One thing reviewers may want to change

The manifest offers six installers; three are x64/machine/zip and differ
only by `NestedInstallerType` (`exe`, `wix`, `portable`). The ingester's
selection loop takes the **first** match and breaks, so it picks the
`.install.x64.exe` bootstrapper. The `.winmsi.x64.zip` variant is
arguably the better FMA target — a plain MSI with predictable ARP
behaviour — but there is no way to express "prefer this nested type" in
the input today. Selecting it would need an ingester change, so I did
not do it here. Worth a follow-up if we hit trouble with the
bootstrapper.

## Verification

- Zip SHA confirmed against a local download (`3cd861b5…c867`); archive
contains exactly one file, `paint.net.5.1.12.install.x64.exe`.
- Icon extracted from that installer's own 256px resource, not sourced
from the web.
- Icon map key is `"paint.net"`, the lowercased catalog name. The icon
generator derives its key from the slug and produced `"paint dot net"`,
which would never have matched at runtime — corrected by hand.

# Checklist for submitter

- [x] QA'd all new/changed functionality manually


<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit

* **New Features**
  * Added Paint.NET to the Windows software catalog.
* Added support for installing, upgrading, detecting, and uninstalling
Paint.NET.
  * Added Paint.NET branding and an icon to the software interface.
* Included Paint.NET version 5.1.12 with verified download metadata and
Productivity categorization.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->

---------

Co-authored-by: Allen Houchins <allenhouchins@mac.com>
2026-08-02 20:40:48 -05:00
kitzyandClaude 2833401d12 Add Dante Controller as a macOS FMA (#50378)
<!-- Add the related story/sub-task/bug number, like Resolves #123, or
remove if NA -->
**Related issue:** Resolves #50377

# What this does

Adds **Dante Controller** as a macOS Fleet-maintained app, from Homebrew
cask
[`dante-controller`](https://formulae.brew.sh/cask/dante-controller)
(4.18.1.1). The cask ships a DMG containing `DanteController.pkg`, so
`installer_format: "dmg"` with the standard mount-and-`installer -pkg`
install script — the same shape as AdGuard, Adobe Acrobat Pro, and other
existing DMG+pkg FMAs. Uninstall is fully generated from the cask's
directives (2 `launchctl` services, 8 `pkgutil` receipt IDs, 3 zap trash
paths) — no custom scripts.

Windows is out of scope: no `Audinate.DanteController` winget package
exists. See #50377 for the full feasibility analysis, including why
Dante Virtual Soundcard was excluded on both platforms.

## Notes

- **Identity verified against the real installer**, not cask metadata.
Extracted `DanteController.pkg` from the DMG and read the app bundle's
`Info.plist`: `CFBundleIdentifier` =
`com.audinate.dante.DanteController`, confirming the input's
`unique_identifier`. This needed checking because the cask's preferences
path uses a *different* domain (`com.audinate.dante.controller`).
- `CFBundleShortVersionString` and `CFBundleVersion` are both
`4.18.1.1`, matching the cask version, so the exists/patched queries
reconcile with osquery's `apps` table.
- Installer SHA confirmed against a local download of the DMG
(`4515cd12…38ff`) — matches both the cask and the generated output.
- **Arch split.** The cask ships separate arm64/x64 DMGs; the brew API's
top-level URL (which the ingester pins) is the arm64 build. This matches
the behavior of the ~173 existing darwin FMAs with arch-specific URLs.
- **`auto_updates true`.** Dante Updater self-patches, so hosts may
drift ahead of the FMA-pinned version.
- Ships a new catalog icon, extracted from the app bundle's own `.icns`
— not sourced from the web.

# Checklist for submitter

- [x] Input data is properly validated, `SELECT *` is avoided, SQL
injection is prevented (using placeholders for values in statements), JS
inline code is prevented especially for url redirects, and untrusted
data interpolated into shell scripts/commands is validated against shell
metacharacters.

## Testing

- [x] FMA CI validator (install → detect → uninstall) **passes** on the
macOS runner — [run
30682752130](https://github.com/fleetdm/fleet/actions/runs/30682752130/job/91322957939)
(`Found app: 'Dante Controller' at /Applications/Dante Controller.app,
Version: 4.18.1.1` → `All 1 apps were successfully validated.`)
- [x] Generated output verified locally: installer SHA matches the cask,
exists/patched queries checked against the app bundle's `Info.plist`,
`apps.json` is valid JSON with a description filled in.
- [x] QA'd all new/changed functionality manually

---------

Co-authored-by: Claude <noreply@anthropic.com>
2026-08-02 20:25:36 -05:00
fleet-releaseandallenhouchins 31e3f51fa4 Update Fleet-maintained apps (#50406)
Automated ingestion of latest Fleet-maintained app data.

<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->

## Summary by CodeRabbit

- **Updates**
- Updated app catalogs with the latest releases for Actual, BoltAI, Bome
Network, DBeaver Community, Dockside, ExifCleaner, Firefox Nightly,
LinearMouse, Ocenaudio, OpenRCT2, Spokenly, Stats, WinDirStat, and Zed.
- Added refreshed installer links, version detection, and integrity
checks for the updated packages.
- Updates cover macOS and Windows, including DBeaver Community and Zed
on both platforms.

<!-- end of auto-generated comment: release notes by coderabbit.ai -->

Co-authored-by: allenhouchins <32207388+allenhouchins@users.noreply.github.com>
2026-08-02 20:23:42 -05:00
Allen HouchinsandClaude 1ed4b5c89a Update Evernote macOS version to 11.27.5 (#50395)
**Related issue:** Resolves #

# Checklist for submitter

- [ ] Changes file added for user-visible changes in `changes/`,
`orbit/changes/` or `ee/fleetd-chrome/changes`.
See [Changes
files](https://github.com/fleetdm/fleet/blob/main/docs/Contributing/guides/committing-changes.md#changes-files)
for more information.

## Testing

- [ ] QA'd all new/changed functionality manually

---

## Summary

Updates the Evernote macOS application version from 11.20.2 to 11.27.5
in the maintained apps configuration. This change updates both the
version identifier and the corresponding SQL query that checks for
patched versions.

## Changes

- Updated `ee/maintained-apps/outputs/evernote/darwin.json`:
  - Version bumped from `11.20.2` to `11.27.5`
- Updated the `patched` query to check against the new version `11.27.5`
instead of `11.20.2`

This ensures that Fleet's vulnerability detection and patching workflows
correctly identify whether Evernote on macOS is up-to-date with the
latest version.

https://claude.ai/code/session_01F85XismGHNQj3ZEn7zPNpD

Co-authored-by: Claude <noreply@anthropic.com>
2026-08-01 21:52:40 -05:00
Allen HouchinsandClaude 352d1f9070 Unfreeze NVIDIA GeForce NOW (macOS) (#50392)
Automated unfreeze probe. Removes `"frozen": true` and regenerates the
output manifest so
`test-fma-darwin-pr-only` can validate `nvidia-geforce-now/darwin` at
its current upstream version.

Frozen since: 2026-06-15 (#47645, automated FMA update run)
Version: 2.0.85.133 -> 2.0.87.131

Upstream Homebrew cask reports 2.0.87.131, which is newer than the
pinned 2.0.85.133, so this is
a genuine forward bump rather than a regression.

Note: the regenerated manifest also picks up a newer
`uninstall_script_ref`, because the frozen
output missed the script-template updates that landed on main while it
was pinned.

Draft until validation reports. Merge only if the FMA checks are green
and the validate shard
actually ran for this slug.

**Related issue:** NA

# Checklist for submitter

- [x] QA'd all new/changed functionality manually — pending CI
validation, see above.

---
_Generated by [Claude
Code](https://claude.ai/code/session_01F3HnFWdGjLMbqHdxWZXBAo)_

Co-authored-by: Claude <noreply@anthropic.com>
2026-08-01 21:02:17 -05:00
fleet-releaseandallenhouchins 570ab3e4ce Update Fleet-maintained apps (#50394)
Automated ingestion of latest Fleet-maintained app data.

<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->

## Summary by CodeRabbit

- **Updates**
- Updated release metadata for 24 maintained applications across macOS
and Windows.
- Added the latest available versions of apps including 3DF Zephyr Free,
BoltAI, ChatGPT, Firefox Nightly, Microsoft Edge, Shotcut, Telegram,
Teleport Connect, Typora, and Zappy.
- Refreshed download links and verification checksums to ensure
installations use the correct release packages.
- Updated Teleport Suite’s macOS installation package to match version
18.10.3.

<!-- end of auto-generated comment: release notes by coderabbit.ai -->

Co-authored-by: allenhouchins <32207388+allenhouchins@users.noreply.github.com>
2026-08-01 21:01:40 -05:00
Allen Houchinsandallenhouchins 1dafb29265 Bump frozen Adobe Acrobat Pro (macOS) to installer-delivered 26.001.21691 (#50370)
Automated unfreeze probe, revised after validation. The full unfreeze
failed: the Homebrew cask
reports 26.001.21771 (tracking Adobe's updater manifest), but Adobe's
version-less web installer
DMG still delivers 26.001.21691, so the validator's post-install osquery
check failed at
26.001.21771 — the same installer-lags-manifest behavior that caused the
original freeze.

This PR instead pins the output manifest to 26.001.21691 (the version
the DMG actually installs,
confirmed by the 2026-08-01 validator run) and keeps `"frozen": true` so
the nightly ingester
doesn't bump it back to the cask version.

Frozen since: 2025-12-02 (#36609 — "product updated but installer was
not, causing validation issues")
Version: 26.001.21662 -> 26.001.21691 (cask claims 26.001.21771;
installer not updated yet)

Note: the regenerated manifest also picks up a newer
`uninstall_script_ref`, because the frozen
output missed the script-template updates that landed on main while it
was pinned.

Draft until validation reports. Merge only if the FMA checks are green
and the validate shard
actually ran for this slug.

**Related issue:** NA

# Checklist for submitter

- [x] QA'd all new/changed functionality manually — pending CI
validation, see above.

---
_Generated by [Claude
Code](https://claude.ai/code/session_01EBxhs5D65LRUwCEJejBLJH)_

---------

Co-authored-by: allenhouchins <allen@fleetdm.com>
2026-07-31 21:37:29 -05:00
Allen Houchinsandallenhouchins 24b24ae699 Unfreeze Logi Options+ (macOS) (#50372)
Automated unfreeze probe. Removes `"frozen": true` and regenerates the
output manifest so
`test-fma-darwin-pr-only` can validate `logi-options+/darwin` at its
current upstream version.

Frozen since: 2026-04-03 (#42984, automated FMA update run)
Version: 2.4.903778 -> 2.5.926888

Note: the regenerated manifest also picks up a newer
`uninstall_script_ref`, because the frozen
output missed the script-template updates that landed on main while it
was pinned.

Draft until validation reports. Merge only if the FMA checks are green
and the validate shard
actually ran for this slug.

**Related issue:** NA

# Checklist for submitter

- [x] QA'd all new/changed functionality manually — pending CI
validation, see above.

---
_Generated by [Claude
Code](https://claude.ai/code/session_01EBxhs5D65LRUwCEJejBLJH)_

Co-authored-by: allenhouchins <allen@fleetdm.com>
2026-07-31 21:15:14 -05:00
Allen Houchinsandallenhouchins 2747d82328 Unfreeze Keeper Password Manager (macOS) (#50371)
Automated unfreeze probe. Removes `"frozen": true` and regenerates the
output manifest so
`test-fma-darwin-pr-only` can validate `keeper-password-manager/darwin`
at its current upstream version.

Frozen since: 2026-02-10 (#39623, automated FMA update run)
Version: 18.2.1 -> 18.5.0

Draft until validation reports. Merge only if the FMA checks are green
and the validate shard
actually ran for this slug.

**Related issue:** NA

# Checklist for submitter

- [x] QA'd all new/changed functionality manually — pending CI
validation, see above.

---
_Generated by [Claude
Code](https://claude.ai/code/session_01EBxhs5D65LRUwCEJejBLJH)_

Co-authored-by: allenhouchins <allen@fleetdm.com>
2026-07-31 21:14:32 -05:00
fleet-releaseandallenhouchins 3d29b69eb6 Update Fleet-maintained apps (#50369)
Automated ingestion of latest Fleet-maintained app data.

<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->

## Summary by CodeRabbit

* **Updates**
* Updated Windows packages for AWS CLI, AWS SAM CLI, Brave Browser,
DataGrip, and Postman to their latest versions.
* Updated macOS packages for Fellow, Microsoft Edge, Postman, and
Typora.
* Refreshed installer links, version checks, and checksums to support
reliable downloads and verification.
* Updated versions include AWS CLI 2.36.14, AWS SAM CLI 1.165.0, Brave
151.1.93.129, DataGrip 2026.2.2, Fellow 5.7.2, Edge 151.0.4129.59,
Postman 12.21.10, and Typora 1.14.8.

<!-- end of auto-generated comment: release notes by coderabbit.ai -->

---------

Co-authored-by: allenhouchins <32207388+allenhouchins@users.noreply.github.com>
2026-07-31 21:08:26 -05:00
Jonathan Katz 45abf8c9ad Add software installer upload/download progress to GitOps runs (#50250)
<!-- Add the related story/sub-task/bug number, like Resolves #123, or
remove if NA -->
**Related issue:** Resolves #45728
Changes:
- Adds a new redis key to keep track of downloaded packages. It starts
out with an empty list and gets filled with each download. Each update
writes the entire struct at once to the key.
- Adds logging in the fleetctl gitops client to show which packages were
downloaded
- Fixes the categories key potentially expiring 

# Checklist for submitter

If some of the following don't apply, delete the relevant line.

- [x] Changes file added for user-visible changes in `changes/`,
`orbit/changes/` or `ee/fleetd-chrome/changes`.
See [Changes
files](https://github.com/fleetdm/fleet/blob/main/docs/Contributing/guides/committing-changes.md#changes-files)
for more information.

- [ ] Input data is properly validated, `SELECT *` is avoided, SQL
injection is prevented (using placeholders for values in statements), JS
inline code is prevented especially for url redirects, and untrusted
data interpolated into shell scripts/commands is validated against shell
metacharacters.
-  Timeouts are implemented and retries are limited to avoid infinite
loops
- Right now the batch will write the whole slice of all packages to a
single redis key for every package in the loop. Looks like performance
is acceptable for now (500 packages), but maybe this will need to be
limited.
- [ ] If paths of existing endpoints are modified without backwards
compatibility, checked the frontend/CLI for any necessary changes

## Testing

- [x] Added/updated automated tests
- [ ] Where appropriate, [automated tests simulate multiple hosts and
test for host
isolation](https://github.com/fleetdm/fleet/blob/main/docs/Contributing/reference/patterns-backend.md#unit-testing)
(updates to one hosts's records do not affect another)

- [x] QA'd all new/changed functionality manually



<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit

## New Features
- Added per-package software download progress in fleetctl GitOps.
- Progress now reports downloading, completed, skipped, and failed
packages during real and dry runs.
- Installation output now distinguishes applying and applied stages.

## Bug Fixes
- Improved download error messages and cached-package handling.
- Prevented duplicate progress messages and ensured tracking issues do
not interrupt successful software batches.

## Tests
- Expanded coverage for progress reporting, failures, dry runs, package
types, and authorization scenarios.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
2026-07-31 21:36:44 -04:00
kitzy f082237518 Add Lenovo System Update as a Windows FMA (#50339)
**Related issue:** Resolves #50324

Adds Lenovo System Update as a Windows Fleet-maintained app, from winget
`Lenovo.SystemUpdate` (5.08.03.59, Inno Setup, machine scope, x86-only).
Found in a customer's ManageEngine ServiceDesk Plus Windows deployment
catalog with no Fleet equivalent. Distinct from
`lenovo-dock-manager/windows`, which we already ship.

## Verification

- Installer SHA confirmed against a local download of
`system_update_5.08.03.59.exe` (`e66794dc…53e0d`), served from
`download.lenovo.com` — a pinned vendor URL, so none of the SourceForge
mirror trouble from #50322 applies.
- Registry `DisplayName` determined offline as a bare `Lenovo System
Update`: `innoextract --info` reports `AppVerName` when set and falls
back to `AppName`, and Inno writes that same value to `DisplayName`.
This installer reports no version suffix, unlike CrystalDiskMark in
#50322 which reports `"CrystalDiskMark 9.0.3"`. That is why the exists
query here is an exact match rather than a prefix.
- Icon extracted from the installer's own `Tvsukernel.exe` resource, not
sourced from the web.
- The uninstall script targets the Inno registry key directly via the
manifest's `ProductCode` (`TVSU_is1` — a key name, not a GUID) using the
`$PACKAGE_ID` substitution, rather than string-matching `DisplayName`.

## Two things reviewers should weigh in on

**1. The exists query deliberately omits the publisher.** House style
usually pins `publisher = '...'`, but the registry `Publisher` is not
determinable offline for Inno, and the validator's log prints only the
name and version — so I could not confirm it. A wrong publisher makes
the exists query silently never match while the validator still passes,
which is the exact failure mode called out in the FMA docs. `name =
'Lenovo System Update'` is unambiguous on its own. Happy to add the
publisher clause if someone can confirm the registry value on a real
Lenovo host.

**2. This may not be validatable on the CI runner.** Lenovo System
Update is a vendor tool for Lenovo hardware, and the runner is a generic
Azure VM. If the installer refuses to run on non-Lenovo hardware this
will fail the way Dell Display and Peripheral Manager did in #50020
(which was dropped for exactly this reason, and is being retried on a
client-OS runner in #50313). Leaving this in draft until the validator
reports.

# Checklist for submitter

- [x] QA'd all new/changed functionality manually


<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->

## Summary by CodeRabbit

* **New Features**
* Added Lenovo System Update to the maintained Windows software catalog.
* Added support for silent installation and uninstallation, including
status verification and reboot-success handling.
* Added Lenovo System Update metadata, download information,
categorization, and application icon.


<!-- end of auto-generated comment: release notes by coderabbit.ai -->
2026-07-31 20:36:01 -05:00
fleet-releaseandallenhouchins eac1f4d326 Update Fleet-maintained apps (#50347)
Automated ingestion of latest Fleet-maintained app data.

<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->

## Summary by CodeRabbit

- **Updates**
- Refreshed available versions and verified download information for 30
maintained applications across macOS and Windows.
- Updated Adobe Acrobat Reader, Beekeeper Studio, BoltAI, ChatWise,
CMake, Cursor, Dataflare, Eclipse Temurin JDK/JRE, Firefox Developer
Edition/Nightly, iMazing, Krita, Mockoon, Netron, Notesnook, pgAdmin 4,
Podman Desktop, Postman, Raycast, Setapp, Shotcut, Spokenly, Superhuman,
and Typora.
  - Installation and uninstallation behavior remains unchanged.

<!-- end of auto-generated comment: release notes by coderabbit.ai -->

---------

Co-authored-by: allenhouchins <32207388+allenhouchins@users.noreply.github.com>
2026-07-31 16:42:42 -05:00
Luke Heath cb44e287f2 Fix high-severity CodeQL and Scorecard code scanning alerts (#50333) 2026-07-31 14:46:31 -05:00
dependabot[bot] 25d4120857 Bump postcss from 8.5.10 to 8.5.23 in /ee/fleetd-chrome (#49906) 2026-07-31 12:54:20 -05:00
kitzyandAllen Houchins 7837b8ec8f Add AOMEI Backupper Standard as a Windows Fleet-maintained app (#50021)
<!-- Add the related story/sub-task/bug number, like Resolves #123, or
remove if NA -->
**Related issue:** #50020

# What this does

Adds **AOMEI Backupper Standard** as a Windows Fleet-maintained app. One
of the 11 apps split out of #48501 that failed the FMA validator; #50016
shipped the 6 that passed.

## Why it was failing

Install and detection were already fine on the SYSTEM-context Windows
runner — the validator installed it and osquery found `AOMEI Backupper`
8.4.0. **Uninstall** was the failure:

```
ERROR msg="Error uninstalling app: exit status 1" app="AOMEI Backupper Standard"
ERROR msg="Output: Uninstaller for 'AOMEI Backupper Standard' not found."
```

AOMEI unified the ARP `DisplayName` across editions around v7.4 — the
registry entry reads `AOMEI Backupper`, with no `Standard` suffix. The
uninstall script searched for the catalog name and matched nothing.
`unique_identifier` was already corrected to `AOMEI Backupper`; this
fixes the uninstall script to match.

## Notes

- **Edition matching.** `AOMEI Backupper` also matches the paid
Pro/Workstation/Server editions — AOMEI shares the DisplayName across
editions and no registry value distinguishes them. Detecting the free
edition specifically isn't possible from inventory.
- **Non-pinned installer URL.**
`https://www2.aomeisoftware.com/download/adb/AOMEIBackupperStd.exe` is a
"latest" URL, so the pinned SHA will drift when AOMEI ships a new build
until the FMA auto-update bumps it.
- x86-only installer, so it lands in `C:\Program Files (x86)`. The
validator's "no changes detected in `C:\Program Files`" line is an
expected warning, not a failure.

# Checklist for submitter

- [x] Input data is properly validated, `SELECT *` is avoided, SQL
injection is prevented (using placeholders for values in statements), JS
inline code is prevented especially for url redirects, and untrusted
data interpolated into shell scripts/commands is validated against shell
metacharacters.
- [x] Timeouts are implemented and retries are limited to avoid infinite
loops

## Testing

- [x] FMA CI validator (install → detect → uninstall) **passes** on the
SYSTEM-context Windows runner — [run
30383902487](https://github.com/fleetdm/fleet/actions/runs/30383902487)
(`All checks passed`)
- [x] Generated output verified locally: manifest SHA matches the winget
manifest, exists/patched queries reviewed for name + publisher
correctness, `apps.json` is valid JSON with a description filled in.
- [x] QA'd all new/changed functionality manually




<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit

- **New Features**
- Added **AOMEI Backupper Standard** (version **8.4.0.0.0**) to the
Windows software catalog, including verified installer download
(SHA-256).
- Introduced dedicated silent **install** and **uninstall** support,
with version gating and idempotent uninstall behavior when the app isn’t
present.
- Added a **new software icon** and updated the listing so the correct
icon now appears for this product.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->

---------

Co-authored-by: Allen Houchins <allenhouchins@mac.com>
2026-07-31 09:58:02 -05:00
kitzy 43bff98998 Add Gpg4win as a Windows FMA (#50026)
<!-- Add the related story/sub-task/bug number, like Resolves #123, or
remove if NA -->
**Related issue:** #50020

# What this does

Adds **Gpg4win** as a Windows Fleet-maintained app. One of the 11 apps
split out of #48501 that failed the FMA validator; #50016 shipped the 6
that passed.

## Why it was failing

Same root cause as GNU Privacy Guard (#50025) — Gpg4win bundles GnuPG.
The install worked; the *script* never returned:

```
20:30:53  INFO  msg="Executing install script..." app=Gpg4win
20:40:53  ERROR msg="Error executing install script: exit status 1"   # exactly 10:00 later
20:40:53  INFO  msg="New application detected at: C:\Program Files\Gpg4win"
```

Ten minutes on the nose is the validator's `executeScript` timeout.
**`Start-Process -Wait` waits for the process *and all of its
descendants***, and Gpg4win leaves `gpg-agent`, `dirmngr`, `keyboxd` and
`scdaemon` resident (plus Kleopatra), so `-Wait` never returns. The same
run left `gpg4win-5.0.2.exe` locked in the validator's temp dir,
confirming a live child process.

The install script now follows the pattern already established by
[`ollama_install.ps1`](ee/maintained-apps/inputs/winget/scripts/ollama_install.ps1):
start with `-PassThru` (no `-Wait`), wait on the installer process alone
with a 7-minute cap (below the caller's 10-minute script budget), poll
for the Add/Remove Programs entry, then stop the leftovers.

The uninstall script stops those processes up front (they hold file
locks that make the uninstall fail), uses NSIS's `_?=<dir>` switch so
the uninstaller runs in place rather than relaunching itself detached
from `%TEMP%`, and polls the ARP key to confirm removal.

## Notes

- **Versioned ARP name.** The registry `DisplayName` is `Gpg4win
(5.0.2)`, so the input uses `fuzzy_match_name` and the exists query is
`name LIKE 'Gpg4win %'`. The uninstall script matches the same prefix.
- x86-only installer. Publisher `The Gpg4win Project`.
- Ships a new catalog icon and website asset.

# Checklist for submitter

- [x] Input data is properly validated, `SELECT *` is avoided, SQL
injection is prevented (using placeholders for values in statements), JS
inline code is prevented especially for url redirects, and untrusted
data interpolated into shell scripts/commands is validated against shell
metacharacters.
- [x] Timeouts are implemented and retries are limited to avoid infinite
loops

## Testing

- [x] FMA CI validator (install → detect → uninstall) **passes** on the
SYSTEM-context Windows runner — [run
30384125610](https://github.com/fleetdm/fleet/actions/runs/30384125610)
(`All checks passed`)
- [x] Generated output verified locally: manifest SHA matches the winget
manifest, exists/patched queries reviewed for name + publisher
correctness, `apps.json` is valid JSON with a description filled in.
- [x] QA'd all new/changed functionality manually





<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit

- **New Features**
  - Added Gpg4win as a supported Windows application.
  - Added Gpg4win version 5.0.2 with Security categorization.
  - Added a Gpg4win icon to the software interface.
- Introduced silent install and uninstall support with process cleanup,
timeouts, and registry-based verification to confirm install/removal
outcomes.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
2026-07-31 09:57:32 -05:00
fleet-releaseandallenhouchins 5c54c33c41 Update Fleet-maintained apps (#50299)
Automated ingestion of latest Fleet-maintained app data.

<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->

## Summary by CodeRabbit

* **New Features**
* Updated Windows packages: 3DF Zephyr Free, Android Studio, AWS CLI,
Calibre, ImageGlass, NordVPN, OBS Studio, OneDrive, and Postman.
* Updated macOS packages: BusyContacts, Calibre, Clop, Postman, Shapr3D,
Typora, Unity Hub, and Wispr Flow.
* Refreshed release versions, download sources, update detection, and
integrity verification for the listed applications.

<!-- end of auto-generated comment: release notes by coderabbit.ai -->

---------

Co-authored-by: allenhouchins <32207388+allenhouchins@users.noreply.github.com>
2026-07-31 09:10:15 -05:00
Nico 7f1b330c90 Restrict deleting a fleet to global admins (#50271)
# Checklist for submitter

- [x] Changes file added for user-visible changes in `changes/`,
`orbit/changes/` or `ee/fleetd-chrome/changes`.
See [Changes
files](https://github.com/fleetdm/fleet/blob/main/docs/Contributing/guides/committing-changes.md#changes-files)
for more information.
## Testing

- [x] Added/updated automated tests
- [x] QA'd all new/changed functionality manually


<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit

* **Bug Fixes**
* Restricted fleet deletion to users with global write permissions,
including global administrators and GitOps.
* Corrected team deletion authorization to require global write access.
* Prevented global technicians, team technicians, and observer-level
users from deleting teams.
* Updated authorization behavior to consistently enforce the required
access level.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
2026-07-31 08:43:51 -03:00
fleet-releaseandallenhouchins 3e884177ab Update Fleet-maintained apps (#50279)
Automated ingestion of latest Fleet-maintained app data.

<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->

## Summary by CodeRabbit

* **Updates**
  * Updated Brave Browser for macOS to version 151.1.93.129.
  * Updated IBM Semeru JRE 8 for Windows to version 8.0.502.0.
  * Updated NordPass for macOS to version 7.9.3.
* Refreshed installer information, checksums, and version detection for
the updated releases.

<!-- end of auto-generated comment: release notes by coderabbit.ai -->

Co-authored-by: allenhouchins <32207388+allenhouchins@users.noreply.github.com>
2026-07-30 23:50:37 -05:00
fleet-releaseandallenhouchins e71aa713b3 Update Fleet-maintained apps (#50278)
Automated ingestion of latest Fleet-maintained app data.

<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->

## Summary by CodeRabbit

- **Updates**
- Refreshed Windows packages for 1Password, Claude, Cursor, GitKraken,
Node.js, OBS Studio, VirtualBox, and IBM Semeru JDK/JRE releases.
- Refreshed macOS packages for Arc, Beeper, BrickLink Studio, ChatGPT,
Firefox Nightly, Kiro CLI, Melodics, Azure Storage Explorer, Nextcloud
Talk, Spokenly, and Warp.
- Updated installer metadata, version detection, download sources, and
integrity checks to support the latest releases.
  - Updated uninstall handling where required for 1Password and Node.js.

<!-- end of auto-generated comment: release notes by coderabbit.ai -->

Co-authored-by: allenhouchins <32207388+allenhouchins@users.noreply.github.com>
2026-07-30 23:27:34 -05:00
0177c98f9a Regenerate macOS FMA install scripts (#50264)
Automated ingestion of latest Fleet-maintained app data.

---------

Co-authored-by: allenhouchins <32207388+allenhouchins@users.noreply.github.com>
Co-authored-by: Allen Houchins <allenhouchins@mac.com>
2026-07-30 23:04:20 -05:00
Carlo 3660b546f2 Fix FMA auto-update keeping the stale install script (#50200)
<!-- Add the related story/sub-task/bug number, like Resolves #123, or
remove if NA -->
**Related issue:** Resolves #50097

## Summary

FMA auto-update preserves an admin-customized install script by
comparing the active script against the new manifest's, but FMA scripts
hardcode the versioned installer filename, so a routine version bump
looked like an edit and the old script (old filename) was kept against
the newly downloaded installer, and the install failed. The fix
neutralizes the installer filename in both scripts before comparing
(mirroring the existing uninstall `$PACKAGE_ID` handling), so a
filename-only difference adopts the new script while a genuine edit is
still preserved.

# Checklist for submitter

- [x] Changes file added for user-visible changes in `changes/`
(`changes/50097-fma-auto-update-keeps-stale-install-script`).

## Testing

- [x] Added/updated automated tests (adopt-on-version-bump regression +
preserve-genuine-edit counterpart).
- [x] QA'd all new/changed functionality manually.


<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit

* **Bug Fixes**
* Fixed Fleet-maintained app auto-updates that could keep an outdated
install script after downloading a newer version, causing install
failures.
* Improved install-script change detection by ignoring version-only
installer filename differences.
* Continued to preserve administrator-customized install scripts when
updates change more than just the installer filename.
* **Tests**
* Added and expanded coverage for installer-script normalization and
auto-update install-script selection behavior.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
2026-07-30 17:42:55 -04:00
CarloandAllen Houchins 0594f653dd Propagate errors in macOS FMA install scripts (#50198)
<!-- Add the related story/sub-task/bug number, like Resolves #123, or
remove if NA -->
**Related issue:** Resolves #50056

## Summary

macOS FMA install scripts never checked the exit code of the install
command (`installer -pkg` / `cp -R`) — the script's last statement is
always `relaunch_application`, which exits 0 — so a failed install
exited 0 and Fleet reported it installed.

**Generated scripts.** The generator now propagates failure: both
`installer -pkg` variants end with `|| exit $?`, and the `cp -R` path
exits non-zero on a failed copy, removes the partial copy (so a failed
fresh install isn't inventoried as the new version), and restores the
app it moved aside. Regenerated `outputs/` for non-frozen generated apps
are produced by the `ingest-maintained-apps` job, so they aren't
committed here.

**Custom scripts.** 9 of the 18 custom input scripts had the same bug
and are fixed with the same pattern: Google Chrome, Zoom, Microsoft
Edge, GitHub Desktop, Webex, Cycling '74 Max, Pd, Grammarly Desktop, and
P4V. The DMG-based ones also now fail before removing/moving the
existing app when the mount or staging copy fails, so a bad download
can't leave a host with nothing. Their `outputs/*/darwin.json` are
updated in the same commit (script content + recomputed 8-char sha256
ref, versions untouched), following the precedent of #49033. Docker
Desktop (`set -euo pipefail`), 1Password/Slack/LogiTune (installer is
the last statement), and the rest already propagated errors.

**Frozen apps.** The ingest job never rewrites frozen outputs, so the 10
frozen apps with generated scripts (adobe-acrobat-pro, comet, evernote,
firealpaca, keeper-password-manager, nvidia-geforce-now, pritunl,
vnc-viewer, wins, worksheet-crafter) had the fix applied directly to
their published `darwin.json` scripts — the exact text the current
generator would emit, with pinned versions/URLs/hashes untouched. The
11th frozen app (logi-options+) uses a custom script that was already
correct and in sync.

# Checklist for submitter

- [x] Changes file added for user-visible changes in `changes/`
(`changes/50056-fma-install-scripts-ignore-errors`).
- [x] Untrusted data interpolated into shell scripts is validated
against shell metacharacters. (No new untrusted interpolation: the guard
reuses the same curated cask-derived name the adjacent lines already
interpolate.)

## Testing

- [x] Added/updated automated tests (three generator tests: pkg,
pkg-with-choices, cp-R restore — the last now pins the exact emitted
block).
- [x] All 19 updated output manifests validated: embedded scripts pass
`bash -n`, refs match `sha256(script)[:8]`, refs map stays key-sorted
like Go's encoder.
- [x] QA'd all new/changed functionality manually.


<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit

* **Bug Fixes**
* macOS Fleet-maintained app installations now fail fast when
installers, DMG extraction/mounting, or app copy steps error.
* If an upgrade fails, the system removes any partial app and restores
the previously installed version when available.
* Improved robustness during app staging/copying, including safer
handling of paths with spaces or special characters.
* **Tests**
* Added unit coverage to verify installer failure propagation and
rollback behavior.
* **Documentation**
* Clarified that the install-script error handling applies to both
generated and custom scripts, including already-published frozen apps.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->

---------

Co-authored-by: Allen Houchins <allenhouchins@mac.com>
2026-07-30 14:22:02 -05:00
e383c42da6 Update Fleet-maintained apps (#50230)
Automated ingestion of latest Fleet-maintained app data.

<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit

* **Chores**
  * Updated Proton Drive for Windows to version 3.0.4.
* Refreshed the installer download reference and checksum verification.
* Improved uninstall behavior by adding a pre-uninstall stop for running
Proton Drive processes and introducing a timeout-based “watchdog” to
prevent the uninstaller from hanging.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->

---------

Co-authored-by: allenhouchins <32207388+allenhouchins@users.noreply.github.com>
Co-authored-by: Allen Houchins <allenhouchins@mac.com>
2026-07-30 14:21:30 -05:00
Carlo a442d7af3a Python script-only packages: follow-on QA fixes (#50143)
**Related issues:** Resolves #50068, Resolves #50106, Resolves #50107,
Resolves #50108, Resolves #50110, Resolves #50114

Follow-on fixes from QA of #41470 (Python script-only packages):

- Software-installer validation errors are action-neutral, so the Add
and Edit flows each show the correct single verb, and the
unsupported-file error names a content/format mismatch instead of
blaming the extension (#50068, #50107).
- `.py` packages accept `setup_experience_platform` (`darwin`/`linux`),
matching `.sh` (#50106).
- A failed-to-run install script (exit code `-1`) now renders a
diagnostic instead of empty output, and orbit surfaces the underlying
execve error (#50108).
- The install-rejection message for `.sh`/`.py` packages says "macOS and
Linux hosts" instead of "linux" (#50110).
- Orbit writes each script's temp file with an extension matching its
shebang (`.py`/`.sh`/`.ps1`), so tracebacks reference the right file
type (#50114).

# Checklist for submitter

- [x] Changes file added for user-visible changes in `changes/`.

## Testing

- [x] Added/updated automated tests
- [x] QA'd all new/changed functionality manually

## fleetd/orbit/Fleet Desktop

- [x] If the change applies to only one platform, confirmed that
`runtime.GOOS` is used as needed to isolate changes.
- [x] Verified compatibility with the latest released version of Fleet
(orbit-only change; the server↔agent `SoftwareInstallDetails` contract
is unchanged).


<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit

* **Bug Fixes**
* Improved installer validation and rejection messaging for
unsupported/invalid package contents (including correcting “add” vs
“edit” wording and avoiding duplicated phrasing).
* Added clearer diagnostics when install scripts fail to start
(including empty output cases).
* Corrected handling of script-only packages so Python scripts use the
proper script type/extension, reducing misleading tracebacks.
* Updated platform availability messaging so `.sh`/`.py` packages
display macOS+Linux support.
* **New Features**
* Python script-only packages can now specify macOS and Linux setup
experience platforms.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
2026-07-30 14:40:24 -04:00
fleet-releaseandallenhouchins d2946b7bd3 Update Fleet-maintained apps (#50229)
Automated ingestion of latest Fleet-maintained app data.

<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->

## Summary by CodeRabbit

* **Updates**
  * Updated Evernote for Windows to version 11.27.5.
  * Updated Granola for Windows to version 7.452.1.
  * Updated Postman for Windows to version 12.21.7.
  * Updated Trezor Suite for macOS to version 26.7.3.
* Refreshed installer links and verification checksums for each release.

<!-- end of auto-generated comment: release notes by coderabbit.ai -->

Co-authored-by: allenhouchins <32207388+allenhouchins@users.noreply.github.com>
2026-07-30 11:53:17 -05:00
fleet-releaseandallenhouchins 5a45d781b7 Update Fleet-maintained apps (#50216)
Automated ingestion of latest Fleet-maintained app data.

<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->

## Summary by CodeRabbit

* **New Features**
* Added availability for the latest releases of numerous maintained
applications across Windows and macOS.
* Updated applications include Chrome, Firefox Nightly, Postman, Signal,
Notion, Podman Desktop, Draw.io, CMake, JDK/JRE, and many others.
* **Bug Fixes**
* Refreshed installer links, version detection, and package verification
data to ensure updates install and validate correctly.
* Updated app-specific installation handling where required for newer
releases.

<!-- end of auto-generated comment: release notes by coderabbit.ai -->

Co-authored-by: allenhouchins <32207388+allenhouchins@users.noreply.github.com>
2026-07-30 10:58:30 -05:00
Allen Houchins 344e5aa5a2 Remove Dynalist macOS Fleet-maintained app (cask deleted from homebrew-cask) (#50215)
<!-- Add the related story/sub-task/bug number, like Resolves #123, or
remove if NA -->
**Related issue:** NA — fixing a failing scheduled "Update
Fleet-maintained apps" run.

Removes the **macOS** Dynalist Fleet-maintained app. The Windows
(winget) FMA is unaffected and stays.

## Why

The `dynalist` cask was deleted from homebrew-cask on 2026-07-30
([commit
`adac21ffc4`](https://github.com/Homebrew/homebrew-cask/commit/adac21ffc401)),
completing Homebrew's full deprecation lifecycle:

- `deprecate!` 2024-07-29, `because: :unmaintained`
- `disable!` 2025-07-29
- cask file removed 2026-07-30

`https://formulae.brew.sh/api/cask/dynalist.json` now returns 404, so
the scheduled ingester panics:

```
{"level":"INFO","msg":"ingesting homebrew app","name":"Dynalist"}
panic: ingesting homebrew app: app not found in brew API
```

Marking the app `"frozen": true` does **not** fix this — the ingester
fetches the cask JSON before the frozen flag is consulted
(`cmd/maintained-apps/main.go`), so removal is the only fix for a dead
upstream cask.

## What changed

Deletions only (39 lines, no additions):

- `ee/maintained-apps/inputs/homebrew/dynalist.json` — deleted
- `ee/maintained-apps/outputs/dynalist/darwin.json` — deleted
- the `dynalist/darwin` entry in `ee/maintained-apps/outputs/apps.json`
— removed; `dynalist/windows` remains

## Deliberately kept

Because the Windows FMA still needs them:

- `ee/maintained-apps/outputs/dynalist/windows.json`,
`ee/maintained-apps/inputs/winget/dynalist.json`, and its
install/uninstall scripts
- `frontend/pages/SoftwarePage/components/icons/Dynalist.tsx` and its
`dynalist:` mapping in `icons/index.ts` — the map is keyed by lowercased
app name and is shared across platforms
- `website/assets/images/app-icon-dynalist-60x60@2x.png` — keyed by slug
token, still serving the Windows entry in the app library

## Note for reviewers

Hosts that currently have the macOS Dynalist FMA installed will lose the
maintained-app entry on the next sync. This matches the behavior of
prior FMA removals (Nocturnal #50050, Dell Display Manager #47420,
Messenger #46541).

# Checklist for submitter

- [x] Changes file added for user-visible changes in `changes/`,
`orbit/changes/` or `ee/fleetd-chrome/changes`.
Not applicable — consistent with prior FMA removal PRs, which do not add
a changes file.

## Testing

- [x] QA'd all new/changed functionality manually

Verified that `ee/maintained-apps/outputs/apps.json` still parses as
valid JSON (1381 apps) and that `Dynalist` now resolves to only
`dynalist/windows`. Confirmed the 404 against the brew API and read the
pre-removal cask at `adac21ffc4~1` to establish the deprecation reason.
`git diff` confirms the change is deletions-only.
2026-07-30 10:31:18 -05:00
c83ecc2231 Match Windows software with version in name to FMA software title
Resolves #44406

Windows programs report a version in their name (e.g. `Granola
7.373.2`), so each version created its own `software_title` and never
linked to the Fleet-maintained app installer's title (`Granola`), hiding
the uninstall action. macOS handles this via `bundle_identifier`;
Windows had no join key.

- Give matching Windows programs the canonical FMA name at ingestion
(name-prefix match), so all versions collapse onto the title the
installer owns. `software.name` is unchanged.
- Merge already-mismatched versioned titles onto the canonical title in
`ReconcileMaintainedAppSoftwareNames` (runs on FMA sync; no migration
needed).

---------

Co-authored-by: Tim Lee <timlee@fleetdm.com>
Co-authored-by: Juan Fernandez <juan@fleetdm.com>
2026-07-30 09:49:52 -04:00
fleet-releaseandallenhouchins d052e980b7 Update Fleet-maintained apps (#50199)
Automated ingestion of latest Fleet-maintained app data.

<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->

## Summary by CodeRabbit

* **Updates**
  * Updated AWS CLI for Windows to version 2.36.11.
  * Updated Windsurf for macOS to version 3.6.22.
  * Updated Gitify for macOS to version 7.2.0.
  * Updated GoLand for Windows to the 2026.2 release.
  * Updated Linear for macOS to version 1.32.0.
  * Updated Rancher Desktop for macOS to version 1.24.0.
  * Refreshed installer links and verification data for each release.

<!-- end of auto-generated comment: release notes by coderabbit.ai -->

Co-authored-by: allenhouchins <32207388+allenhouchins@users.noreply.github.com>
2026-07-29 22:30:31 -05:00
fleet-releaseandallenhouchins 66b47813fe Update Fleet-maintained apps (#50184)
Automated ingestion of latest Fleet-maintained app data.

<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->

## Summary by CodeRabbit

- **Updates**
  - Updated Krita for Windows to version 5.3.3.0.
  - Updated Loom for macOS and Windows to version 0.365.0.
  - Updated Vivaldi for Windows to version 8.1.4087.61.
- Refreshed installer links and verification data to support reliable
installation and version detection.

<!-- end of auto-generated comment: release notes by coderabbit.ai -->

Co-authored-by: allenhouchins <32207388+allenhouchins@users.noreply.github.com>
2026-07-29 16:22:28 -05:00
fleet-releaseandallenhouchins 12ee3384e6 Update Fleet-maintained apps (#50172)
Automated ingestion of latest Fleet-maintained app data.

<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->

## Summary by CodeRabbit

* **Chores**
* Updated managed Zed app installers for macOS and Windows to version
1.13.1.
* Updated download links and integrity checks to match the new release.
* Improved version detection so outdated installations are correctly
identified.

<!-- end of auto-generated comment: release notes by coderabbit.ai -->

Co-authored-by: allenhouchins <32207388+allenhouchins@users.noreply.github.com>
2026-07-29 15:22:15 -05:00
fleet-releaseandallenhouchins f3eb7ea3e7 Update Fleet-maintained apps (#50167)
Automated ingestion of latest Fleet-maintained app data.

<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->

## Summary by CodeRabbit

* **New Features**
* Updated maintained app releases for macOS and Windows, including
Adlock, Another Redis Desktop Manager, BetterTouchTool, BoltAI,
CodexBar, Egnyte, Firefox Developer Edition, Mimestream, Superwhisper,
and TeamViewer.
* Updated installation downloads and version detection for each new
release.
  * Refreshed package integrity checks to support the latest installers.

<!-- end of auto-generated comment: release notes by coderabbit.ai -->

Co-authored-by: allenhouchins <32207388+allenhouchins@users.noreply.github.com>
2026-07-29 13:21:03 -05:00
fleet-releaseandallenhouchins c25f37abd6 Update Fleet-maintained apps (#50156)
Automated ingestion of latest Fleet-maintained app data.

<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->

## Summary by CodeRabbit

* **Updates**
* Updated maintained app releases for Gitify, JetBrains Toolbox,
Microsoft 365 Copilot, Spokenly, Tower, and Vivaldi.
* Refreshed installer links and verification checksums for the latest
versions across macOS and Windows.
* **Bug Fixes**
* Updated Pastebot’s macOS uninstall process to remove the app and
related user files while avoiding removal of additional system paths.

<!-- end of auto-generated comment: release notes by coderabbit.ai -->

Co-authored-by: allenhouchins <32207388+allenhouchins@users.noreply.github.com>
2026-07-29 12:37:14 -05:00
ddf3e96fa9 Update Fleet-maintained apps (#50150)
Automated ingestion of latest Fleet-maintained app data.

<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit

* **New Versions**
* Updated release metadata and installer details for AnyBurn,
BetterDisplay, Blender, ChatGPT, ChatWise, CLion, DataGrip, Dataspell,
Draw.io Desktop, Elgato Camera Hub, Firefox, Firefox Nightly, GIMP,
GoLand, IntelliJ IDEA (and variants), Keka, Kitty, LibreOffice,
MacPacker, MuseScore, Nudge, OBS, PhpStorm, PyCharm (CE), Rider,
RubyMine, RustRover, Spyder, Typinator, Visual Studio Code, VLC,
WebStorm, Wispr Flow, XLD, and others.
  * Refreshed app version detection and package checksums accordingly.

* **Bug Fixes**
* Improved uninstall reliability on macOS and Windows by removing
unintended extra cleanup actions while keeping application and user-data
removal.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->

---------

Co-authored-by: allenhouchins <32207388+allenhouchins@users.noreply.github.com>
Co-authored-by: Allen Houchins <allenhouchins@mac.com>
2026-07-29 10:55:36 -05:00
fleet-releaseandallenhouchins f67d9a5b3c Update Fleet-maintained apps (#50138)
Automated ingestion of latest Fleet-maintained app data.

<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->

## Summary by CodeRabbit

* **New Features**
* Added support for the latest versions of AnyBurn, BetterZip, Canva,
Eclipse Temurin, ExifCleaner, Gemini, LibreOffice, NordVPN, Postman,
TablePlus, Tailscale, and other maintained applications across Windows
and macOS.
* **Bug Fixes**
* Improved macOS uninstall cleanup for numerous applications by removing
additional caches, preferences, recent-document entries, containers,
support files, and related data.
* Updated installer downloads and verification checks to match the
latest releases.


<!-- end of auto-generated comment: release notes by coderabbit.ai -->

---------

Co-authored-by: allenhouchins <32207388+allenhouchins@users.noreply.github.com>
2026-07-29 09:35:04 -05:00
Jonathan Katz 1a0f0101cc Fix gitops not updating FMA installer (#50000)
<!-- Add the related story/sub-task/bug number, like Resolves #123, or
remove if NA -->
**Related issue:** Resolves #49811 

# Checklist for submitter

If some of the following don't apply, delete the relevant line.

- [x] Changes file added for user-visible changes in `changes/`,
`orbit/changes/` or `ee/fleetd-chrome/changes`.
See [Changes
files](https://github.com/fleetdm/fleet/blob/main/docs/Contributing/guides/committing-changes.md#changes-files)
for more information.

- [ ] Input data is properly validated, `SELECT *` is avoided, SQL
injection is prevented (using placeholders for values in statements), JS
inline code is prevented especially for url redirects, and untrusted
data interpolated into shell scripts/commands is validated against shell
metacharacters.
- [ ] Timeouts are implemented and retries are limited to avoid infinite
loops
- [ ] If paths of existing endpoints are modified without backwards
compatibility, checked the frontend/CLI for any necessary changes

## Testing

- [x] Added/updated automated tests
- [ ] Where appropriate, [automated tests simulate multiple hosts and
test for host
isolation](https://github.com/fleetdm/fleet/blob/main/docs/Contributing/reference/patterns-backend.md#unit-testing)
(updates to one hosts's records do not affect another)

- [x] QA'd all new/changed functionality manually



<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->

## Summary by CodeRabbit

* **Bug Fixes**
* Fixed Fleet-maintained app updates when a rebuilt installer keeps the
same version.
* Rebuilt installers now update their files, hashes, filenames, and
install scripts correctly.
* Prevented installers from being incorrectly skipped when their
contents differ despite matching versions.
* **Tests**
* Added coverage for same-version installer rebuilds and team-specific
caching behavior.

<!-- end of auto-generated comment: release notes by coderabbit.ai -->
2026-07-29 10:00:16 -04:00
Lucas Manuel RodriguezandCopilot Autofix powered by AI 9c2ef14947 Scrub device policy responses in Fleet Desktop (#50094)
- [X] Changes file added for user-visible changes in `changes/`,
`orbit/changes/` or `ee/fleetd-chrome/changes`.

## Testing

- [X] Added/updated automated tests
- [X] QA'd all new/changed functionality manually

## fleetd/orbit/Fleet Desktop

- [X] Verified compatibility with the latest released version of Fleet
(see [Must
rule](https://github.com/fleetdm/fleet/blob/main/docs/Contributing/workflows/fleetd-development-and-release-strategy.md))
- [X] Verified auto-update works from the released version of component
to the new version (see [tools/tuf/test](../tools/tuf/test/README.md))


<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit

* **Security Improvements**
* Updated device-authenticated policy and host-detail responses to omit
policy author identity fields and any raw SQL/query data.
* Device policy endpoints now return a device-safe policy representation
consistently.

* **Bug Fixes**
* Prevented administrative policy information from appearing in
device-authenticated host details and policy listings.

* **Tests**
* Strengthened integration coverage to verify device-safe responses
(required user-facing fields present; sensitive fields absent).
<!-- end of auto-generated comment: release notes by coderabbit.ai -->

---------

Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
2026-07-29 09:34:31 -03:00
Nico f5ca4b5b0d Add Android support for custom host vitals (#49696)
<!-- Add the related story/sub-task/bug number, like Resolves #123, or
remove if NA -->
**Related issue:** Resolves #49421

Custom host vitals (`$FLEET_HOST_VITAL_<id>`) already worked in scripts
and Apple/Windows configuration profiles, but Android configuration
profiles and managed app configuration explicitly rejected them at
upload to keep parity with `$FLEET_SECRET_*`. This left admins unable to
inject per-host vitals (e.g. an asset tag) into Android MDM
configuration the same way they can for every other platform.

For more context, prior PRs:
- https://github.com/fleetdm/fleet/pull/49334
- https://github.com/fleetdm/fleet/pull/49586

# Checklist for submitter

- [x] Changes file added for user-visible changes in `changes/`,
`orbit/changes/` or `ee/fleetd-chrome/changes`.
See [Changes
files](https://github.com/fleetdm/fleet/blob/main/docs/Contributing/guides/committing-changes.md#changes-files)
for more information.

## Testing

- [x] Added/updated automated tests

- [x] QA'd all new/changed functionality manually

- Created an "Asset tag" host vital.
- Enrolled an Android device.
- Initially the test profile showed as "Failed" because no value was set
for the vital.
- Set a value for the vital, saw that it went from Enforcing to
Verified.

<img width="1446" height="510" alt="Screenshot 2026-07-24 at 8 57 46 AM"
src="https://github.com/user-attachments/assets/c0e2348c-e521-48f3-85cd-6f884689b2cd"
/>
<img width="1520" height="936" alt="Screenshot 2026-07-24 at 8 56 56 AM"
src="https://github.com/user-attachments/assets/169b9545-ec7a-429b-8f45-0e2740f61c77"
/>
<img width="1607" height="1136" alt="Screenshot 2026-07-24 at 8 57
30 AM"
src="https://github.com/user-attachments/assets/a8213745-b224-4a36-a54d-32152a15c377"
/>

Also tested the rejection cases:
- trying to upload a profile with an invalid custom host vital id
(either a non-numeric value, a numeric but non-existent ID, and
referencing a vital as a JSON key instead of a value)
- deleting a vital referenced in a profile



https://github.com/user-attachments/assets/e8b4acde-ddf4-41c0-b00a-5ab4945d0bc2



<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit

## Summary by CodeRabbit

* **New Features**
* Android app configurations and profiles now support custom host vital
placeholders (`$FLEET_HOST_VITAL_<id>`).
* Custom host vital values are expanded per device during Android
delivery.
* Managed Android profiles/configurations are automatically resent when
a referenced vital value changes.

* **Bug Fixes**
* Added validation for malformed, missing, or undefined vital references
during Android app association and profile/config uploads.
  * Prevented deletion of vitals referenced by Android profiles.
* Improved error handling and delivery failure details when a device
lacks a required vital value.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
2026-07-29 08:22:57 -03:00
kitzy f4d7064f9a Add Rtools as a Windows FMA (#50028)
<!-- Add the related story/sub-task/bug number, like Resolves #123, or
remove if NA -->
**Related issue:** #50020

# What this does

Adds **Rtools** as a Windows Fleet-maintained app. One of the 11 apps
split out of #48501 that failed the FMA validator; #50016 shipped the 6
that passed.

## Why it was failing

The install script hit the validator's 10-minute `executeScript` cap
exactly:

```
20:41:22  INFO  msg="Executing install script..." app=Rtools
20:51:22  ERROR msg="Error executing install script: exit status 1"   # exactly 10:00 later
20:51:22  WARN  msg="failed to remove rtools45-6768-6492.exe: ... Access is denied."
```

The locked installer in the temp dir shows a process was still alive.
`Start-Process -Wait` waits for the process *and all of its
descendants*, which is the same root cause as the other install-timeout
apps in this batch.

Rtools is also the one app in the batch where a **slow unpack** is a
plausible second cause — the installer is ~460 MB and expands a full
toolchain. So rather than assume, the script now waits on the installer
process alone with a 480s cap (under the caller's 10-minute budget) and
logs elapsed time plus Add/Remove Programs registration state on every
poll. If the cap is reached:

- **registered** → the install finished and only a lingering child
remains, so it stops that process and succeeds;
- **not registered** → the unpack genuinely didn't finish, and it fails
with that stated explicitly.

Either way the CI log now says which one happened instead of just timing
out.

## Notes

- **Identity verified against the installer**, not winget metadata. The
setup stub's PE version resource reads `CompanyName: The R Foundation`,
`ProductName: Rtools`. Inno derives `VersionInfoCompany` from
`AppPublisher`, so the ARP publisher is `The R Foundation` — which is
what the exists query uses.
- **Versioned ARP name.** The registry `DisplayName` is `Rtools 4.5
(6768-6492)`, so the input uses `fuzzy_match_name` and the exists query
is `name LIKE 'Rtools %'`.
- Installs to `C:\rtools45`, not Program Files, so the validator's "no
changes detected in `C:\Program Files`" line is an expected warning, not
a failure.
- Ships a new catalog icon and website asset.

# Checklist for submitter

- [x] Input data is properly validated, `SELECT *` is avoided, SQL
injection is prevented (using placeholders for values in statements), JS
inline code is prevented especially for url redirects, and untrusted
data interpolated into shell scripts/commands is validated against shell
metacharacters.
- [x] Timeouts are implemented and retries are limited to avoid infinite
loops

## Testing

- [x] FMA CI validator (install → detect → uninstall) **passes** on the
SYSTEM-context Windows runner — [run
30384196159](https://github.com/fleetdm/fleet/actions/runs/30384196159)
(`All checks passed`)
- [x] Generated output verified locally: manifest SHA matches the winget
manifest, exists/patched queries checked against the installer's PE
version resource, `apps.json` is valid JSON with a description filled
in.
- [x] QA'd all new/changed functionality manually




<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit

* **New Features**
  * Added Rtools as a supported Windows application.
* Added installation and uninstallation support with silent setup and
silent removal.
* Added Rtools version metadata, installer verification, and Developer
tools categorization.
  * Added a dedicated Rtools icon for software listings.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
2026-07-28 23:01:31 -05:00
kitzy ea3f95ccc5 Add Google Earth Pro as a Windows FMA (#50022)
<!-- Add the related story/sub-task/bug number, like Resolves #123, or
remove if NA -->
**Related issue:** #50020

# What this does

Adds **Google Earth Pro** as a Windows Fleet-maintained app (a Windows
counterpart to the existing `google-earth-pro/darwin` FMA). One of the
11 apps split out of #48501 that failed the FMA validator; #50016
shipped the 6 that passed.

## Why it was failing

Install and detection were already fine on the SYSTEM-context Windows
runner — osquery found `Google Earth Pro` 7.3.7.1155. **Uninstall** was
the failure:

```
INFO  msg="Executing uninstall script for app..." app="Google Earth Pro"
INFO  msg="Found app: 'Google Earth Pro' at , Version: 7.3.7.1155"
ERROR msg="App still present after uninstall (expected no match for version '7.3.7.1155' in programs)"
```

The EXE wraps a WiX MSI, so the ARP `UninstallString` is `MsiExec.exe
/X{ProductCode}` — with **no quiet switch**. The old script ran that
string verbatim, which raises a confirmation dialog in session 0 where
nothing can click it, so the uninstall silently no-ops.

The uninstall script now resolves the MSI product code (from the
`UninstallString`, falling back to the registry key name) and runs
`msiexec /x <code> /quiet /norestart` with a bounded 5-minute wait, then
drains child `msiexec` processes. `3010`/`1641` are treated as success.

## Notes

- **Identity verified against the real installer**, not winget metadata.
The installer's embedded MSI Property table reads: `ProductName` =
`Google Earth Pro`, `Manufacturer` = `Google`, `ProductVersion` =
`7.3.7.1155`, `ALLUSERS` = `1`, `ProductCode` =
`{E3B69BB6-FFD8-441C-933E-BB8A3136ED8F}`. No `ARPSYSTEMCOMPONENT`, so it
is not a bootstrapper. That confirms `unique_identifier` = `Google Earth
Pro` and the exists-query publisher `Google` (not "Google LLC").
- Installs to `C:\Program Files (x86)`, so the validator's "no changes
detected in `C:\Program Files`" line is an expected warning, not a
failure.
- Reuses the existing `google earth pro` catalog icon — no new icon
needed.

# Checklist for submitter

- [x] Input data is properly validated, `SELECT *` is avoided, SQL
injection is prevented (using placeholders for values in statements), JS
inline code is prevented especially for url redirects, and untrusted
data interpolated into shell scripts/commands is validated against shell
metacharacters.
- [x] Timeouts are implemented and retries are limited to avoid infinite
loops

## Testing

- [x] FMA CI validator (install → detect → uninstall) **passes** on the
SYSTEM-context Windows runner — [run
30383934805](https://github.com/fleetdm/fleet/actions/runs/30383934805)
(`All checks passed`)
- [x] Generated output verified locally: manifest SHA matches the winget
manifest, exists/patched queries checked against the MSI Property table,
`apps.json` is valid JSON with a description filled in.
- [x] QA'd all new/changed functionality manually




<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit

* **New Features**
  * Added Google Earth Pro for Windows to the maintained app catalog.
* Added maintained-apps install and uninstall support for Google Earth
Pro (version 7.3.7.1155).
* Included automated download integrity verification and detection logic
for installed/updated versions.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
2026-07-28 22:59:39 -05:00
kitzy c61632305a Add Logitech Unifying Software as a Windows FMA (#50024)
<!-- Add the related story/sub-task/bug number, like Resolves #123, or
remove if NA -->
**Related issue:** #50020

# What this does

Adds **Logitech Unifying Software** as a Windows Fleet-maintained app.
One of the 11 apps split out of #48501 that failed the FMA validator;
#50016 shipped the 6 that passed.

## Why it was failing

Install and detection were already fine on the SYSTEM-context Windows
runner — osquery found `Logitech Unifying Software 2.52` at `C:\Program
Files\Common Files\LogiShrd\Unifying`. **Uninstall** was the failure:

```
20:40:55  INFO  msg="Executing uninstall script for app..."
20:40:57  INFO  msg="Found app: 'Logitech Unifying Software 2.52' ... Version: 2.52.33"
20:40:57  ERROR msg="App still present after uninstall (expected no match for version '2.52.33' in programs)"
```

Two seconds start to finish — the uninstaller hadn't actually done
anything yet. This is standard NSIS behavior: the uninstaller copies
itself to `%TEMP%` and relaunches, so the process the script starts
exits almost immediately while the real work happens in a detached
child.

The fix passes NSIS's `_?=<dir>` switch, which runs the uninstaller in
place instead of relaunching, making it synchronous. It has to be the
last argument and unquoted, so the script builds a single argument
string rather than an array (PowerShell would quote an element
containing spaces). A bounded poll on the ARP key follows as a backstop,
and the script fails explicitly if the entry is still there.

## Notes

- **Versioned ARP name.** The registry `DisplayName` is `Logitech
Unifying Software 2.52`, so the input uses `fuzzy_match_name` and the
exists query is `name LIKE 'Logitech Unifying Software %'`. The
uninstall script matches the same prefix rather than an exact string.
- Publisher `Logitech` confirmed against the winget locale manifest.
- Installs under `C:\Program Files\Common Files`, so the validator's "no
changes detected in `C:\Program Files`" line is an expected warning, not
a failure.
- Ships a new catalog icon and website asset.

# Checklist for submitter

- [x] Input data is properly validated, `SELECT *` is avoided, SQL
injection is prevented (using placeholders for values in statements), JS
inline code is prevented especially for url redirects, and untrusted
data interpolated into shell scripts/commands is validated against shell
metacharacters.
- [x] Timeouts are implemented and retries are limited to avoid infinite
loops

## Testing

- [x] FMA CI validator (install → detect → uninstall) **passes** on the
SYSTEM-context Windows runner — [run
30384010810](https://github.com/fleetdm/fleet/actions/runs/30384010810)
(`All checks passed`)
- [x] Generated output verified locally: manifest SHA matches the winget
manifest, exists/patched queries reviewed for name + publisher
correctness, `apps.json` is valid JSON with a description filled in.
- [x] QA'd all new/changed functionality manually




<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit

* **New Features**
* Added Logitech Unifying Software to the Windows software catalog,
including the version 2.52.33 download, checksum, and install-detection
metadata.
* Implemented silent installation and a robust, registry-aware uninstall
flow (with process lock handling and timeout behavior).
* Added a dedicated Logitech Unifying Software icon to the software page
UI.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
2026-07-28 22:59:09 -05:00
kitzy cfbb5a59fa Add GNU Privacy Guard as a Windows FMA (#50025)
<!-- Add the related story/sub-task/bug number, like Resolves #123, or
remove if NA -->
**Related issue:** #50020

# What this does

Adds **GNU Privacy Guard** as a Windows Fleet-maintained app. One of the
11 apps split out of #48501 that failed the FMA validator; #50016
shipped the 6 that passed.

## Why it was failing

The install itself worked — the validator logged `New application
detected at: C:\Program Files\GnuPG`. The *script* never returned:

```
20:18:36  INFO  msg="Executing install script..." app="GNU Privacy Guard"
20:28:36  ERROR msg="Error executing install script: exit status 1"   # exactly 10:00 later
20:28:36  INFO  msg="New application detected at: C:\Program Files\GnuPG"
```

Ten minutes on the nose is the validator's `executeScript` timeout. The
cause is a PowerShell detail rather than anything wrong with the
installer: **`Start-Process -Wait` waits for the process *and all of its
descendants***. GnuPG's installer starts `gpg-agent`, `dirmngr`,
`keyboxd` and `scdaemon` and leaves them resident, so `-Wait` never
returns. The same run left the installer `.exe` locked in the
validator's temp dir, which is the other tell that a child process was
still alive.

The install script now follows the pattern already established by
[`ollama_install.ps1`](ee/maintained-apps/inputs/winget/scripts/ollama_install.ps1):
start with `-PassThru` (no `-Wait`), wait on the installer process alone
with a 7-minute cap (below the caller's 10-minute script budget), poll
for the Add/Remove Programs entry so a fast-returning installer can't be
mistaken for a finished one, then stop the daemons.

Stopping the daemons also fixes the uninstall, which would otherwise
fail on files those processes hold open. The uninstall script stops them
up front, uses NSIS's `_?=<dir>` switch so the uninstaller runs in place
instead of relaunching itself detached from `%TEMP%`, and polls the ARP
key to confirm removal.

## Notes

- Clean ARP `DisplayName` (`GNU Privacy Guard`), so exact name matching
— no `fuzzy_match_name` needed. Publisher `The GnuPG Project`.
- Ships a new catalog icon and website asset.

# Checklist for submitter

- [x] Input data is properly validated, `SELECT *` is avoided, SQL
injection is prevented (using placeholders for values in statements), JS
inline code is prevented especially for url redirects, and untrusted
data interpolated into shell scripts/commands is validated against shell
metacharacters.
- [x] Timeouts are implemented and retries are limited to avoid infinite
loops

## Testing

- [x] FMA CI validator (install → detect → uninstall) **passes** on the
SYSTEM-context Windows runner — [run
30384069714](https://github.com/fleetdm/fleet/actions/runs/30384069714)
(`All checks passed`)
- [x] Generated output verified locally: manifest SHA matches the winget
manifest, exists/patched queries reviewed for name + publisher
correctness, `apps.json` is valid JSON with a description filled in.
- [x] QA'd all new/changed functionality manually





<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit

* **New Features**
* Added GNU Privacy Guard as a supported Windows application in the
maintained apps catalog.
  * Added install/upgrade detection and uninstall support for Windows.
  * Added GNU Privacy Guard to the software catalog (Security category).
* Added a dedicated GNU Privacy Guard icon to the software interface for
proper name-based display.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
2026-07-28 22:56:46 -05:00
kitzy 2fc41c7592 Add Azure Data Studio as a Windows FMA (#50027)
<!-- Add the related story/sub-task/bug number, like Resolves #123, or
remove if NA -->
**Related issue:** #50020

# What this does

Adds **Azure Data Studio** as a Windows Fleet-maintained app. One of the
11 apps split out of #48501 that failed the FMA validator; #50016
shipped the 6 that passed.

## Why it was failing

The install itself worked — the validator logged `New application
detected at: C:\Program Files\Azure Data Studio`. The *script* never
returned:

```
20:08:19  INFO  msg="Executing install script..." app="Azure Data Studio"
20:18:19  ERROR msg="Error executing install script: exit status 1"   # exactly 10:00 later
20:18:19  INFO  msg="New application detected at: C:\Program Files\Azure Data Studio"
```

Ten minutes on the nose is the validator's `executeScript` timeout.
Azure Data Studio is a Visual Studio Code fork and ships the same Inno
Setup script — including the **`runcode` task, which launches the app
when the install finishes**. Because `Start-Process -Wait` waits for the
process *and all of its descendants*, the launched app kept the script
blocked forever.

The fix is the switch VS Code's own FMA already uses:
`/MERGETASKS=!runcode` (see
[`vscode_install.ps1`](ee/maintained-apps/inputs/winget/scripts/vscode_install.ps1)
and
[`vscodium_install.ps1`](ee/maintained-apps/inputs/winget/scripts/vscodium_install.ps1),
both of which pass validation). The script also waits on the installer
process alone rather than its descendants, polls for the Add/Remove
Programs entry, and stops a stray `azuredatastudio` process as a
backstop in case a future build ignores the task suppression.

## Notes

- Machine-scope x64 installer, per the winget manifest — Azure Data
Studio publishes both user and machine scope, and Fleet installs run as
SYSTEM, so machine scope is required.
- Clean ARP `DisplayName` (`Azure Data Studio`), so exact name matching.
Publisher `Microsoft Corporation`.
- Uninstall is unchanged: the Inno uninstaller doesn't leave anything
resident, and `-Wait` waiting on descendants is the desired behavior
there (Inno relaunches itself from `%TEMP%`).
- Ships a new catalog icon and website asset.

# Checklist for submitter

- [x] Input data is properly validated, `SELECT *` is avoided, SQL
injection is prevented (using placeholders for values in statements), JS
inline code is prevented especially for url redirects, and untrusted
data interpolated into shell scripts/commands is validated against shell
metacharacters.
- [x] Timeouts are implemented and retries are limited to avoid infinite
loops

## Testing

- [x] FMA CI validator (install → detect → uninstall) **passes** on the
SYSTEM-context Windows runner — [run
30384162280](https://github.com/fleetdm/fleet/actions/runs/30384162280)
(`All checks passed`)
- [x] Generated output verified locally: manifest SHA matches the winget
manifest, exists/patched queries reviewed for name + publisher
correctness, `apps.json` is valid JSON with a description filled in.
- [x] QA'd all new/changed functionality manually




<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit

* **New Features**
  * Added Azure Data Studio to the available Windows software catalog.
* Added support for installing and uninstalling Azure Data Studio
(version 1.52.0) via silent installer and uninstaller flows with
completion detection.
* Added an Azure Data Studio icon to the software interface for better
visual identification.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
2026-07-28 22:56:00 -05:00
fleet-releaseandallenhouchins 38d1f6a856 Update Fleet-maintained apps (#50113)
Automated ingestion of latest Fleet-maintained app data.

<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->

## Summary by CodeRabbit

* **New Features**
* Added support for numerous current macOS and Windows application
releases, including updated installers, download links, and integrity
checks.
* Improved uninstall cleanup for several applications by removing
additional services, launch items, recent-document entries, and
application data.
* **Bug Fixes**
* Corrected version detection thresholds so outdated installations are
accurately identified.
* Updated installer and uninstaller behavior for newer application
builds, including improved relaunch and cleanup handling.

<!-- end of auto-generated comment: release notes by coderabbit.ai -->

---------

Co-authored-by: allenhouchins <32207388+allenhouchins@users.noreply.github.com>
2026-07-28 22:52:37 -05:00
Allen Houchins a3cdb7e14b Fix macOS-only copy on two Windows FMA catalog entries (#50111)
<!-- Add the related story/sub-task/bug number, like Resolves #123, or
remove if NA -->
**Related issue:** N/A — found while removing the macOS Yubikey Manager
FMA (#50109)

Two Windows Fleet-maintained apps describe themselves as macOS software
in `ee/maintained-apps/outputs/apps.json`, because the entries were
copy-pasted from their macOS counterparts. This copy is customer-facing:
it shows in the Fleet UI's software catalog and on
`fleetdm.com/software-catalog/<slug>`.

- `proxyman/windows` — "Proxyman is a high-performance **macOS** app
that enables developers to view HTTP/HTTPS requests and responses." →
drops "macOS". (The `proxyman/darwin` description keeps it; it's
accurate there.)
- `wechat/windows` — name "**WeChat for Mac**" and "**WeChat for Mac**
is a free messaging and calling application." → "WeChat". The winget
input (`inputs/winget/wechat.json`) already declares `"name": "WeChat"`,
so this also makes `apps.json` agree with its own input. The
`wechat/darwin` entry keeps "WeChat for Mac", which is the actual macOS
product name.

Renaming the Windows entry needs a matching icon key.
`getMatchedSoftwareIcon` matches on the lowercased app name and requires
an exact match or a whole-word prefix (`matchLoosePrefixToKey`: `s ===
key || s.startsWith(key + " ")`), so the existing `"wechat for mac"` key
would **not** match a name of "WeChat" and the app would fall back to
the generic package icon. Added a `wechat: Wechat` key alongside it
(both point at the same component; the `"wechat for mac"` key stays for
macOS and for hosts reporting that name in inventory).

No server-side impact: `UpsertMaintainedApp` keys on `slug` and updates
`name` in place, and `ReconcileMaintainedAppSoftwareNames` only renames
`darwin` titles, so the Windows rename doesn't touch existing software
titles. Website icons resolve from the slug (`build-static-content.js`
builds `app-icon-<slug>-60x60@2x.png`), not the name, so
`app-icon-wechat-60x60@2x.png` is unaffected.

Descriptions here mirror upstream cask/winget copy, so these are minimal
factual corrections rather than a voice rewrite.

# Checklist for submitter

- [x] Input data is properly validated, `SELECT *` is avoided, SQL
injection is prevented (using placeholders for values in statements), JS
inline code is prevented especially for url redirects, and untrusted
data interpolated into shell scripts/commands is validated against shell
metacharacters.

## Testing

- [x] QA'd all new/changed functionality manually:
- `apps.json` still parses; 1378 apps; verified the four
`proxyman`/`wechat` entries read as intended and the `darwin` ones are
untouched.
- Traced the icon lookup by hand: name "wechat" now hits the new
exact-match key; "wechat for mac" still hits the original.
- Swept every non-darwin entry in `apps.json` for macOS-only phrasing
(`Rosetta`, `macOS`, `Mac`, `Apple`) — these two were the only genuine
mismatches. `duo-desktop/windows` (lists macOS, Windows, and Linux) and
`imazing-profile-editor/windows` (edits Apple configuration profiles)
are correct as written.

Note: `node_modules` isn't installed in my working copy, so
ESLint/Prettier weren't run locally — the added line is a one-line map
entry matching the surrounding style. CI will confirm.
2026-07-28 21:47:42 -05:00