diff --git a/server/contexts/ctxerr/ctxerr.go b/server/contexts/ctxerr/ctxerr.go index e4733ec843..6a14d0823f 100644 --- a/server/contexts/ctxerr/ctxerr.go +++ b/server/contexts/ctxerr/ctxerr.go @@ -18,6 +18,9 @@ import ( "fmt" "strings" "time" + + "github.com/fleetdm/fleet/v4/server/contexts/host" + "github.com/fleetdm/fleet/v4/server/contexts/viewer" ) type key int @@ -76,8 +79,25 @@ func setMetadata(ctx context.Context, data map[string]interface{}) map[string]in data = map[string]interface{}{} } - // TODO: add more metadata from ctx data["timestamp"] = nowFn().Format(time.RFC3339) + + if h, ok := host.FromContext(ctx); ok { + data["host"] = map[string]interface{}{ + "platform": h.Platform, + "osquery_version": h.OsqueryVersion, + } + } + + if v, ok := viewer.FromContext(ctx); ok { + vdata := map[string]interface{}{} + data["viewer"] = vdata + vdata["is_logged_in"] = v.IsLoggedIn() + + if v.User != nil { + vdata["sso_enabled"] = v.User.SSOEnabled + } + } + return data } diff --git a/server/contexts/ctxerr/ctxerr_test.go b/server/contexts/ctxerr/ctxerr_test.go index 066273639e..ada98fc1de 100644 --- a/server/contexts/ctxerr/ctxerr_test.go +++ b/server/contexts/ctxerr/ctxerr_test.go @@ -10,6 +10,9 @@ import ( "testing" "time" + "github.com/fleetdm/fleet/v4/server/contexts/host" + "github.com/fleetdm/fleet/v4/server/contexts/viewer" + "github.com/fleetdm/fleet/v4/server/fleet" pkgerrors "github.com/pkg/errors" //nolint:depguard "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -341,3 +344,23 @@ func TestHandle(t *testing.T) { Handle(ctx, err) }) } + +func TestAdditionalMetadata(t *testing.T) { + t.Run("saves additional data about the host if present", func(t *testing.T) { + ctx, cleanup := setup() + defer cleanup() + hctx := host.NewContext(ctx, &fleet.Host{Platform: "test_platform", OsqueryVersion: "5.0"}) + err := New(hctx, "with host context").(*FleetError) + + require.JSONEq(t, string(err.data), `{"host":{"osquery_version":"5.0","platform":"test_platform"},"timestamp":"1969-06-19T21:44:05Z"}`) + }) + + t.Run("saves additional data about the viewer if present", func(t *testing.T) { + ctx, cleanup := setup() + defer cleanup() + vctx := viewer.NewContext(ctx, viewer.Viewer{Session: &fleet.Session{ID: 1}, User: &fleet.User{SSOEnabled: true}}) + err := New(vctx, "with host context").(*FleetError) + + require.JSONEq(t, string(err.data), `{"viewer":{"is_logged_in":true,"sso_enabled":true},"timestamp":"1969-06-19T21:44:05Z"}`) + }) +}