feat(fleet): expose default-password remediation UX#482
Conversation
🔐 Codex Security Review
Review SummaryOverall Risk: NONE FindingsNo actionable security, correctness, or reliability findings in the scoped diff. NotesThe reviewed changes are limited to ProtoFleet client UI/test code around default-password miner remediation, fleet selection gating, status/issue presentation, and onboarding copy. I did not find changes to backend authz, SQL/migrations, RPC handlers, plugin execution, Docker/Nginx infrastructure, Rust/Python plugins, or protobuf wire definitions in The new password-remediation paths appear to keep default-password miners visible but blocked from normal mutating bulk actions, while allowing the dedicated security/password flow through single-row, group, and Complete Setup entry points. Generated by Codex Security Review | |
00dafce to
780b195
Compare
Summary
Adds the Fleet UI remediation path for miners that are paired, reporting telemetry, and still using the factory default password. Operators now see default-password miners as needing attention, can launch the existing Manage security flow from row/issues/setup surfaces, and cannot run normal mutating actions against those miners.
Stack: #471 -> #480 -> this PR. The diff here is relative to #480, which provides the server-side command and reconciliation safety boundary; this PR is intentionally client-only except for E2E fixtures. #477 is a sibling fleet-node enrollment follow-up stacked on #480 and can be reviewed independently from this UI layer. Phase 3 cleanup remains out of scope.
How it works
Fleet-visible pairing filters include
DEFAULT_PASSWORD, so default-password miners stay in the miner list and continue showing telemetry instead of looking offline or hidden. Shared remediation helpers mapDEFAULT_PASSWORDto password-change-required copy, status badges, issue cells, and measurement behavior while leavingAUTHENTICATION_NEEDEDon the login/re-authenticate path.Action surfaces use the backend eligibility boundary from #480. Normal row, bulk, and group actions count default-password miners as disabled; Manage security remains available and is scoped by a
DEFAULT_PASSWORDfilter when the operator clicks the password-required issue or the Complete setup card. Complete setup now has anUpdate passwordscard that targets all default-password miners after pairing, alongside the existing pool and authentication setup cards.Diagrams
flowchart TD A["Fleet list receives miner snapshot"] --> B{"pairing_status"} B -->|"PAIRED"| C["normal telemetry and actions"] B -->|"DEFAULT_PASSWORD"| D["telemetry visible + password issue"] B -->|"AUTHENTICATION_NEEDED"| E["authentication issue"] D --> F["row issue click"] D --> G["Complete setup: Update passwords"] F --> H["Manage security modal"] G --> H H --> I["all-devices selector filtered to DEFAULT_PASSWORD"]Areas of the code involved
client/src/protoFleet/features/fleetManagement/utils/pairingRemediation.tsMinerList/*,StatusModal,getMinerMeasurementFleet,MinerActionsMenu,SingleMinerActionsMenu,FleetGroupActionsMenudeviceSelector.tsanduseDefaultPasswordMiners.tsCompleteSetup/*Update passwordscard and modal stack wiringclient/e2eTests/protoFleetKey technical decisions & trade-offs
Testing & validation
npm test -- CompleteSetup.test.tsx deviceSelector.test.ts useDefaultPasswordMiners.test.ts useMinerActions.test.tsx Fleet.test.tsx FleetGroupActionsMenu.test.tsx MinerActionsMenu.test.tsx SingleMinerActionsMenu.test.tsx MinerIssues.test.tsx MinerList.modalFlow.test.tsx MinerList.test.tsx MinerWorkerName.test.tsx getMinerMeasurement.test.ts --runnpm run lintnpm run build:protoFleetgit diff --checkNot covered locally: full Playwright E2E; this PR updates the fixtures but the full browser suite is left to CI/local smoke.