From 893563777b7acd13e39c7fa52a014d08bdf545cd Mon Sep 17 00:00:00 2001 From: Magnus Jensen Date: Tue, 5 Aug 2025 16:39:49 +0200 Subject: [PATCH] Do not log error if missing EULA (#31598) fixes #29833 Checks if the error is a not found error and then return a notFoundError that does not get logged as an error but as an info log instead. `level=info ts=2025-08-05T10:46:06.237581Z component=http path=/api/latest/fleet/setup_experience/eula/metadata took=1.939958ms uuid=0ab0c579-07c5-48be-b6bd-5e4ebd81212d err="not found"` # Checklist for submitter If some of the following don't apply, delete the relevant line. - [x] Changes file added for user-visible changes in `changes/`, `orbit/changes/` or `ee/fleetd-chrome/changes`. See [Changes files](https://github.com/fleetdm/fleet/blob/main/docs/Contributing/guides/committing-changes.md#changes-files) for more information. ## Testing - [x] Added/updated automated tests - [x] QA'd all new/changed functionality manually --- .../29833-do-not-log-error-for-missing-eula | 1 + server/service/integration_logger_test.go | 41 ++++++++++++++++++- server/service/mdm.go | 7 +++- 3 files changed, 47 insertions(+), 2 deletions(-) create mode 100644 changes/29833-do-not-log-error-for-missing-eula diff --git a/changes/29833-do-not-log-error-for-missing-eula b/changes/29833-do-not-log-error-for-missing-eula new file mode 100644 index 0000000000..040a5fd406 --- /dev/null +++ b/changes/29833-do-not-log-error-for-missing-eula @@ -0,0 +1 @@ +* Do not log an error if EULA is missing for the `/setup_experience/eula/metadata` endpoint \ No newline at end of file diff --git a/server/service/integration_logger_test.go b/server/service/integration_logger_test.go index cbaaf77373..a009272b68 100644 --- a/server/service/integration_logger_test.go +++ b/server/service/integration_logger_test.go @@ -13,6 +13,7 @@ import ( "time" "github.com/fleetdm/fleet/v4/pkg/fleethttp" + "github.com/fleetdm/fleet/v4/server/datastore/redis/redistest" "github.com/fleetdm/fleet/v4/server/fleet" "github.com/fleetdm/fleet/v4/server/ptr" "github.com/fleetdm/fleet/v4/server/service/contract" @@ -42,8 +43,15 @@ func (s *integrationLoggerTestSuite) SetupSuite() { s.buf = new(bytes.Buffer) logger := log.NewJSONLogger(s.buf) logger = level.NewFilter(logger, level.AllowDebug()) + redisPool := redistest.SetupRedis(s.T(), "zz", false, false, false) - users, server := RunServerForTestsWithDS(s.T(), s.ds, &TestServerOpts{Logger: logger}) + users, server := RunServerForTestsWithDS(s.T(), s.ds, &TestServerOpts{ + License: &fleet.LicenseInfo{ + Tier: fleet.TierPremium, + }, + Logger: logger, + Pool: redisPool, + }) s.server = server s.users = users } @@ -304,3 +312,34 @@ func (s *integrationLoggerTestSuite) TestEnrollAgentLogsErrors() { assert.Contains(t, string(logData["err"]), `"enroll failed:`) assert.Contains(t, string(logData["err"]), `no matching secret found`) } + +func (s *integrationLoggerTestSuite) TestSetupExperienceEULAMetadataDoesNotLogErrorIfNotFound() { + t := s.T() + + appConf, err := s.ds.AppConfig(context.Background()) + require.NoError(s.T(), err) + originalAppConf := *appConf + + appConf.MDM.EnabledAndConfigured = true + appConf.MDM.WindowsEnabledAndConfigured = true + appConf.MDM.AppleBMEnabledAndConfigured = true + err = s.ds.SaveAppConfig(context.Background(), appConf) + require.NoError(t, err) + + s.token = getTestAdminToken(t, s.server) + s.Do("GET", "/api/v1/fleet/setup_experience/eula/metadata", nil, http.StatusNotFound) + + logs := strings.Split(strings.TrimSpace(s.buf.String()), "\n") + require.Len(t, logs, 2) // Login and not found + + logData := make(map[string]json.RawMessage) + log := logs[1] + + assert.NoError(t, json.Unmarshal([]byte(log), &logData)) + assert.Equal(t, `"info"`, string(logData["level"])) + assert.Equal(t, string(logData["err"]), `"not found"`) + + // restore app config + err = s.ds.SaveAppConfig(context.Background(), &originalAppConf) + require.NoError(t, err) +} diff --git a/server/service/mdm.go b/server/service/mdm.go index d8efeede86..7b0d82a074 100644 --- a/server/service/mdm.go +++ b/server/service/mdm.go @@ -368,10 +368,15 @@ func (r getMDMEULAMetadataResponse) Error() error { return r.Err } func getMDMEULAMetadataEndpoint(ctx context.Context, request interface{}, svc fleet.Service) (fleet.Errorer, error) { eula, err := svc.MDMGetEULAMetadata(ctx) - if err != nil { + if err != nil && !fleet.IsNotFound(err) { return getMDMEULAMetadataResponse{Err: err}, nil } + if eula == nil { + // We return the error here not as part of the response object, to signal an error to the server, but avoid logging it as an error. + return nil, newNotFoundError() + } + return getMDMEULAMetadataResponse{MDMEULA: eula}, nil }