9bc698d23da2221c53b571c889b6d24bb40a3fe8
25948
Commits
| Author | SHA1 | Message | Date | |
|---|---|---|---|---|
|
|
9bc698d23d | Add note that Windows supports 1 proxied cert per profile (#49010) | ||
|
|
69fa5ca435 |
Fix VPP/in-house app install on manual-profile BYOD iOS hosts (#48879) (#48916)
**Related issue:** Resolves #48879 # Checklist for submitter - [x] Changes file added for user-visible changes in `changes/`. - [x] Input data is properly validated, `SELECT *` is avoided, SQL injection is prevented (parameterized queries only). - [x] If paths of existing endpoints are modified without backwards compatibility, checked the frontend/CLI for any necessary changes — N/A, no endpoint/path changes. ## Summary Installing an App Store (VPP) or in-house app on an iOS/iPadOS host enrolled via the **manual (profile-driven) BYOD** enrollment profile failed: Fleet routed the install down the **Account-Driven User Enrollment (user-scoped)** licensing path, tried to look up/register a VPP user keyed on the host's Managed Apple ID, and returned _"Fleet hasn't received a Managed Apple ID for this host yet."_ — which never resolves, because a device-channel host has no Managed Apple ID. ### Root cause The device-vs-user licensing decision keyed off `host_mdm.is_personal_enrollment`. That flag is set for **both**: - **Account-Driven User Enrollment** — user channel, backed by a Managed Apple ID → user-scoped licensing (correct). - **Manual-profile BYOD** — device channel, no Managed Apple ID → must install **device-scoped**, exactly like company-owned manual enrollment. ### Fix Branch on the actual enrollment **channel** — the presence of a user-channel `nano_enrollments` row (`type='User' AND enabled=1`), the same signal the MDM profile reconcile cron already uses (`GetNanoMDMUserEnrollment`). This is timing-robust: the user nano-enrollment exists from enrollment time, whereas the Managed Apple ID only arrives minutes later via `TokenUpdate` (so `managed_apple_id` emptiness is deliberately **not** used as the discriminator). Three sites updated: | File | Change | |---|---| | `ee/server/service/software_installers.go` | `InstallVPPAppPostValidation` routes on `GetNanoMDMUserEnrollment` instead of `is_personal_enrollment` | | `server/datastore/mysql/vpp.go` | InstallApplication builder derives `IsUserEnrollment` (ChangeManagementState omission) from a user-channel `nano_enrollments` row | | `server/datastore/mysql/activities.go` | same, for in-house `.ipa` installs | ## Testing - [x] Added/updated automated tests: - `ee/server/service`: `TestInstallVPPAppPostValidation_AssociateAssetsRouting` — added a regression subtest asserting manual-profile BYOD (personal flag set, device channel) routes via `serialNumbers` and performs **no** VPP user lookup; repointed routing to the user-channel signal. - `server/datastore/mysql`: new `TestVPP/VPPInstallEnrollmentChannelRouting` — manual BYOD includes `ChangeManagementState` despite `is_personal_enrollment=1`; account-driven User Enrollment omits it. - [x] Automated tests simulate multiple hosts and test for host isolation (two distinct hosts, device- vs user-channel). - [ ] QA'd all new/changed functionality manually — pending (draft). For unreleased bug fixes in a release candidate: - [x] Confirmed that the fix is not expected to adversely impact load test results (adds one indexed lookup per install enqueue; removes a `host_mdm` join). ## Database migrations - N/A — no schema changes. The fix reads existing `nano_enrollments` rows. ## fleetd/orbit/Fleet Desktop - N/A <!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit * **Bug Fixes** * Fixed app installation for manually enrolled BYOD iPhone and iPad devices so App Store and in-house apps install correctly on the device. * Improved enrollment handling so device-scoped installs no longer fail when a device is marked personal in one place but uses device-channel enrollment. * Account-Driven User Enrollment continues to use user-scoped licensing and installs. <!-- end of auto-generated comment: release notes by coderabbit.ai --> |
||
|
|
9dd76b5b96 |
Dedupe connect guide (#48990)
While reviewing this guide with `customer-cisneros-a`, we noticed a duplicated section. It also looks like there was a link that needed an update. |
||
|
|
89e653ce2b |
Update Windows MDM end user experience language (#47635)
**Related issue:** Resolves #43379 # Checklist for submitter - [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 <!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit * **Style** * Updated Windows MDM enrollment option labels from “Automatic/Manual” to “Fleet agent-driven/End user-driven” and refreshed the related on-page description/help text. * Adjusted radio help-text spacing and added styling for label formatting on the Windows MDM settings page. <!-- end of auto-generated comment: release notes by coderabbit.ai --> |
||
|
|
91000c1aab |
Add instructions for iOS sysdiagnose (#48930)
This adds a section with instructions on collecting and exporting the sysdiagnose logs from an iOS or iPadOS device without having to use Feedback Assistant, or Apple Configurator. Closes #48929 |
||
|
|
e1094096af |
Surface proxied Windows SCEP certificate failures (#45550) (#48842)
Windows configuration profiles that Fleet proxies SCEP for previously reported "verified" as soon as the device acknowledged the SyncML Exec command, even when the asynchronous SCEP exchange later failed and no certificate was ever issued. - Proxied SCEP profiles (custom SCEP proxy, NDES) now move to "verifying" on the device ACK and only reach "verified" once Fleet observes the matching certificate on the host, keyed by the renewal-ID marker (fleet-<profile_uuid>) in the certificate CN/OU. - When Fleet's SCEP proxy observes an upstream CA error during PKIOperation, it marks the profile "failed" with a detail naming the operation and upstream status. If the device's own retry later succeeds, the observed certificate flips the profile to "verified". - Unconfirmed profiles stay "verifying" (offline host, agent that cannot enumerate certificates, empty store, or a user-scoped profile before the user logs in); absence is never treated as failure. <!-- Add the related story/sub-task/bug number, like Resolves #123, or remove if NA --> **Related issue:** Resolves #45550 Demo: https://www.youtube.com/watch?v=WNGuFdeBmzA Docs: https://github.com/fleetdm/fleet/pull/48933/changes # 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. - [x] Timeouts are implemented and retries are limited to avoid infinite loops ## 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 ## Summary by CodeRabbit * **New Features** * Added Windows SCEP failure tracking with clearer, categorized detail when upstream operations fail. * Added reconciliation backstops for “stuck” proxied SCEP profiles, including automatic recovery to verified when the expected certificate is observed. * **Bug Fixes** * Prevented proxied Windows SCEP installs from being marked “verified” until matching certificate evidence arrives. * Improved classification and persistence behavior for timeouts, connection/DNS issues, and HTTP error responses without disturbing existing retry state. * **Tests** * Expanded Windows SCEP scenarios to cover reconciliation, skipping conditions, and error classification. <!-- end of auto-generated comment: release notes by coderabbit.ai --> |
||
|
|
00d7f4b63a |
Apply house article format to 17 articles (#48992)
<!-- Add the related story/sub-task/bug number, like Resolves #123, or remove if NA --> **Related issue:** NA ## Summary Applies Fleet's article-formatting house style to 17 articles. Content/prose only — no code, config, or schema changes. Each article now follows the house structure: sentence-case `# Title`, italic dek, **Key takeaways** (5–6 outcome-first bullets placed above the fold), a post-takeaways CTA button, a tightened two-paragraph intro, a terminology sweep (customer-facing "osquery" → "Fleet's agent"/"fleetd", sentence-case headings), de-duplication, and format trimming. Detection-pack SQL, IOC/reference tables, and code blocks were left intact. All `<meta>` tags (including `category` values) and author fields were preserved unchanged. Articles updated: - shadow-ai-is-already-on-your-fleet - clickfix-copy-paste-fleet-detection-pack - shadow-earth-053-fleet-detection-pack - microsoft-is-rotating-every-windows-pcs-secure-boot-keys - pre-cve-threat-response-with-fleet - managing-linux-desktops-with-gitops - patch-management-and-vulnerability-reporting-for-linux-desktops - managing-linux-desktop-drift - linux-desktop-inventory-and-visibility - zero-trust-endpoint-security - natural-language-endpoint-security-fleet-mcp - detecting-the-mini-shai-hulud-npm-supply-chain-worm-with-fleet - security-compliance-automation - gitops-for-device-management - endpoint-management-mixed-platform - enterprise-device-management-2026 - what-is-device-attestation ## Claims flagged for human review before publishing **Content issues to reconcile:** - `detecting-the-mini-shai-hulud`: internal number conflict — intro/IOC say "175 additional packages", SQL section says "133 additional packages across 322 versions". Left as-is; pick one. - `linux-desktop-inventory-and-visibility`: "IdP group" was removed as a label type (couldn't confirm). Fleet does support IdP/SSO-group labels — likely should be restored. - `shadow-earth-053`: an ambiguous "17 validated queries" count was removed (15 numbered queries, some with two statements). Re-add a number if desired. **Claims softened for honesty (revert only if the stronger version can be backed):** - `managing-linux-desktops-with-gitops`: two absolute "only MDM/only platform with native GitOps" claims softened. - `gitops-for-device-management`: unverifiable "up to three retry attempts" number dropped; confirm CIS policies are Premium-gated. - `endpoint-management-mixed-platform`: "enforces OS updates across every supported platform" → "major platforms" (excludes Linux/ChromeOS); confirm Entra conditional-access "macOS and Windows" scope. **Specifics to confirm against fleetdm.com/tables or docs:** - `shadow-ai`: `mcp_listening_servers` table, `vscode_edition` column, MCP-client support list. - `clickfix`: agent-option flags, `powershell_events.cosine_similarity`, `es_process_events` columns, XProtect Remediator min macOS version. - `shadow-earth-053`: schema notes and author-hosted download links. - `microsoft-secure-boot-keys`: Microsoft cert-expiry dates / Event IDs (author-supplied). - `natural-language-endpoint-security-fleet-mcp`: fleet-mcp tool inventory (third-party repo); CTA points to the external `github.com/karmine05/fleet-mcp`. # Checklist for submitter - [x] No user-visible product changes; content/articles only (no `changes/` file required). - [x] QA'd rendered structure: each article has one `# Title`, dek, single Key takeaways section, and one CTA button; code blocks and tables preserved. |
||
|
|
cacd7308af |
Add missing FMA icons for software catalog (#48995)
<!-- Add the related story/sub-task/bug number, like Resolves #123, or remove if NA --> **Related issue:** NA ## Summary Several Fleet-maintained apps were showing the generic fallback icon on the [fleetdm.com software catalog](https://fleetdm.com/software-catalog). The website resolves icons by slug (`app-icon-<slug>-60x60@2x.png`) with no reuse map, so each app needs its own PNG file — and these were missing. - **Amazon Corretto 11 / 17 / 8 / JRE 8** — added website PNGs reusing the shared Java "Duke" logo. (Already reuse `AmazonCorretto21` via the frontend icon map, so no frontend change.) - **AWS Session Manager Plugin** — added website PNG reusing the AWS CLI icon. (Already reuses `AwsCli` via the frontend map.) - **Amazon Redshift ODBC Driver** — had no icon on either surface. Added a new frontend icon component + map entry (official AWS Redshift icon) and the website PNG. Icons generated via `tools/software/icons/generate-icons.sh`. The duplicate-PNG-per-slug approach matches the existing catalog convention (e.g. `postgresql-15/16/17/18`, `python-3.13/3.14`, `azul-zulu-25-jdk/jre`). # Checklist for submitter - [ ] QA'd all new/changed functionality manually |
||
|
|
7cb7a162b0 | Fleet UI: Policy details page labels/automations use TruncatedTextList (#48977) | ||
|
|
0a3d73a732 |
Updated osquery perf for #45550 (#48935)
<!-- Add the related story/sub-task/bug number, like Resolves #123, or remove if NA --> **Related issue:** Resolves #45550 # 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** * Enhanced Windows MDM SCEP certificate simulation to track issued certificate specs per host during check-ins. * **Bug Fixes** * Certificate data generation is now stably ordered and consistent across refreshes. * SCEP certificate processing now ignores failed installs (no certificate) and records only valid issued cert details. * **Testing** * A small subset of simulated agents may withhold one SCEP certificate to exercise verification edge cases. <!-- end of auto-generated comment: release notes by coderabbit.ai --> |
||
|
|
087e67644d |
Fix misspelled bootstrap-package article filename (#48833)
<!-- Add the related story/sub-task/bug number, like Resolves #123, or remove if NA --> **Related issue:** NA # Checklist for submitter - [x] QA'd all new/changed functionality manually ## Summary - Renamed `articles/manage-boostrap-package-with-gitops.md` to `articles/manage-bootstrap-package-with-gitops.md` to fix the "boostrap" typo (article title/content were already spelled correctly). - Added a 301 redirect in `website/config/routes.js` from the old misspelled URL (`/guides/manage-boostrap-package-with-gitops`) to the corrected URL (`/guides/manage-bootstrap-package-with-gitops`). - Updated the two internal links that pointed at the misspelled URL, in `articles/enroll-macbook-neo-at-scale-with-fleet-zero-touch.md` and `handbook/marketing/marketing-assets.md`. ## Testing - [x] QA'd all new/changed functionality manually — verified the redirect rule matches the existing pattern used for other renamed `/guides/*` pages in `website/config/routes.js`. <!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit * **Bug Fixes** * Added a redirect for a misspelled guides URL so visitors are sent to the correct page automatically. * Improved navigation reliability for the affected guide link without changing any other routes. <!-- end of auto-generated comment: release notes by coderabbit.ai --> |
||
|
|
f24af180c0 |
Add Windows FMAs (letter C): 13 apps (#48969)
**Related issue:** N/A — part of the Windows Fleet-maintained apps catalog expansion (letter C batch; follows #48872, #48881, #48950). Adds seventeen new Windows Fleet-maintained apps: | App | winget package | Installer | Notes | |-----|----------------|-----------|-------| | Advanced Installer | `Caphyon.AdvancedInstaller` | MSI, machine, x64 | Versioned ARP name ("Advanced Installer 23.8") → fuzzy match. | | Certify The Web | `CertifyTheWeb.CertifySSLManager` | Inno, machine, x64 | ARP name is "Certify Certificate Manager version 7.1.0.0" (product renamed at v7) → fuzzy on "Certify Certificate Manager". | | Chatbox | `Bin-Huang.Chatbox` | NSIS (electron-builder), machine, x64 | `/allusers /S`; custom exists query excludes the separate Chatbox Community Edition; uninstall matches `Chatbox [0-9]*`. | | Citrix Workspace | `Citrix.Workspace` | Vendor bootstrapper EXE, machine, x86 universal | ARP name "Citrix Workspace \<YYMM\>" → fuzzy. Uninstall runs the registered TrolleyExpress with `/uninstall /cleanup /silent`; 3010 treated as success. See "not added" for the LTSR caveat. | | CPU-Z | `CPUID.CPU-Z` | Inno, machine | `installer_locale` pinned to en-US (manifest also carries zh-CN); `/ALLUSERS` added to Inno switches; versioned ARP name → fuzzy. | | CodeMeter Runtime Kit | `Wibu-Systems.CodeMeterRuntimeKit` | Vendor bootstrapper embedding MSI, x64 | `installer_scope: ""` (manifest declares no scope; embedded MSI is per-machine). Install `/q /nosplash /ComponentArgs "*":"/quiet /norestart"`; uninstall via msiexec by ARP name prefix. Identity verified by carving the embedded MSI. | | ClipboardFusion | `BinaryFortress.ClipboardFusion` | Inno, machine, x64 | ARP name carries a locale-dependent "(64-bit)" suffix → fuzzy pattern `ClipboardFusion%`; `/LAUNCHAFTER=0` prevents post-install launch. | | CloudShow | `BinaryFortress.CloudShow` | Inno, machine, x64 | Same Binary Fortress framework; ARP name "CloudShow Launcher (64-bit)" is framework-inferred (no third-party corroboration exists) — the CI validator is the confirmation. | | ClockAssist | `ClockAssist.ClockAssist` | MSI, machine, x64 | Latest-pointer URL but actively maintained manifest (bot replaces the single version dir ~6-weekly) → `ignore_hash`. | | Crestron AirMedia | `Crestron.AirMedia` | MSI, machine, x86 | ARP name is "Crestron AirMedia Machine-Wide Installer" (Teams-style per-user stamping); identity from msiinfo. | | Crestron AirMedia Peripherals | `Crestron.AirMediaPeripherals` | MSI, machine, x64 | Clean MSI. LaunchCondition fails install (1603) on hosts with a pending reboot — noted. | | CrisisGo | `CrisisGo.CrisisGo` | InstallShield Basic MSI, machine, x86 | Custom install script passes `ISSETUPDRIVEN=1` to defuse the "must run setup.exe" guard (vendor ships this bare MSI for network deployment; winget sandbox validates it). | | Cyberduck CLI | `Iterate.CyberduckCLI` | MSI, machine, x64 | Clean WiX MSI. winget lags the vendor by ~4 releases, but pinned URLs stay live, so installs work — just not bleeding-edge. | | Cisco Webex Recorder and Player | `Cisco.WebexRecorderAndPlayer` | InstallShield MSI, machine, x86 | Legacy WRF player but actively updated by Cisco (8 winget bumps in 10 months); latest-pointer URL → `ignore_hash`. | | Creative Force Kelvin | `CreativeForce.Kelvin` | WiX MSI, machine, x64 | Manifest offers per-user NSIS, machine NSIS, and MSI — the MSI is selected (unversioned ARP name "Kelvin"). | | Creative Force Triad | `CreativeForce.Triad` | NSIS (electron-builder), machine, x64 | `/allusers /S`; versioned ARP name → fuzzy. | | Cube Browser | `RystadEnergy.CubeBrowser` | WiX burn bundle, machine, x64 | Bundle Arp manifest carved from the installer ("Cube Browser (64 bit)"); dual-mode uninstall (prefers bundle entry, msiexec fallback) since bundle + chained MSI may both register the same name. | Considered but **not** added (recorded in the workstream tracker): - **Citrix Workspace app LTSR** (`Citrix.Workspace.LTSR`): the LTSR and current tracks register the **identical** ARP key (`CitrixOnlinePluginPackWeb`) and the same "Citrix Workspace \<YYMM\>" DisplayName with no LTSR marker — the only discriminator is a registry value outside the programs table, so Fleet inventory cannot tell the tracks apart. An LTSR FMA would cross-match current-release installs (and vice versa). **Consequence for the shipped Citrix Workspace FMA:** hosts running LTSR will match it and may show "update available" toward the current release — flagged here for reviewer judgment. - **Charles** (`XK72.Charles`): all winget 5.x manifests are per-user MSIX only. The vendor ships a machine-scope MSI for 5.2 but it isn't indexed in winget; revisit if the manifest adds it. - **Calibrite Profiler** (`Calibrite.PROFILER`): abandoned winget manifest — one version dir ever while the vendor is five releases and a major version ahead. - **Cloud Drive Mapper** (`IAMCloud.CloudDriveMapperV3`): latest-pointer URL whose manifest SHA is already stale, and the MSI sets `ARPSYSTEMCOMPONENT=1`, hiding the ARP entry from inventory entirely. - **CloudCompare** (`CloudCompare.CloudCompare`): registry DisplayVersion (and the winget PackageVersion itself) embed a parenthetical date — "2.13.2 (07-06-2024)" — which breaks version comparison; manifest also stale. - **Classic Shell** (`IvoSoft.ClassicShell`): development ended in 2017; superseded by Open-Shell. (CutePDF Writer was already deferred in the letter A batch.) Identities verified per app (msiinfo Property tables; burn bundle Arp manifests carved from installers; AppxManifest/electron-builder sources; uninstall-database corroboration). SHAs verified against manifests for pinned URLs; `ignore_hash` used only where the manifest is demonstrably actively maintained. Icons via `tools/software/icons/generate-icons.sh`; the pre-existing CitrixWorkspace icon component is reused untouched. # 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 - [ ] QA'd all new/changed functionality manually (relying on the FMA CI validator for Windows install/uninstall validation) |
||
|
|
4449830add |
Fix lint for linux only code (#48962)
- [X] QA'd all new/changed functionality manually
Fixes:
```
make lint-go
[...]
orbit/pkg/luks/snapd_client.go:21:7: const snapdSocketPath is unused (unused)
const snapdSocketPath = "/run/snapd.socket"
^
orbit/pkg/luks/snapd_client.go:46:6: func newSnapdClient is unused (unused)
func newSnapdClient() *snapdClient {
^
orbit/pkg/luks/snapd_fde.go:62:6: func newSnapdSocketFDE is unused (unused)
func newSnapdSocketFDE() *snapdSocketFDE {
^
```
<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit
* **Bug Fixes**
* Improved Linux-specific handling for recovery-key and snapd
interactions.
* Added fallback behavior when an existing keyslot causes a conflict, so
recovery-key setup can still complete successfully.
* Better surfaces error messages from failed snapd requests.
* **Tests**
* Added Linux-only tests covering synchronous and asynchronous snapd
request flows.
* Added coverage for recovery-key creation, polling, fallback
replacement, and error responses.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
|
||
|
|
4c6aa754e0 |
Time ago timestamps: use days instead of months when under 90 days (#48964)
<!-- Add the related story/sub-task/bug number, like Resolves #123, or remove if NA --> **Related issue:** Resolves #46965 Relative "time ago" timestamps switched to months at ~30 days, so a timestamp 45 days ago read "about 2 months ago" (even 89 days showed "3 months ago"). This centralizes the day/month cutoff in a new `timeAgo` helper and routes existing call sites through it, so anything under 90 days is shown in days. # 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** * Relative “time ago” timestamps now keep values in **days** for items under **90 days**, switching to **months** later for more accurate wording. * Improved consistency of relative time labels across status modals, activity feeds, host details, and management screens (including “last updated,” “uploaded,” and “added” text). * **Tests** * Added/updated coverage for the shared relative-time cutoff and formatting behavior to prevent regressions. <!-- end of auto-generated comment: release notes by coderabbit.ai --> |
||
|
|
6d1938b914 |
Fix test setting flag that caused further tests to fail (#48947)
<!-- Add the related story/sub-task/bug number, like Resolves #123, or remove if NA --> **Related issue:** Resolves # Moves `TestInstallAllSelfServiceSoftware` from the enterprise integration suite (`TestIntegrationsEnterprise`) to the MDM integration suite (`TestIntegrationsMDM`), because setting the `MDM.EnabledAndConfigured` flag in the enterprise suite was leaking into and failing other tests (`TestLinuxDiskEncryption`, `TestTeamEndpoints`, `TestTeamSpecs`, `TestMDMNotConfiguredEndpoints`, `TestVPPAppsWithoutMDM`, `TestOrbitSetupExperienceStatusChecksAuthBeforeMDM`). # Checklist for submitter ## 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 - checking this to avoid a CI failure, but there is nothing to actually manually check <!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit * **Tests** * Expanded integration coverage for self-service software installs across team, label, category, and multi-host scenarios. * Added checks for install ordering, idempotency, queue consistency, and concurrent requests. * Included coverage for VPP-backed apps and mixed install queues to better validate real-world behavior. <!-- end of auto-generated comment: release notes by coderabbit.ai --> |
||
|
|
5b2a1b9de0 |
fleet-mcp: use /fleets endpoints instead of legacy /teams (#48791)
<!-- Add the related story/sub-task/bug number, like Resolves #123, or remove if NA --> **Related issue:** Relates to #43544 The Fleet MCP calls the legacy `/api/v1/fleet/teams` routes for fleet and policy lookups. Fleet's current API endpoints catalog only lists the renamed `/fleets` routes, so an endpoint-restricted api-only user cannot be granted `/teams` and those calls return 403. This switches the MCP to the `/fleets` paths, which return the same response shape, so fleet resolution and per-fleet policy compliance work under a least-privilege token. Verified against a running Fleet. ## 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** * Team-related Fleet data now loads from the correct service endpoints, improving policy and compliance views. * Policy listings and policy detail checks for teams should now return the expected results. * Updated test coverage to match the revised Fleet route behavior. <!-- end of auto-generated comment: release notes by coderabbit.ai --> |
||
|
|
003ab766d3 |
Filter cross-team memberships from user list responses (#48890)
From Lucas:
- [X] QA'd all new/changed functionality manually
## Summary
A team-scoped admin listing users of a team they administer (`GET
/api/latest/fleet/users?team_id=A`) received the full team membership —
team IDs, names, and roles — of any user also shared with other teams,
disclosing teams the requester has no role in.
The single-user `GET /users/{id}` endpoint already blocks this: its
authorization requires the requester to administer *every* team the
target belongs to. The list endpoint authorizes against a synthetic
single-team object (correct, so team admins can manage their members),
but then returned each user's complete team list as loaded by the
datastore.
This filters each returned user's teams down to the requester's scope at
the response layer. Requesters with any global role are unchanged
(they're authorized to see all teams).
## Why the response layer, not `Service.User`
`ModifyUser` and the password-reset flow reuse `Service.User` and read
`user.Teams` to compute write diffs. Filtering there would silently drop
team memberships on edits, so the filter is applied in
`listUsersEndpoint` only.
`GET /users/{id}` is intentionally not changed — it is not exploitable
(authz already requires admin-of-all-the-target's-teams), and its
legitimate readers should keep seeing the full team list.
## Testing
- `TestListUsersFiltersTeamsToRequesterScope` — team-1 admin listing
team 1 sees only team 1 for a user shared with {1,2}.
- `TestListUsersGlobalRequesterSeesAllTeams` — global admin sees all
teams.
- Existing `TestUserAuth` / `TestAuthorizeUser` pass unchanged (no authz
regression).
Fixes fleetdm/confidential#16691
🤖 Generated with [Claude Code](https://claude.com/claude-code)
<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit
* **Bug Fixes**
* Fixed user listing so returned team membership details are scoped to
the requesting user’s permissions, including fleet-scoped context.
* Team-scoped requesters now only see memberships for teams they’re
allowed to view; global-role requesters still see all memberships.
* When scoped viewer context is missing, team membership details are no
longer included in the response.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
---------
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Co-authored-by: Lucas Manuel Rodriguez <lucas@fleetdm.com>
|
||
|
|
c759f92f14 |
Include mobile hosts by default in "Hosts online" chart (#48769)
**Related issue:** Resolves #47661 # Checklist for submitter - [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 <!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit * **New Features / Improvements** * The “Hosts online” chart now includes mobile platforms (iOS/iPadOS/Android) by default, alongside desktop platforms. * **Bug Fixes** * Initial load no longer shows a default “Filtered” badge; the chart reflects the full default platform selection. * **Documentation** * Updated the “Hosts online” tooltip to clarify how locked iOS/iPadOS, lid-closed Mac, and locked Android states affect the online count. * **Tests** * Updated chart card tests to match the new default platform behavior and initial chart request parameters. <!-- end of auto-generated comment: release notes by coderabbit.ai --> |
||
|
|
360789913a |
Add icon for Okta Advanced Server Access macOS FMA (#48956)
<!-- Add the related story/sub-task/bug number, like Resolves #123, or remove if NA --> The Okta Advanced Server Access macOS Fleet-maintained app had no icon — the Fleet UI fell back to the generic package icon, and the fleetdm.com software catalog used the fallback icon. The icon was extracted from the vendor's `ScaleFT.app` bundle inside `ScaleFT-1.108.0.pkg` (downloaded from the URL in `ee/maintained-apps/outputs/okta-advanced-server-access/darwin.json`; SHA-256 verified against the manifest) and generated with `tools/software/icons/generate-icons.sh`: - `frontend/pages/SoftwarePage/components/icons/ScaleFt.tsx`: new icon component. - `frontend/pages/SoftwarePage/components/icons/index.ts`: two map entries — `"okta advanced server access"` (matches the FMA list name) and `"scaleft"` (matches host inventory, since the app's `CFBundleName` is `ScaleFT` and there is no `CFBundleDisplayName`). - `website/assets/images/app-icon-okta-advanced-server-access-60x60@2x.png`: 128×128 PNG for the fleetdm.com software catalog (filename follows the `app-icon-<slug>` convention used by `build-static-content.js`). # 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 <!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit * **New Features** * Added a new software icon for ScaleFT/Okta Advanced Server Access. * The icon now appears automatically when those software names are recognized in the app. <!-- end of auto-generated comment: release notes by coderabbit.ai --> |
||
|
|
c92b848919 |
Return to previous page when the last policy on a page is deleted (#48683)
**Related issue:** Resolves #48641 ## Description Deleting the only policy on a paginated page (e.g., 21 policies, with 1 on page 2) left the user stranded on a now-empty page showing the "No policies" empty state. The policies list now steps back to the previous page when a delete empties the current page. **Before:** delete last policy on page 2 → empty state. **After:** delete last policy on page 2 → list returns to page 1. ### Screen recording demonstrating the fix https://github.com/user-attachments/assets/ae106a50-7f9b-4080-a19c-53e0c60fff48 # 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. - [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] 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** * Server-side paginated tables now recover from empty states after deleting the last row on a page by redirecting to the last page that still has data. * Improved empty-state pagination handling for out-of-range pages, loading states, and cases where the total row count is known (including zero), avoiding unnecessary or repeated navigation. * Simplified the empty-state pagination UI to render only the empty component. * **Tests** * Expanded regression test coverage for server-side pagination edge cases and page-correction behavior to prevent future regressions. * **Style** * Removed unused empty/previous-button styling rules in the table container. <!-- end of auto-generated comment: release notes by coderabbit.ai --> |
||
|
|
496d4f5e24 | Controls > OS settings > Certificates: View certificates (#48460) | ||
|
|
2708df6f40 |
Add Windows FMAs (letter B): 5 apps (#48950)
**Related issue:** N/A — part of the Windows Fleet-maintained apps catalog expansion (letter B batch; follows #48872 and #48881). Adds six new Windows Fleet-maintained apps: | App | winget package | Installer | Notes | |-----|----------------|-----------|-------| | BandiView | `Bandisoft.BandiView` | EXE (NSIS-style), machine, x64 | Unversioned InstallerUrl → `ignore_hash` (URL verified to serve the binary reliably without Referer tricks). DisplayName "BandiView" stable across releases. | | BleachBit | `BleachBit.BleachBit` | EXE (NsisMultiUser), machine, x86 | Install script passes the case-sensitive `/allusers /S` — without `/allusers` the NsisMultiUser installer's scope is ambiguous. winget declares a VCRedist 2010 x86 dependency Fleet can't satisfy; noted as a caveat. | | Bulk Crap Uninstaller | `Klocman.BulkCrapUninstaller` | EXE (Inno), machine, x86 | ARP DisplayName is versioned ("BCUninstaller 6.2.0.0") and never matches the friendly name, so `unique_identifier` "BCUninstaller" + `fuzzy_match_name`. Registry version is 4-part vs winget's "6.2" — `version_compare` pads, verified consistent. | | BrowserStackLocal | `BrowserStack.BrowserStackLocal` | MSI (WiX), machine, x64 | Clean MSI (ALLUSERS=1, identity verified via msiinfo). Unversioned InstallerUrl → `ignore_hash`. | | Burp Suite Professional | `PortSwigger.BurpSuite.Professional` | EXE (install4j), machine, x64 | Mirrors the existing Burp Suite Community FMA: `-q -Dinstall4j.suppressUnattendedReboot=true` plus the load-bearing `-dir` into Program Files (install4j defaults to per-user otherwise). DisplayName is versioned **without** "Edition" ("Burp Suite Professional 2026.3.3"), unlike Community — fuzzy pattern `Burp Suite Professional %` can't collide with Community's. | | Bytello Share | `Bytello.BytelloShare` | EXE (NSIS), machine, x86 | Uses the nullsoft `agent=d` variant whose ARP identity ("Bytello Share" / publisher "Bytello Share") matches real-world inventory; the zip variant registers a different name ("BytelloShare") and its nested-MSI path is version-pinned and already stale. Vendor URL is a latest-pointer already ahead of winget → `ignore_hash`. **Note:** the input says `installer_type: "msi"` — the ingester classifies this nullsoft entry as msi because its URL has no file extension (vendor-type → URL-extension → machine-scope fallback chain in `ingester.go`); the custom scripts handle the actual NSIS exe. | Considered but **not** added (recorded in the workstream tracker): - **Bambu Studio** (`Bambulab.Bambustudio`): the uninstaller shows a keep-user-data confirmation dialog even with `/S` (deployment guides work around it with Send-Keys, impossible in a SYSTEM session) — same failure class that disqualified Adobe AIR in the letter A batch. - **Bridge Designer** (`StephenRessler.BridgeDesigner`): installer URL 404s (file removed from SourceForge) and the desktop product was discontinued July 1, 2026 in favor of a browser-based edition. - **BurnAware Free** (`Burnaware.BurnAwareFree`): the vendor deletes each old release URL — the winget-pinned installer already redirects to their homepage, so pinned downloads break every release cycle. Registry identities were verified per app (msiinfo Property tables for MSIs; vendor installer sources, winget AppsAndFeaturesEntries, and uninstall-database corroboration for EXEs). Installer SHAs verified against manifests where URLs are version-pinned; unversioned URLs use `ignore_hash` per the TeamViewer/Chrome precedent. Icons generated via `tools/software/icons/generate-icons.sh`. # 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 - [ ] QA'd all new/changed functionality manually (relying on the FMA CI validator for Windows install/uninstall validation) |
||
|
|
08c22ebe58 |
Install Okta Verify on Windows workstations via Fleet-maintained app (#48952)
**Related issue:** N/A (dogfood GitOps change) # Checklist for submitter If some of the following don't apply, delete the relevant line. - [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 (YAML validated; will verify install + patch policy on a Windows workstation after the GitOps run applies) ## Details Adds Okta Verify to Windows devices on the Workstations team following the same pattern used for it on macOS, including the patch policy: - Replaces the custom-package Okta Verify install (`$DOGFOOD_OKTA_VERIFY_WINDOWS_URL` + custom install/uninstall scripts) with the `okta-verify/windows` Fleet-maintained app — `self_service: true`, `setup_experience: true`, category Security, scoped to "x86-based Windows hosts" (the FMA installer is x86-only). - Adds a "Windows - Okta Verify up to date" patch policy with `install_software: true` for automatic remediation, mirroring the macOS policy. - Adds the "x86 Windows hosts with Okta Verify installed" label that scopes the patch policy to hosts that already have the app. - Cleanup: deletes the now-orphaned custom package YAML and `okta_verify_*.ps1` scripts. Follow-up (not in this PR — requires `workflow` scope): remove the now-unused `DOGFOOD_OKTA_VERIFY_WINDOWS_URL` env line from `.github/workflows/dogfood-gitops.yml` and delete the GitHub secret. Harmless in the meantime — the env var is exported but nothing consumes it. Hosts that installed Okta Verify from the old custom package are picked up by the new label, and the patch policy will auto-update them to the FMA version (currently 6.10.2.0) if they fall behind. |
||
|
|
cb09b42985 |
User must be logged in for Windows MDM enrollment (#48932)
<!-- Add the related story/sub-task/bug number, like Resolves #123, or remove if NA --> **Related issue:** Resolves #46302 --------- Co-authored-by: melpike <79950145+melpike@users.noreply.github.com> |
||
|
|
9587374d20 |
Website: Add convenience redirect for typos: Update routes.js (#48831)
<!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit * **New Features** * Added a new redirect so visits to `/gitops-workshops` now go to `/workshops`. <!-- end of auto-generated comment: release notes by coderabbit.ai --> |
||
|
|
2a1f513565 |
Update Fleet-maintained apps (#48936)
Automated ingestion of latest Fleet-maintained app data. <!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit * **Bug Fixes** * Updated several app packages to newer releases, including Adobe DNG Converter, BitBox, Capto, Cursor, Dropshare, Fastmail, GitKraken, GoLand, Google Chrome, Gemini, Krisp, Melodics, Notion, PhpStorm, Postman, Readest, RightFont, Rive, RubyMine, Sequel Ace, TablePlus, Unity Hub, Viscosity, Visual Studio Code, WebStorm, Windows App, and Worksheet Crafter. * Improved some macOS install/uninstall flows to better handle apps that are already running and to clean up leftover preference files. <!-- end of auto-generated comment: release notes by coderabbit.ai --> --------- Co-authored-by: allenhouchins <32207388+allenhouchins@users.noreply.github.com> |
||
|
|
646ebd09e3 |
Remove Zorin from platform for labels (#48937)
Fixing `Zorin OS` incorrectly showing up as platform option for labels. Coming soon we'll have a "Linux" platform for labels (https://github.com/fleetdm/fleet/issues/44088). <!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit * **Bug Fixes** * Removed **Zorin OS** from the platform dropdown, so it is no longer available as a selectable option. <!-- end of auto-generated comment: release notes by coderabbit.ai --> |
||
|
|
19aac451e1 |
Fix Windows CSP bypass issue (#48843)
<!-- Add the related story/sub-task/bug number, like Resolves #123, or remove if NA --> **Related issue:** Resolves #48752 Stacked PR. Needs 48349-windows-modify branch to merge first. # 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. ## 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 ## Summary by CodeRabbit * **Bug Fixes** * Fixed a Windows MDM loophole where scope-less or differently formatted `LocURI` values could bypass Fleet restrictions. * Strengthened detection and enforcement for reserved Windows targets, including OS updates, remote wipe premium gating, and BitLocker restrictions. * Improved `LocURI` handling to be resilient to whitespace and alternate formatting, including more consistent SCEP profile processing. * **Tests** * Added regression coverage for reserved `LocURI` matching, OS-update targeting, and premium detection for wipe commands (including scope-less cases). <!-- end of auto-generated comment: release notes by coderabbit.ai --> |
||
|
|
b6e0cac4ae |
Website retire old success stories (#48921)
Retires old success stories and redirects `/success-stories` to `/customers`. @eashaw, is there anything else / different that needs to be done to retire these old pages? I suspect there will still be some article category artifacts hanging around. <!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit * **Bug Fixes** * Updated story-related redirects so visitors are sent to the customers page instead of older story URLs. * Fixed deprecated device-management “fleet user story” links to land on the customers page. * Adjusted article page metadata and category resolution so the “success stories” category no longer uses the previous titles/descriptions or friendly-name mapping. * **Chores** * Updated static-content build rules for allowed category values and adjusted how certain category URL prefixes are generated. <!-- end of auto-generated comment: release notes by coderabbit.ai --> --------- Co-authored-by: Eric <eashaw@sailsjs.com> |
||
|
|
9463a46c32 |
Fix Windows software ingest lock contention by matching titles on upgrade_code (#48902)
**Related issue:** Resolves #48875 # 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] Added/updated automated tests - [x] 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 For unreleased bug fixes in a release candidate, one of: - [x] Confirmed that the fix is not expected to adversely impact load test results **Functional:** `TestSoftwareTitleUpgradeCodeDriftMatch` (added here): a host reporting a Windows program whose name has drifted from the stored title but shares its `upgrade_code` must resolve to the existing title. Fails on pre-fix code, passes with the fix. **Load:** 25 concurrent hosts × 4 rounds, each reporting 50 drifted programs (sharing the stored `upgrade_code`s) through `UpdateHostSoftware`; doomed inserts counted via the MySQL general log: | concurrent-burst metric | without fix | with fix | |---|---|---| | doomed `INSERT IGNORE INTO software_titles` | 175 | 0 | | `Innodb_row_lock_waits` (Δ) | 715 | 0 | | burst wall time | ~4.9 s | ~0.2 s (~25× faster) | <!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit ## Summary by CodeRabbit * **Bug Fixes** * Improved matching for Windows software programs when the displayed name changes but the upgrade code remains the same. * More reliably reuses existing software titles during ingest, reducing duplicate title entries. * Added a regression test to confirm upgrade-code matches take priority and unknown upgrade codes don’t create false matches. <!-- end of auto-generated comment: release notes by coderabbit.ai --> --------- Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> |
||
|
|
e37017ce0c |
Replace duplicate code with existing getDisplayedSoftwareName helper (#48311)
Follow-up to https://github.com/fleetdm/fleet/pull/46839#discussion_r3475389665. Related to #46921. # Checklist for submitter ## Testing - [x] QA'd all new/changed functionality manually <!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit * **Bug Fixes** * Improved how software names are shown in install status views, so the displayed name now better matches the preferred label. * Added support for host online status when determining install status display and tooltip text, improving the accuracy of status messaging. <!-- end of auto-generated comment: release notes by coderabbit.ai --> |
||
|
|
ace8cf046b |
SAAD: DDM Asset table migration (#48866)
<!-- Add the related story/sub-task/bug number, like Resolves #123, or remove if NA --> **Related issue:** Resolves #48566 # Checklist for submitter If some of the following don't apply, delete the relevant line. - [ ] 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. Coming in bigger backend story. - [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 - [x] If paths of existing endpoints are modified without backwards compatibility, checked the frontend/CLI for any necessary changes ## Testing - [x] Added/updated automated tests - [x] 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 support for tracking Apple declaration assets, including a new asset record and a link table for associating assets with declarations. * Added a new timestamp on declarations to reflect the latest asset update time. * **Bug Fixes** * Strengthened database constraints to prevent duplicate asset entries and enforce valid asset/declaration references. * Improved delete behavior so referenced declarations clean up related links automatically. <!-- end of auto-generated comment: release notes by coderabbit.ai --> |
||
|
|
31a6bb8734 |
Update Fleet-maintained apps (#48920)
Automated ingestion of latest Fleet-maintained app data. <!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit * **Bug Fixes** * Refreshed installer metadata for many maintained apps on macOS and Windows, including AdGuard, Firefox, Docker Desktop, Notion, Zotero, and others. * Updated version checks, download links, and package hashes so the latest app releases are recognized and installed correctly. * Improved cleanup behavior for a few apps’ removal flows. <!-- end of auto-generated comment: release notes by coderabbit.ai --> --------- Co-authored-by: allenhouchins <32207388+allenhouchins@users.noreply.github.com> |
||
|
|
21c11220a7 |
Website: cache workshop details in platform record (#48882)
Closes: https://github.com/fleetdm/fleet/issues/48142 Changes: - Added two new attributes to the website's platform record: `workshopDetails`, an array containing formatted event details to be used on the /workshops page, and `workshopDetailsLastUpdatedAt`, a JS timestamp representing when workshop event details were last retrieved from the EventBrite API - Update the website's bootstrap configuration to create a platform record - Updated the view action for the workshops page to load workshop event details from the database if they were updated less than two hours ago. |
||
|
|
0e2a0f2d05 |
Revise contributor roles and maintainer information (#48834)
Handbook update |
||
|
|
189e7a87e2 |
Website: remove duplicate/unused form-data from the website's package-lock (#48908)
Changes: - Removed the top-level `node-modules/form-data` dependency from the website's package-lock.json. |
||
|
|
4351f4cee5 |
escrow snapd TPM-backed FDE recovery keys from orbit (#48452)
**Related issue:** Resolves #44428 |
||
|
|
57dc28991a |
Add resolved-in-version override for CVE-2025-63389 on Ollama (#48525)
**Related issue:** Resolves #44800 |
||
|
|
0b9ca60e73 | Fleet UI: Restore download button for script-only packages (#48909) | ||
|
|
c21d5fad09 | Fleet UI: 'Latest' pin only shows on Fleet-maintained apps (#48871) | ||
|
|
dfe0f1c871 |
Fix App Store picker 403 for non-admin roles (#48856)
**Related issue:** Resolves #46057 Authorize `GetVPPTokens` against `VPPApp` instead of admin-only `AppleCSR`, so maintainer/technician roles no longer get a 403 that broke the App Store picker. # 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 <!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit * **Bug Fixes** * Fixed the “Add software > App Store” picker so maintainer and technician roles no longer encounter access errors when browsing VPP tokens. * Improved VPP token visibility for team-scoped users by restricting listings to teams they can read, while including “all teams” tokens and excluding unassigned/unauthorized ones. * Ensured users without appropriate access receive the correct authorization response instead of broader token listings. <!-- end of auto-generated comment: release notes by coderabbit.ai --> |
||
|
|
7b950c64a6 |
Add duplicate patch policy check to GitOps (#48896)
<!-- Add the related story/sub-task/bug number, like Resolves #123, or remove if NA --> **Related issue:** Resolves #46193 Adds a client-side check for duplicate patch policies, similar to the existing policy name and label duplicate checks. # 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 Adding two patch policies for the same fma slug results in this error: ``` Error: 1 error occurred: * Couldn't add multiple policies with type "patch" for "fleet_maintained_app_slug": "google-chrome/darwin". ``` <!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit * **New Features** * Added validation to GitOps application checks to prevent multiple patch policies from targeting the same app slug. * Improved error reporting when patch policy slugs are duplicated or missing from the configured app list. * **Bug Fixes** * Prevented duplicate patch policies from being silently accepted, reducing the risk of one policy overwriting another. * Existing valid combinations, such as different patch slugs or certain mixed policy types, continue to work as expected. <!-- end of auto-generated comment: release notes by coderabbit.ai --> |
||
|
|
0b929a1ff1 |
Add Windows FMAs (letter A): 14 apps (#48881)
This pull request adds support for several new Windows applications to the maintained apps catalog, primarily by introducing new JSON manifest files for each app and, in some cases, associated PowerShell install/uninstall scripts. These additions expand the catalog's coverage of productivity, developer, utility, and communication tools, and include detailed installation and uninstallation logic for certain apps. **New application manifests:** * Added JSON manifests for a variety of applications, including but not limited to: Adobe AIR, Agent Ransack, AIMP, Air Explorer, alfaview, Allway Sync, Amazon Corretto (versions 8, 11, 17), Amazon Redshift ODBC Driver, AnyBurn, AnyDesk, AVS Image Converter, AVS Media Player, AWS Session Manager Plugin, Azure Functions Core Tools, CutePDF Writer, and iTunes. Each manifest specifies installation parameters, categories, and (where applicable) custom install/uninstall scripts. [[1]](diffhunk://#diff-891e1b685eea289f7535f5cb3e80299b2d53d22f1ecb4123a6db873b4715d5d3R1-R13) [[2]](diffhunk://#diff-33d1963698285631553094360f1dab939589c853b20b13046aeed9c36b484120R1-R12) [[3]](diffhunk://#diff-48b51963ae1bc8ce2e6d2aa494c7db8df854a0a6f392df70528dc80efb0d4341R1-R12) [[4]](diffhunk://#diff-8177fe092e9e1cc91dd1582d1e4c01b05176d36dbad36ca16397a681aef7c4a5R1-R13) [[5]](diffhunk://#diff-c1fd695df858d34d29653fb1db79c04123bbfcf432726f9356d893c7bc4e4b16R1-R11) [[6]](diffhunk://#diff-4024c71281805493b749ec7aa95819583015483d652481954a3dd4d2ba3803e4R1-R10) [[7]](diffhunk://#diff-8ab1198cecc28b2b9b77a8668355fd505524a59d414eb7623e9676794c03511eR1-R11) [[8]](diffhunk://#diff-d8534d1ac84c02c1f87dae2798feae0d03fdb332d19a03fd780c9664c337ce41R1-R11) [[9]](diffhunk://#diff-375f7eb8d9daf96d4952a5f834a4ba5fa272c034ff808b3f21dbd33cf57b7b7eR1-R10) [[10]](diffhunk://#diff-0710c7d70ff8eb04379932f0ffd0b754626381372ef6a747858eb7b51c230723R1-R10) [[11]](diffhunk://#diff-ce4007e90efa1fdfff5c1ca96c8dded2108642a522f30baddcefd9327c23c980R1-R13) [[12]](diffhunk://#diff-9a7ba8c0afb32ab31c2950a4a95847fa1293411416302cd6698dc2bcb519fbfdR1-R13) [[13]](diffhunk://#diff-02ae7cdbe54f1736023e830b66036c6f32e5eec642d888f51c6dcfbbb0bf12d0R1-R14) [[14]](diffhunk://#diff-4d3d9fbb9e19bdf5269ff241fc1549a17b9045a04b0358c988fb81ceb03512e1R1-R14) [[15]](diffhunk://#diff-c22a0370648cd85f36926d2412d10cb46d3f3da4a623ad4595c115496ac6cd41R1-R13) [[16]](diffhunk://#diff-5dfe747ae19dfa1572611d72dc109a8cbfe8b379410c4154627e9d1c699670d1R1-R12) [[17]](diffhunk://#diff-4afa6cde8c52e27d865f759ab7f2aabf5f60522cb8bfe120637a4a954194a237R1-R13) [[18]](diffhunk://#diff-d5ad3e810b587a379fdb2722806be5a0c47eebefad540077db86d356cfd30e17R1-R12) **Custom installation and uninstallation scripts:** * Added PowerShell scripts for silent installation and uninstallation of Adobe AIR, including logic to extract and execute the correct uninstall command from the Windows registry, ensuring a clean and unattended removal process. [[1]](diffhunk://#diff-75bb214bff0533824521c36d0f6ff369ac7848554824f5f44faadc7c7c3225ffR1-R30) [[2]](diffhunk://#diff-e10832f9465648bd3c3055d3ab2bde1d4cb3170db6ede0de0b0dc347ab3077f3R1-R58) These changes improve the breadth and automation capabilities of the maintained apps catalog, especially for environments that require silent and reliable software deployment and removal.…esk, iTunes, Azure Functions Core Tools <!-- Add the related story/sub-task/bug number, like Resolves #123, or remove if NA --> **Related issue:** Resolves # # Checklist for submitter If some of the following don't apply, delete the relevant line. - [ ] 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 - [ ] 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) - [ ] QA'd all new/changed functionality manually For unreleased bug fixes in a release candidate, one of: - [ ] Confirmed that the fix is not expected to adversely impact load test results - [ ] Alerted the release DRI if additional load testing is needed ## Database migrations - [ ] Checked schema for all modified table for columns that will auto-update timestamps during migration. - [ ] Confirmed that updating the timestamps is acceptable, and will not cause unwanted side effects. - [ ] Ensured the correct collation is explicitly set for character columns (`COLLATE utf8mb4_unicode_ci`). ## New Fleet configuration settings - [ ] Setting(s) is/are explicitly excluded from GitOps If you didn't check the box above, follow this checklist for GitOps-enabled settings: - [ ] Verified that the setting is exported via `fleetctl generate-gitops` - [ ] Verified the setting is documented in a separate PR to [the GitOps documentation](https://github.com/fleetdm/fleet/blob/main/docs/Configuration/yaml-files.md#L485) - [ ] Verified that the setting is cleared on the server if it is not supplied in a YAML file (or that it is documented as being optional) - [ ] Verified that any relevant UI is disabled when GitOps mode is enabled ## fleetd/orbit/Fleet Desktop - [ ] 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)) - [ ] If the change applies to only one platform, confirmed that `runtime.GOOS` is used as needed to isolate changes - [ ] Verified that fleetd runs on macOS, Linux and Windows - [ ] Verified auto-update works from the released version of component to the new version (see [tools/tuf/test](../tools/tuf/test/README.md)) |
||
|
|
8e62177d3a |
Add Okta Verify Windows FMA (#48889)
**Related issue:** N/A ## Summary - Add Okta Verify as a Windows Fleet-maintained app using the `Okta.OktaVerify` winget package. - Add custom install/uninstall scripts for the machine-scope WiX Burn installer. - Generate the Windows output manifest and add the Windows catalog entry to `apps.json`. # Checklist for submitter - [x] Input data is properly validated, `SELECT *` is avoided, SQL injection is prevented, and untrusted data interpolated into shell scripts/commands is validated against shell metacharacters. ## Testing - [x] QA'd all new/changed functionality manually - Installed and uninstalled Okta Verify on a Windows host successfully. Validated with: - `python3 -m json.tool ee/maintained-apps/inputs/winget/okta-verify.json` - `python3 -m json.tool ee/maintained-apps/outputs/okta-verify/windows.json` - `python3 -m json.tool ee/maintained-apps/outputs/apps.json` - `go test ./cmd/maintained-apps/... ./ee/maintained-apps/...` - `GOOS=windows go build -o /private/tmp/fleet-maintained-apps-validate.exe ./cmd/maintained-apps/validate/` Additional verification: - Verified the winget manifest for `Okta.OktaVerify` version `6.10.2.0`. - Downloaded the Okta Verify installer and confirmed its SHA-256 matches winget: `065c6ad3ffc8551a29459d6cae4d06cd95a083ef716c18eb2e1215720a6b400a`. <!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit * **New Features** * Added support for installing and uninstalling **Okta Verify** on Windows. * Included app metadata so it appears in the maintained apps catalog. * **Bug Fixes** * Added safer install/uninstall handling, including silent execution, better exit-code handling, and fallback cleanup when standard uninstall entries are missing. * Improved detection of existing installations and out-of-date versions. <!-- end of auto-generated comment: release notes by coderabbit.ai --> |
||
|
|
ceeaf9eea2 |
Add Windows FMAs (digit batch): 3DF Zephyr Free, 4K Video Downloader+ (#48872)
**Related issue:** N/A — part of the Windows Fleet-maintained apps
catalog expansion.
Adds two new Windows Fleet-maintained apps (the "digit" batch of the
Windows FMA workstream):
| App | winget package | Installer | Notes |
|-----|----------------|-----------|-------|
| 4K Video Downloader+ | `OpenMedia.4KVideoDownloaderPlus` | EXE (WiX
burn bundle), machine scope, x64 | Bundle registration extracted from
the installer: ARP `DisplayName` "4K Video Downloader+", `Publisher`
"InterPromo GMBH" (differs from the winget locale publisher "Open Media
LLC", so `program_publisher` is set). Registers TWO ARP entries with the
same DisplayName (the bundle and its chained MSI). The uninstall script
prefers the bundle entry and normalizes msiexec args when only the MSI
entry is present (validator-confirmed). Exact DisplayName matching keeps
it from touching the non-plus product. |
| 3DF Zephyr Free | `3Dflow.3DFZephyr.Free` | EXE (Inno Setup), machine
scope, x64 | Registry DisplayName is versioned ("3DF Zephyr Free version
8.038"), so the input uses `fuzzy_match_name: true`. The paid edition
registers as "3DF Zephyr version X" (no "Free") and is not matched.
Standard Inno silent switches. |
Also considered from this batch but **not** added:
- **4K Video Downloader** (`OpenMedia.4KVideoDownloader`, the classic
4.x app): verified and validated successfully, but intentionally dropped
— it's in maintenance mode and 4K Video Downloader+ is the actively
developed successor, so we're offering only the + app.
- **3DxWare 10** (`3Dconnexion.3DxWare.10`): the vendor bootstrapper
hung for 10 minutes and exited 1 with no output in the validator's
headless SYSTEM session (driver install), so it was dropped after the
first validation run.
- **3CX Desktop App** (`3CX.Softphone`): MSIX with an unversioned
`InstallerUrl` (`.../3CX.msix`) — the file at that URL is already a
newer build (20.0.1162.0) than the manifest's pinned version/SHA
(20.0.1102.0), so installs would fail hash validation. Can be revisited
with `ignore_hash` plus Windows-App-style MSIX provisioning scripts.
Installer SHAs in the outputs were verified against the winget
manifests. Icons generated via `tools/software/icons/generate-icons.sh`;
icon component names were adjusted to valid JS identifiers
(`ThreeDfZephyrFree`, `FourKVideoDownloaderPlus`) following the
`ZeroOneZeroEditor`/`FourK*` precedent.
# 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
- [ ] QA'd all new/changed functionality manually (relying on the FMA CI
validator for Windows install/uninstall validation)
|
||
|
|
156302adb4 |
Fix policy automation activities missing from host activity feed
Closes #48616 Adds missing policy automation activities to host's details page. |
||
|
|
4608e82481 |
Added anonymous usage statistics reporting the number of macOS and Windows hosts enrolled in Fleet's MDM (#48840)
<!-- Add the related story/sub-task/bug number, like Resolves #123, or remove if NA --> **Related issue:** Resolves #48685 # 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. ## Testing - [x] Added/updated automated tests - [x] QA'd all new/changed functionality manually - Tested `ShouldSendStatistics` method manually against our DB, which covers all our changes. <!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit ## Summary by CodeRabbit * **New Features** * Added anonymous usage statistics for the number of macOS and Windows hosts currently enrolled in Fleet’s MDM. * **Bug Fixes** * Improved statistics accuracy by counting only actually enrolled, non-server macOS and Windows hosts that are using Fleet’s MDM. * **Tests** * Updated and extended statistics tests to verify the new enrollment counts are computed and reported correctly. <!-- end of auto-generated comment: release notes by coderabbit.ai --> |
||
|
|
2d64dccd79 | Fleet UI: Fix ManageSoftwareAutomationsModal test type errors (#48878) | ||
|
|
4c79d6bddd |
Add user-scoped declaration support (#48796)
<!-- Add the related story/sub-task/bug number, like Resolves #123, or remove if NA --> **Related issue:** Resolves # # 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. - [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 - [x] If paths of existing endpoints are modified without backwards compatibility, checked the frontend/CLI for any necessary changes ## Testing - [x] Added/updated automated tests - [x] 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 support for Apple declarative management declarations on both System and User channels. * User-scoped declarations are now delivered, reconciled, and acknowledged independently from device-scoped declarations. * **Bug Fixes** * Prevented scope-mixing so declaration items and status updates no longer affect the wrong channel. * Tightened reconciliation behavior for scope changes and missing user channels. * **Tests** * Expanded coverage for channel isolation, payload scope parsing/validation, and correct delivery payload behavior (including stripping the payload-scope field from delivered JSON). <!-- end of auto-generated comment: release notes by coderabbit.ai --> |
||
|
|
3b7c88fb87 |
Fix dupe profile enqueue bug (#48652)
<!-- Add the related story/sub-task/bug number, like Resolves #123, or remove if NA --> **Related issue:** Resolves #48633 # 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. - [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 - [x] If paths of existing endpoints are modified without backwards compatibility, checked the frontend/CLI for any necessary changes ## Testing - [x] Added/updated automated tests - [x] 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** * Prevented duplicate profile enqueueing for hosts that share the same hardware UUID. * Reconcile processing now consistently picks the highest matching host record when duplicates exist. * Duplicate enrollment IDs are now filtered out before queueing, reducing repeated work and avoiding queue conflicts. * **Tests** * Added regression coverage for duplicate-host and duplicate-enqueue reconcile scenarios. <!-- end of auto-generated comment: release notes by coderabbit.ai --> --------- Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> |