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 }