Commit Graph
22426 Commits
Author SHA1 Message Date
Scott Gress 2d4e72ac7a Alias JIT Saml "team" attribute to FLEET_JIT_USER_ROLE_FLEET_<FLEET ID> (#41402)
<!-- Add the related story/sub-task/bug number, like Resolves #123, or
remove if NA -->
**Related issue:** Resolves #40642 

# Details

This PR adds `FLEET_JIT_USER_ROLE_FLEET_` as an expected Saml attribute
alongside `FLEET_JIT_USER_ROLE_TEAM_`.

# 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 with SimpleSAML SSO. 
- [x] Updated `users.php` to use both the new attribute and the old
attribute for a user, and was able to log in with that user and see them
created using JIT with the correct permissions
2026-03-13 08:34:29 -05:00
Irena ReedyandMike Thomas 9424db4858 Create thumbtacks-seamless-mac-migration.md (#41618)
Co-authored-by: Mike Thomas <78363703+mike-j-thomas@users.noreply.github.com>
2026-03-13 18:23:52 +09:00
Adam Baali 9ed65628df Combine Windows MDM migration remediation into single script (#41537) 2026-03-13 08:59:27 +01:00
Isabell ReedyandAshish Kuthiala 90f04b1349 Update marketing-assets.md (#41538)
Co-authored-by: Ashish Kuthiala <53918208+akuthiala@users.noreply.github.com>
2026-03-13 01:30:17 -05:00
d9feb689af Apple Push Notification Service: How APNs Works in MDM (#41251)
New Article by Team GrowthX

Date: 09-03-2026

cc @nonpunctual @ireedy @johnjeremiah

---------

Co-authored-by: Brock Walters <153771548+nonpunctual@users.noreply.github.com>
Co-authored-by: Ashish Kuthiala <53918208+akuthiala@users.noreply.github.com>
2026-03-13 01:23:01 -05:00
Eric 6ee103ad26 Handbook: Fix broken link to marketing assets handbook page (#41604)
Changes:
- Fixed a broken link to the "Marketing assets" handbook page
2026-03-13 00:57:45 -05:00
Software Developer | AI/ML | LLM | RAGandAshish Kuthiala f9d8ad0e1d Fleet vs. Jamf Pro and NinjaOne: MDM Solution Comparison 2026 (#41247)
New Article by Team GrowthX

Date: 09-3-2026

cc @nonpunctual @ireedy @johnjeremiah

Co-authored-by: Ashish Kuthiala <53918208+akuthiala@users.noreply.github.com>
2026-03-13 00:54:24 -05:00
Scott Gress 5c70d09081 Re-order post-4.82 migrations to fix CI test failure (#41624)
The [Test DB changes CI
test](https://github.com/fleetdm/fleet/actions/workflows/test-db-changes.yml?query=branch%3Amain)
has been failing on main since yesterday with:

```
 fail: server/datastore/mysql/migrations/tables/20260218165545_FixMismatchedSoftwareTitles.go has an older timestamp than server/datastore/mysql/migrations/tables/20260218175704_FMAActiveInstallers.go
this might cause problems if this change is merged
please update the timestamp of server/datastore/mysql/migrations/tables/20260218165545_FixMismatchedSoftwareTitles.go
Error: Process completed with exit code 1.
```

I think because some migrations were merged to main after the fleet 4.82
tag, but they came from a pre-4.82 tag branch. This PR moves the
migrations to the earliest possible time _after_ all of the 4.82
migrations.
2026-03-13 00:38:55 -05:00
Scott Gress 2686907dba Update API calls in front-end to use new, non-deprecated URLs and params (#41515)
<!-- Add the related story/sub-task/bug number, like Resolves #123, or
remove if NA -->
**Related issue:** Resolves #41391

# Details

This PR updates front-end API calls to use new URLs and API params, so
that the front end doesn't cause deprecation warnings to appear on the
server.

# 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.
n/a, should not be user-visible

## Testing

- [X] Added/updated automated tests
- [ ] QA'd all new/changed functionality manually
The biggest risk here is not that we missed a spot that still causes a
deprecation warning, but that we might inadvertently make a change that
breaks the front end, for instance by sending `fleet_id` to a function
that drops it silently and thus sends no ID to the server. Fortunately
we use TypeScript in virtually every place affected by these changes, so
the code would not compile if there were mismatches between the API
expectation and what we're sending. Still, spot checking as many places
as possible both for deprecation-warning leaks and loss of functionality
is important.

## Summary by CodeRabbit

* **Refactor**
* Updated API nomenclature across the application to use "fleets"
instead of "teams" and "reports" instead of "queries" in endpoint paths
and request/response payloads.

<!-- end of auto-generated comment: release notes by coderabbit.ai -->
2026-03-12 22:26:48 -05:00
fleet-releaseandmostlikelee 58c756d9c4 Update Fleet-maintained apps (#41605)
Automated ingestion of latest Fleet-maintained app data.

Co-authored-by: mostlikelee <16102903+mostlikelee@users.noreply.github.com>
2026-03-12 21:02:00 -05:00
Isabell Reedy 8c9f28ab82 Remove CSM role (#41622) 2026-03-12 20:58:16 -04:00
kilo-code-bot[bot]andkiloconnect[bot] f4c093047f Embed GitOps basics video on YAML files docs page (#41581)
## Summary

- Embeds Fleet's ["The Basics of Fleet
GitOps"](https://www.youtube.com/watch?v=wgqI_lHnGJc) YouTube video on
the [GitOps YAML files documentation
page](https://fleetdm.com/docs/configuration/yaml-files).
- The video is placed in the introduction section, right after the
opening paragraph and before the first callout, so users see it early
when landing on the page.
- Uses the existing `<div purpose="embedded-content"><iframe>` embed
pattern consistent with other Fleet docs pages (e.g.,
`articles/queries.md`, `articles/fleetctl.md`,
`articles/vulnerability-processing.md`).

### Changes
- `docs/Configuration/yaml-files.md`: Added YouTube video embed for "The
Basics of Fleet GitOps" (`wgqI_lHnGJc`).

Built for
[mikermcneil](https://fleetdm.slack.com/archives/D0AFASLRHNU/p1773338930980929)
by [Kilo for Slack](https://kilo.ai/features/slack-integration)

Co-authored-by: kiloconnect[bot] <240665456+kiloconnect[bot]@users.noreply.github.com>
2026-03-12 19:38:35 -05:00
Isabell Reedy a220c90eee Update open-positions.yml (#41620) 2026-03-12 20:37:23 -04:00
Andrey KizimenkoandBrayan Jimenez 561efeba21 Split "Fleet version" into Discovered and Reproduced fields in bug template (#41612)
Replaces the single **Fleet version** field in the bug template with two
fields:

- **Discovered** – the Fleet version where the issue was first observed
- **Reproduced** – the Fleet version, where we confirmed the issue can
also be reproduced

Co-authored-by: Brayan Jimenez <137363326+Brajim20@users.noreply.github.com>
2026-03-12 20:01:14 -04:00
+1 cc671f98c9 Preview of v4.82.0 doc changes (#38894)
This PR will remain in draft as a preview of upcoming documentation
changes for 4.82.0

---------

Co-authored-by: Jordan Montgomery <elijah.jordan.montgomery@gmail.com>
Co-authored-by: Marko Lisica <83164494+marko-lisica@users.noreply.github.com>
Co-authored-by: Magnus Jensen <magnus@fleetdm.com>
Co-authored-by: Victor Lyuboslavsky <2685025+getvictor@users.noreply.github.com>
Co-authored-by: Noah Talerman <47070608+noahtalerman@users.noreply.github.com>
Co-authored-by: Dante Catalfamo <43040593+dantecatalfamo@users.noreply.github.com>
Co-authored-by: melpike <79950145+melpike@users.noreply.github.com>
Co-authored-by: Mike Thomas <78363703+mike-j-thomas@users.noreply.github.com>
Co-authored-by: Nico <32375741+nulmete@users.noreply.github.com>
Co-authored-by: Scott Gress <scottmgress@gmail.com>
2026-03-12 18:19:53 -05:00
jacobshandling 3ab4e37c8e Reapply "Update Citrix Workspace CPE generation to distinguish betwee… (#41614)
Re-applies https://github.com/fleetdm/fleet/pull/41512 to `main`.
CPE-CVE translation tests expected to fail.
2026-03-12 16:17:40 -07:00
Steven Palmesano b37de7c9aa Remove duplicate custom_est_proxy entry (#41159)
Combine both entries to make one.
2026-03-12 18:02:17 -05:00
Noah Talerman 44b161dc28 Make bug bash weekly (#41608) 2026-03-12 15:22:37 -07:00
jacobshandling d5ff867452 Revert "Update Citrix Workspace CPE generation to distinguish between… (#41607)
Reverts https://github.com/fleetdm/fleet/pull/41512
2026-03-12 15:16:52 -07:00
Jordan MontgomeryandGabriel Hernandez 076157c1a6 Add CSP to fleet(currently disabled - needs frontend work) (#41395)
<!-- Add the related story/sub-task/bug number, like Resolves #123, or
remove if NA -->
**Related issue:** Resolves #40538

This is the initial iteration of CSP functionality, currently gated
behind FLEET_SERVER_ENABLE_CSP. If disabled, no CSP is served. Nonces
are still injected into pages however a dummy nonce is used and has no
effect.

With this setting turned on things break and will be addressed by mainly
frontend changes in https://github.com/fleetdm/fleet/issues/41577

# 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
- [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

---------

Co-authored-by: Gabriel Hernandez <ghernandez345@gmail.com>
2026-03-12 18:06:54 -04:00
RachelElysia 5724342147 Fleet UI: Show installed status icon if installed (#41358)
## Issue
Closes #39983 

## Description

This is so long because installation details are within 3 modals and so
all 3 had to be updated:

- SoftwareInstallDetailsModal
  - Updated variables and naming for readability
  -  Added icons to tests
- `shouldShowInventoryVersions` will show if
`overrideFailedMessageWithInstalledMessage` (bug fix)
- SoftwareIpaInstallDetailsModal
  - Updated variables and naming for readability
  - Added icons to tests
  - Use reusable component `IconStatusMessage`
  -  Added pre-4.57 "pending" case just in case to match VPP
- Override icon to success icon if
`overrideFailedMessageWithInstalledMessage || isInstalledManual` (bug
fix)
- `shouldShowInventoryVersions` will show if
`overrideFailedMessageWithInstalledMessage` (bug fix)
- VPPInstallDetailsModal
  - Updated variables and naming for readability
  - TODO: Create tests to add icons to
  -  Use reusable component `IconStatusMessage`
- Override icon to success icon if
`overrideFailedMessageWithInstalledMessage || isInstalledManual` (bug
fix)
- `shouldShowInventoryVersions` will show if
`overrideFailedMessageWithInstalledMessage` (bug fix)

## Screenshots

### BEFORE


https://github.com/user-attachments/assets/3472daef-47bd-4dbb-9ce9-afbf3d13302b



### AFTER


https://github.com/user-attachments/assets/c3212f58-6172-4437-9d60-76c42b98f451


## Testing

- [x] Added/updated automated tests
 Tests already exist, ensured they still passed

- [x] QA'd all new/changed functionality manually
2026-03-12 16:56:48 -05:00
RachelElysia 5f2dc44cf7 Fleet UI: Tighten up matchLoosePrefixKey to be stricter for sourcing software icons (#41598)
## Issue
Closes #41548 

## Description
- Improve string util we use for matching icons

> Note: Lots of retros how this came about

## Screenshot of fix

Arc vs. Archaeology
<img width="522" height="595" alt="Screenshot 2026-03-12 at 4 42 13 PM"
src="https://github.com/user-attachments/assets/9f805678-c08a-4959-ab6a-3b29c4b1f382"
/>


## Testing

- [x] Added/updated automated tests
- [x] QA'd all new/changed functionality manually
2026-03-12 16:56:01 -05:00
Sarah Gillespie 85af52667d Update DEP enrollment flow to apply minimum macOS version check when specified (#40720) 2026-03-12 16:54:46 -05:00
Eric d2332c5b2e Website: fix broken link to case study (#41600)
Changes: 
- Fixed a broken link to a case study on the /customers page
2026-03-12 16:04:01 -05:00
Eric 15cbde7146 Website: Disable indexing on conditional access error pages (#41497)
Changes:
- Updated the website's layout to not include analytics scripts and to
add a `<meta name="robots" content="noindex">` tag on pages for
conditional access errors.
2026-03-12 15:43:25 -05:00
Victor Lyuboslavsky 7dd5924974 Added support for NDES CA for Windows hosts (#41356)
<!-- Add the related story/sub-task/bug number, like Resolves #123, or
remove if NA -->
**Related issue:** Resolves #33421 

Video: https://www.youtube.com/watch?v=-mpW8o4vqu0 
Docs: https://github.com/fleetdm/fleet/pull/41496/changes

# Checklist for submitter

- [x] Changes file added for user-visible changes in `changes/`,
`orbit/changes/` or `ee/fleetd-chrome/changes`.
- [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

## 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

## Release Notes

* **New Features**
* Added support for NDES (Network Device Enrollment Service) Certificate
Authority for Windows devices, enabling secure device enrollment through
NDES proxy integration.
* New profile variables (NDESSCEPChallenge and NDESSCEPProxyURL) enable
NDES configuration in Windows profiles.
* Enhanced validation ensures proper NDES configuration requirements are
met in Windows MDM profiles.

<!-- end of auto-generated comment: release notes by coderabbit.ai -->
2026-03-12 15:36:44 -05:00
Irena Reedy bec3cf2677 Update README.md (#41567)
Added process instructions
2026-03-12 15:32:52 -05:00
Magnus Jensen 89c9e18884 Technician role has arrived (RBAC article) (#41555)
Removed coming soon for technician role in RBAC article
2026-03-12 13:21:49 -07:00
Sam Pfluger 1028bc4059 Update CEO rituals with autoIssue and task removal (#41587)
Added autoIssue configuration for tasks and removed a closed opportunity
review task.
2026-03-12 14:33:12 -05:00
Lucas Manuel Rodriguez 548f58f549 Bump trivy action version (#41579)
See
https://github.com/fleetdm/fleet/actions/runs/22986758081/job/66738693514

Context:
https://fleetdm.slack.com/archives/C019WG4GH0A/p1773337924208769
2026-03-12 16:17:45 -03:00
Eric 14a64cc10b Website: Revert email regex change (#41407)
Changes:
- Reverted the change in build-static-content from
https://github.com/fleetdm/fleet/pull/41348
2026-03-12 13:29:00 -05:00
RachelElysia b9f844d9ee Fleet UI: Clean up link styling (#41485) 2026-03-12 14:11:14 -04:00
Noah Talerman 31b8d6e043 Pricing page: Deploy certificates (#41506)
Wi-Fi is just one of the several third-party tools for deploying
certificates
2026-03-12 10:30:08 -07:00
jacobshandling dc0baca142 Update Citrix Workspace CPE generation to distinguish between ltsr/cr; fix NVD CVE resolved-in versions (#41512)
**Related issue:** Resolves #
https://github.com/fleetdm/fleet/issues/31303

- Include "ltsr" in the `sw_edition` field when generating CPEs for
Citrix Workstation with versions that are in the discreet set of LTSR
releases
- Modify NVD CVE feed entry for CVE-2024-6286 to specify the correct
resolved-in version for LTSR releases of the software
- Ensure correct resolved-in is chosen when sw_edition is "ltsr"
- Doc updates
- Test updates
- Failing CI test is expected, these updates are confirmed with local
build of the relevant vuln repo resources

QAed locally by [generating vulnerability repo
artifiacts](https://github.com/fleetdm/vulnerabilities/blob/main/.github/workflows/generate-cve.yml)
and confirming:
- resolved-in versions are correct:
<img width="683" height="202"
alt="generated-cves-successfully-swapped-resolved-in"
src="https://github.com/user-attachments/assets/a3730373-7a17-4e65-9a38-d0ccd602820a"
/>

- validation passes:
<img width="882" height="59" alt="cve-translation-validation-ok"
src="https://github.com/user-attachments/assets/c52a3969-2eec-4d24-b77c-d6f161b41aac"
/>

- Broken tests now pass for both CR and LTSR versions of Citrix
Workspace:
<img width="1277" height="80"
alt="test-passes-with-freshly-built-cve-data"
src="https://github.com/user-attachments/assets/26a8f108-99d9-40a0-ac59-dc7f5d0a6bbe"
/>


- [x] Changes file added for user-visible changes in `changes/`
- [x] Added/updated automated tests
- [x] QA'd all new/changed functionality manually
2026-03-12 10:00:39 -07:00
Luke Heath 241a624d21 Stop using RC action for gitops (#41557) 2026-03-12 11:10:58 -05:00
Jordan Montgomery 30ad47c8a5 Update default lock end user info value to match EUA when not specified (#41441)
<!-- Add the related story/sub-task/bug number, like Resolves #123, or
remove if NA -->
**Related issue:** Resolves #38669 Unreleased bug/Misunderstood
requirements

# Checklist for submitter

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

- [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**
* End User Authentication and lock end-user info settings now
synchronize correctly when one is updated without explicitly setting the
other.
* Validation error messages now clearly state that end-user
authentication must be enabled before locking end-user info.

* **Tests**
* Expanded test coverage for MDM configuration handling and related
scenarios.

<!-- end of auto-generated comment: release notes by coderabbit.ai -->
2026-03-12 12:00:51 -04:00
Magnus Jensen 375ede6da9 Remove change entry that was reverted (#41553)
The original code PR (including the changefile) was reverted
https://github.com/fleetdm/fleet/pull/40452
Not sure how it made it in, but this removes it again.
2026-03-12 10:53:22 -05:00
fleet-releaseandmostlikelee 6907c599a1 Update Fleet-maintained apps (#41536)
Automated ingestion of latest Fleet-maintained app data.

Co-authored-by: mostlikelee <16102903+mostlikelee@users.noreply.github.com>
2026-03-12 10:24:29 -05:00
RachelElysia 2e24663f86 Fleet UI: Update discard data option link + styling (#41535) 2026-03-12 10:39:48 -04:00
3621ca6236 Update board meeting prep (#41489)
## Summary
- In the "Board meeting and OKR planning" section of the leadership
handbook, updated the "Two weeks prior" prep steps so the EA also asks
each executive for 1-2 questions for board members, in addition to the
2-3 charts.
- Added a new prep step: the CEO and CFO discuss the board meeting with
the CEO's coach.

### Changes
- **`handbook/company/leadership.md`**: Added a bullet point under "Two
weeks prior (virtual)" for the EA to ask each executive for 2-3 charts
and 1-2 questions for board members ahead of the board meeting.
- **`handbook/company/leadership.md`**: Added a bullet point under "Two
weeks prior (virtual)" for the CEO and CFO to discuss the board meeting
with the CEO's coach.

Built for [Isabell
Reedy](https://fleetdm.slack.com/archives/D0AEGJCGJR0/p1773275802544599?thread_ts=1773255974.874519&cid=D0AEGJCGJR0)
by [Kilo for Slack](https://kilo.ai/features/slack-integration)

---------

Co-authored-by: kiloconnect[bot] <240665456+kiloconnect[bot]@users.noreply.github.com>
Co-authored-by: Isabell Reedy <113355639+ireedy@users.noreply.github.com>
2026-03-12 10:33:14 -04:00
Mike Thomas 9d221a2d4e Update mdm-modern-change-management-528x377@2x.png (#41527)
Updated modern change management image on /device-management
2026-03-12 23:05:59 +09:00
Tim Lee 8b43190f5d Set recovery lock password - mdm commands (#41217) 2026-03-12 06:06:56 -06:00
Mike Thomas c7eeb82b49 Update device-management.ejs (#41528)
Modern change management text update.
2026-03-12 14:55:05 +09:00
Noah Talerman b338a30b57 Release article: Fleet 4.82.0 (#41086) 2026-03-11 23:41:42 -05:00
Noah Talerman 09590bc6e2 "Teams" => "fleets", "queries" => "reports" doc changes (#39585) 2026-03-11 23:41:14 -05:00
894a735681 Fix broken link in Writing style section of company handbook (#41525)
## Summary

- Fixed a broken link in the "Writing style" section of the company
handbook (`handbook/company/writing.md`)
- The "Mister Rogersing" example link was pointing to the old URL
(`/handbook/company/communications#what-would-mister-rogers-say`) which
no longer exists
- Updated it to the correct URL
(`/handbook/company/writing#what-would-mister-rogers-say`)

Built for [Michael
Thomas](https://fleetdm.slack.com/archives/D0AL6RD36GL/p1773287035750919)
by [Kilo for Slack](https://kilo.ai/features/slack-integration)

Co-authored-by: kiloconnect[bot] <240665456+kiloconnect[bot]@users.noreply.github.com>
Co-authored-by: Mike Thomas <78363703+mike-j-thomas@users.noreply.github.com>
2026-03-12 13:02:37 +09:00
Mike ThomasandEric 63e6375c10 Renamed fleet-gitops => infrastructure-as-code (#41520)
- Renamed fleet-gitops => infrastructure-as-code
- Changed the URL (maintaining backwards compatibility)

---------

Co-authored-by: Eric <eashaw@sailsjs.com>
2026-03-12 12:54:17 +09:00
Ian Littman 4a4e55efc0 Bump RustFS dependency to latest version (#40843)
This is just a `fleetctl preview` deps + docker-compose deps bump.
Tested both.

## Testing

- [x] QA'd all new/changed functionality manually
2026-03-11 19:17:48 -05:00
Victor Lyuboslavsky 7a4d3ec506 Fixed table shifting left when clicking the copy hash icon (#41411)
<!-- Add the related story/sub-task/bug number, like Resolves #123, or
remove if NA -->
**Related issue:** Resolves #40607

# Checklist for submitter
- [x] Changes file added for user-visible changes in `changes/`,
`orbit/changes/` or `ee/fleetd-chrome/changes`.

## Testing

- [x] QA'd all new/changed functionality manually
2026-03-11 19:15:36 -05:00
Victor Lyuboslavsky 373effbb9e Fixed Microsoft NDES CA not being selectable (#41490)
<!-- Add the related story/sub-task/bug number, like Resolves #123, or
remove if NA -->
**Related issue:** Resolves #38585

# Checklist for submitter

- [x] Changes file added for user-visible changes in `changes/`,
`orbit/changes/` or `ee/fleetd-chrome/changes`.

## 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**
* Fixed Microsoft NDES CA selection to work immediately after deleting
an existing NDES CA without requiring a page refresh.
* Added validation preventing multiple NDES CAs from being added, with a
tooltip message explaining the limitation.

<!-- end of auto-generated comment: release notes by coderabbit.ai -->
2026-03-11 19:15:16 -05:00