From 48f61532bd984941fc72c08532ae4a5e3283cac9 Mon Sep 17 00:00:00 2001 From: Dominic R Date: Sun, 31 May 2026 20:40:37 -0400 Subject: [PATCH] facts: omit blank OS strings Only set optional OS name and version facts when platform can report a non-empty value, so generated API requests omit unknown values instead of sending blank strings. Agent-thread: https://sdko.org/internal/threads/019e808d-fc02-7182-bf00-c3912c0ece92 A7k-product: platform Co-authored-by: Agent --- pkg/platform/facts/os/os.go | 10 ++++++++++ pkg/platform/facts/os/os_darwin.go | 4 ++-- pkg/platform/facts/os/os_linux.go | 4 ++-- pkg/platform/facts/os/os_test.go | 21 +++++++++++++++++++++ pkg/platform/facts/os/os_windows.go | 5 ++--- 5 files changed, 37 insertions(+), 7 deletions(-) diff --git a/pkg/platform/facts/os/os.go b/pkg/platform/facts/os/os.go index 7d36c2ed..f634d7cb 100644 --- a/pkg/platform/facts/os/os.go +++ b/pkg/platform/facts/os/os.go @@ -1,6 +1,8 @@ package os import ( + "strings" + "goauthentik.io/api/v3" "goauthentik.io/platform/pkg/platform/facts/common" ) @@ -11,6 +13,14 @@ func Gather(ctx *common.GatherContext) (api.DeviceFactsRequestOs, error) { return gather(ctx) } +func ptrStringIfNotBlank(value string) *string { + value = strings.TrimSpace(value) + if value == "" { + return nil + } + return api.PtrString(value) +} + func extractVersion(versionData map[string]string) (string, string) { name, version := "", "" if _name, ok := versionData["NAME"]; ok { diff --git a/pkg/platform/facts/os/os_darwin.go b/pkg/platform/facts/os/os_darwin.go index 704417a6..ec7e105c 100644 --- a/pkg/platform/facts/os/os_darwin.go +++ b/pkg/platform/facts/os/os_darwin.go @@ -18,8 +18,8 @@ func gather(ctx *common.GatherContext) (api.DeviceFactsRequestOs, error) { return api.DeviceFactsRequestOs{ Arch: runtime.GOARCH, Family: api.DEVICEFACTSOSFAMILY_MAC_OS, - Name: new(name), - Version: new(version), + Name: ptrStringIfNotBlank(name), + Version: ptrStringIfNotBlank(version), }, nil } diff --git a/pkg/platform/facts/os/os_linux.go b/pkg/platform/facts/os/os_linux.go index d1a1385d..2211ed52 100644 --- a/pkg/platform/facts/os/os_linux.go +++ b/pkg/platform/facts/os/os_linux.go @@ -18,8 +18,8 @@ func gather(ctx *common.GatherContext) (api.DeviceFactsRequestOs, error) { return api.DeviceFactsRequestOs{ Arch: runtime.GOARCH, Family: api.DEVICEFACTSOSFAMILY_LINUX, - Name: api.PtrString(name), - Version: api.PtrString(version), + Name: ptrStringIfNotBlank(name), + Version: ptrStringIfNotBlank(version), }, nil } diff --git a/pkg/platform/facts/os/os_test.go b/pkg/platform/facts/os/os_test.go index 3d383873..daf746db 100644 --- a/pkg/platform/facts/os/os_test.go +++ b/pkg/platform/facts/os/os_test.go @@ -1,6 +1,7 @@ package os import ( + "encoding/json" "runtime" "slices" "testing" @@ -115,6 +116,26 @@ func TestExtract(t *testing.T) { } } +func TestPtrStringIfNotBlank(t *testing.T) { + assert.Nil(t, ptrStringIfNotBlank("")) + assert.Nil(t, ptrStringIfNotBlank(" \t\n")) + + value := ptrStringIfNotBlank(" 24.04 ") + assert.NotNil(t, value) + assert.Equal(t, "24.04", *value) +} + +func TestMarshalOmitsBlankOptionalStrings(t *testing.T) { + data, err := json.Marshal(api.DeviceFactsRequestOs{ + Arch: "amd64", + Family: api.DEVICEFACTSOSFAMILY_LINUX, + Name: ptrStringIfNotBlank("Linux"), + Version: ptrStringIfNotBlank(""), + }) + assert.NoError(t, err) + assert.JSONEq(t, `{"arch":"amd64","family":"linux","name":"Linux"}`, string(data)) +} + func TestGatherLinux(t *testing.T) { if runtime.GOOS != "linux" { t.Skip("Skipping Linux-specific test") diff --git a/pkg/platform/facts/os/os_windows.go b/pkg/platform/facts/os/os_windows.go index 21cb7c9b..14aafa0c 100644 --- a/pkg/platform/facts/os/os_windows.go +++ b/pkg/platform/facts/os/os_windows.go @@ -4,7 +4,6 @@ package os import ( "runtime" - "strings" "goauthentik.io/api/v3" "goauthentik.io/platform/pkg/platform/facts/common" @@ -35,7 +34,7 @@ func gather(ctx *common.GatherContext) (api.DeviceFactsRequestOs, error) { return api.DeviceFactsRequestOs{ Arch: runtime.GOARCH, Family: api.DEVICEFACTSOSFAMILY_WINDOWS, - Name: api.PtrString(strings.TrimSpace(productName)), - Version: api.PtrString(strings.TrimSpace(version)), + Name: ptrStringIfNotBlank(productName), + Version: ptrStringIfNotBlank(version), }, nil }