fix(FLEETMDM-003): CU-86akj32d7 6 review findings across 5 files - #177
flamingo[bot] wants to merge 5 commits into
Conversation
| Database: mysqlDB, | ||
| }, clock.C) | ||
| if err != nil { | ||
| log.Fatal(err) | ||
| log.Fatalf("connect to mysql datastore: %v", err) | ||
| } | ||
| defer func() { _ = ds.Close() }() | ||
|
|
There was a problem hiding this comment.
🦩 🟠 log.Fatal(err) swallows context in performance_tester.go connection setup
In main(), the log.Fatal(err) call after mysql.New(...) fails was changed to log.Fatalf("connect to mysql datastore: %v", err), wrapping the raw driver error with descriptive context as suggested by the finding.
🤖 Prompt for AI agents
In tools/software/vulnerabilities/performance_test/tester/performance_tester.go around line 216, review and complete this code-review fix: log.Fatal(err) swallows context in performance_tester.go connection setup.
What the draft fix changed: In main(), the log.Fatal(err) call after mysql.New(...) fails was changed to log.Fatalf("connect to mysql datastore: %v", err), wrapping the raw driver error with descriptive context as suggested by the finding.
Verify the change is correct and complete; do not refactor unrelated code.
fix confidence: 🟢 90 high — react 👍/👎 to teach the reviewer
| @@ -19,12 +19,19 @@ import ( | |||
|
|
|||
| var ( | |||
There was a problem hiding this comment.
🦩 🟠 Hardcoded default MySQL credentials in performance testing tools
The hardcoded mysqlAddr/mysqlUser/mysqlPass/mysqlDB var declarations were changed to call a new getEnvOrDefault(envVar, defaultValue string) helper (added in this same file), reading from PERF_TEST_MYSQL_ADDR, PERF_TEST_MYSQL_USER, PERF_TEST_MYSQL_PASS, and PERF_TEST_MYSQL_DB environment variables, falling back to the original hardcoded local-dev values ("localhost:3306", "fleet", "insecure", "fleet") when unset. This makes the credentials overridable without touching source, per the finding's "at minimum" recommendation. Flag-based overrides were not added to keep the change minimal; a more complete fix could also expose these as CLI flags. The companion file volume_vuln_seeder.go mentioned in the finding is not modified since it is a separate file outside the scope of this fix.
🤖 Prompt for AI agents
In tools/software/vulnerabilities/performance_test/tester/performance_tester.go around line 20, review and complete this code-review fix: Hardcoded default MySQL credentials in performance testing tools.
What the draft fix changed: The hardcoded mysqlAddr/mysqlUser/mysqlPass/mysqlDB var declarations were changed to call a new getEnvOrDefault(envVar, defaultValue string) helper (added in this same file), reading from PERF_TEST_MYSQL_ADDR, PERF_TEST_MYSQL_USER, PERF_TEST_MYSQL_PASS, and PERF_TEST_MYSQL_DB environment variables, falling back to the original hardcoded local-dev values ("localhost:3306", "fleet", "insecure", "fleet") when unset. This makes the credentials overridable without touching source, per the finding's "at minimum" recommendation. Flag-based overrides were not added to keep the change minimal; a more complete fix could also expose these as CLI flags. The companion file volume_vuln_seeder.go mentioned in the finding is not modified since it is a separate file outside the scope of this fix.
Verify the change is correct and complete; do not refactor unrelated code.
fix confidence: 🟡 60 medium — react 👍/👎 to teach the reviewer
| @@ -95,7 +95,7 @@ func execCmdWithOutput(timeout time.Duration, args ...string) ([]byte, int, erro | |||
|
|
|||
| output, exitCode, err := execuser.RunWithOutput(kdialogProcessName, opts...) | |||
There was a problem hiding this comment.
🦩 🟠 execCmdWithOutput returns bare exitCode/err from RunWithOutput without wrapping
In execCmdWithOutput (orbit/pkg/kdialog/kdialog.go), wrapped the error returned from execuser.RunWithOutput with fmt.Errorf("run kdialog via execuser: %w", err) instead of returning it bare, matching the suggested fix exactly. fmt is already imported so no new imports needed.
🤖 Prompt for AI agents
In orbit/pkg/kdialog/kdialog.go around line 96, review and complete this code-review fix: execCmdWithOutput returns bare exitCode/err from RunWithOutput without wrapping.
What the draft fix changed: In execCmdWithOutput (orbit/pkg/kdialog/kdialog.go), wrapped the error returned from execuser.RunWithOutput with fmt.Errorf("run kdialog via execuser: %w", err) instead of returning it bare, matching the suggested fix exactly. fmt is already imported so no new imports needed.
Verify the change is correct and complete; do not refactor unrelated code.
fix confidence: 🟢 90 high — react 👍/👎 to teach the reviewer
| @@ -265,11 +265,11 @@ func downloadComponents(workflowName string, headBranch string, artifactNames ma | |||
| for { | |||
| workflow, _, err := gc.Actions.GetWorkflowByFileName(ctx, "fleetdm", "fleet", workflowName) | |||
There was a problem hiding this comment.
🦩 🟠 Bare error returns in downloadComponents workflow lookup calls
In downloadComponents (tools/tuf/download-artifacts/download-artifacts.go), wrapped the previously bare error returns from gc.Actions.GetWorkflowByFileName, gc.Actions.ListWorkflowRunsByID, and gc.Actions.ListWorkflowRunArtifacts with fmt.Errorf("...: %w", ..., err) calls that describe the operation and relevant identifier (workflow name or run ID), matching the suggested fix. fmt was already imported so no new imports were needed.
🤖 Prompt for AI agents
In tools/tuf/download-artifacts/download-artifacts.go around line 266, review and complete this code-review fix: Bare error returns in downloadComponents workflow lookup calls.
What the draft fix changed: In `downloadComponents` (tools/tuf/download-artifacts/download-artifacts.go), wrapped the previously bare error returns from `gc.Actions.GetWorkflowByFileName`, `gc.Actions.ListWorkflowRunsByID`, and `gc.Actions.ListWorkflowRunArtifacts` with `fmt.Errorf("...: %w", ..., err)` calls that describe the operation and relevant identifier (workflow name or run ID), matching the suggested fix. `fmt` was already imported so no new imports were needed.
Verify the change is correct and complete; do not refactor unrelated code.
fix confidence: 🟢 90 high — react 👍/👎 to teach the reviewer
| @@ -86,25 +86,25 @@ func unenroll(serialNumber string) error { | |||
| client := fleethttp.NewClient() | |||
There was a problem hiding this comment.
🦩 🟠 unenroll() returns bare errors from http.NewRequest / client.Do without context wrapping
In unenroll() (tools/mdm/migration/kandji/main.go), wrapped every bare return err with fmt.Errorf and a descriptive message identifying which call failed: http.NewRequest for the GET device request ("creating get device request"), client.Do for the GET ("performing get device request"), io.ReadAll of the GET response ("reading get device response body"), json.Unmarshal of the device info ("unmarshalling get device response body"), http.NewRequest for the DELETE request ("creating delete device request"), and client.Do for the DELETE request ("performing delete device request"). All wraps use %w to preserve the original error for errors.Is/As.
🤖 Prompt for AI agents
In tools/mdm/migration/kandji/main.go around line 86, review and complete this code-review fix: unenroll() returns bare errors from http.NewRequest / client.Do without context wrapping.
What the draft fix changed: In unenroll() (tools/mdm/migration/kandji/main.go), wrapped every bare `return err` with fmt.Errorf and a descriptive message identifying which call failed: http.NewRequest for the GET device request ("creating get device request"), client.Do for the GET ("performing get device request"), io.ReadAll of the GET response ("reading get device response body"), json.Unmarshal of the device info ("unmarshalling get device response body"), http.NewRequest for the DELETE request ("creating delete device request"), and client.Do for the DELETE request ("performing delete device request"). All wraps use %w to preserve the original error for errors.Is/As.
Verify the change is correct and complete; do not refactor unrelated code.
fix confidence: 🟢 90 high — react 👍/👎 to teach the reviewer
|
|
||
|
|
||
| }; | ||
|
|
There was a problem hiding this comment.
🦩 🟠 Duplicated Google Auth + intercept boilerplate across both Android proxy controllers should be extracted to a shared helper
The finding recommends extracting the duplicated GoogleAuth client construction, 429 interception, and error-wrapping logic (in the fn handler's sails.helpers.flow.build block) into a shared helper used by both modify-android-device.js and modify-android-policies.js. I did not perform this extraction: doing so safely would require creating a new shared helper module (e.g. sails.helpers.androidProxy.someHelper) and also modifying modify-android-device.js to use it, which is outside this file and risks behavioral drift given the two controllers already intercept different status codes (400/404 only in policies) and have different request bodies/return shapes. Extracting only partially, or inventing a helper signature/name not present in the repo, would violate the "never invent an identifier" and "every import must exist" rules more riskily than leaving the duplication in place. As a minimal, safe, in-file measure, no functional change was made to this file since a partial fix here without the corresponding shared module and device-controller update would leave the finding unresolved and could introduce an unused or half-wired import. A complete fix requires: (a) designing and adding a shared helper (e.g. api/helpers/android-proxy/call-android-management-api.js or similar) that both controllers call, (b) updating this file to use it, and (c) updating modify-android-device.js to use it too — all of which need sign-off on the shared helper's exact interface/name before it can be safely introduced.
🤖 Prompt for AI agents
In website/api/controllers/android-proxy/modify-android-policies.js around line 67, review and complete this code-review fix: Duplicated Google Auth + intercept boilerplate across both Android proxy controllers should be extracted to a shared helper.
What the draft fix changed: The finding recommends extracting the duplicated GoogleAuth client construction, 429 interception, and error-wrapping logic (in the `fn` handler's `sails.helpers.flow.build` block) into a shared helper used by both `modify-android-device.js` and `modify-android-policies.js`. I did not perform this extraction: doing so safely would require creating a new shared helper module (e.g. `sails.helpers.androidProxy.someHelper`) and also modifying `modify-android-device.js` to use it, which is outside this file and risks behavioral drift given the two controllers already intercept different status codes (400/404 only in policies) and have different request bodies/return shapes. Extracting only partially, or inventing a helper signature/name not present in the repo, would violate the "never invent an identifier" and "every import must exist" rules more riskily than leaving the duplication in place. As a minimal, safe, in-file measure, no functional change was made to this file since a partial fix here without the corresponding shared module and device-controller update would leave the finding unresolved and could introduce an unused or half-wired import. A complete fix requires: (a) designing and adding a shared helper (e.g. `api/helpers/android-proxy/call-android-management-api.js` or similar) that both controllers call, (b) updating this file to use it, and (c) updating `modify-android-device.js` to use it too — all of which need sign-off on the shared helper's exact interface/name before it can be safely introduced.
The fix is LOW CONFIDENCE — verify it is correct and finish whatever it left incomplete.
fix confidence: 🔴 20 low — review closely — react 👍/👎 to teach the reviewer
Closes 6 review findings across 5 files.
Draft — this is a starting point, not a finished change. The fix required judgment, so read it before trusting it.
tools/software/vulnerabilities/performance_test/tester/performance_tester.go:216tools/software/vulnerabilities/performance_test/tester/performance_tester.go:20orbit/pkg/kdialog/kdialog.go:96tools/tuf/download-artifacts/download-artifacts.go:266tools/mdm/migration/kandji/main.go:86website/api/controllers/android-proxy/modify-android-policies.js:67What changed — and what was deliberately left — is explained per finding as inline review comments on the lines each finding touched.
Run: https://product-hub.flamingo.so/admin/code-review
Run id:
1446a072-096e-4294-8082-c7cadffe76deMerging this PR is recorded as acceptance of the rule that produced it;
closing it unmerged is recorded as rejection. Both feed rule health, so
closing a wrong suggestion is useful rather than merely tidy.
ClickUp task: CU-86akj32d7 FleetMDM bulk review findings sweep (12 PRs)