From 545bc6c69211cd40e68edd8c7dd434be2c4ea392 Mon Sep 17 00:00:00 2001 From: Ian Littman Date: Wed, 12 Nov 2025 08:09:49 -0600 Subject: [PATCH] Rename team DB methods to encourage lighter-weight usage (#35572) For #35357. # Checklist for submitter If some of the following don't apply, delete the relevant line. No changes file as this is a zero-functionality-change refactor. Performance improvements are in their own PR, which includes a changes file. - [x] Input data is properly validated, `SELECT *` is avoided, SQL injection is prevented (using placeholders for values in statements) ## Testing - [x] Added/updated automated tests - [ ] QA'd all new/changed functionality manually --- ee/server/service/calendar.go | 2 +- ee/server/service/maintained_apps.go | 2 +- ee/server/service/mdm.go | 12 ++++----- ee/server/service/orbit.go | 2 +- ee/server/service/setup_experience.go | 4 +-- ee/server/service/software_installers.go | 8 +++--- ee/server/service/teams.go | 16 ++++++------ ee/server/service/users.go | 2 +- ee/server/service/vpp.go | 4 +-- pkg/mdm/ota_enroll.go | 2 +- server/datastore/mysql/app_configs_test.go | 2 +- server/datastore/mysql/apple_mdm.go | 2 +- server/datastore/mysql/apple_mdm_test.go | 6 ++--- server/datastore/mysql/hosts.go | 2 +- server/datastore/mysql/microsoft_mdm_test.go | 2 +- server/datastore/mysql/software_installers.go | 4 +-- server/datastore/mysql/teams.go | 4 +-- server/datastore/mysql/teams_test.go | 26 +++++++++---------- server/datastore/mysql/vpp.go | 2 +- server/fleet/datastore.go | 10 +++---- server/mdm/apple/apple_mdm.go | 2 +- server/mock/datastore_mock.go | 4 +-- server/policies/failing_policies.go | 2 +- server/service/apple_mdm.go | 2 +- server/service/global_policies.go | 2 +- server/service/hosts.go | 4 +-- server/service/integration_enterprise_test.go | 2 +- server/service/integration_mdm_dep_test.go | 4 +-- .../service/integration_mdm_profiles_test.go | 10 +++---- server/service/mdm.go | 2 +- server/service/orbit.go | 4 +-- server/service/osquery.go | 6 ++--- server/service/queries.go | 2 +- server/service/setup_experience.go | 2 +- server/service/team_policies.go | 6 ++--- server/webhooks/host_status.go | 2 +- server/worker/apple_mdm.go | 2 +- server/worker/apple_mdm_test.go | 4 +-- server/worker/jira.go | 2 +- server/worker/macos_setup_assistant.go | 2 +- server/worker/zendesk.go | 2 +- 41 files changed, 91 insertions(+), 91 deletions(-) diff --git a/ee/server/service/calendar.go b/ee/server/service/calendar.go index 13237ab472..45c16bf961 100644 --- a/ee/server/service/calendar.go +++ b/ee/server/service/calendar.go @@ -180,7 +180,7 @@ func (svc *Service) processCalendarEvent(ctx context.Context, eventDetails *flee // This function is called when a new event is being created. var team *fleet.Team - team, err = svc.ds.TeamWithoutExtras(ctx, *eventDetails.TeamID) + team, err = svc.ds.TeamLite(ctx, *eventDetails.TeamID) if err != nil { return "", false, err } diff --git a/ee/server/service/maintained_apps.go b/ee/server/service/maintained_apps.go index 2da4548096..f7a184236c 100644 --- a/ee/server/service/maintained_apps.go +++ b/ee/server/service/maintained_apps.go @@ -192,7 +192,7 @@ func (svc *Service) AddFleetMaintainedApp( // Create activity var teamName *string if payload.TeamID != nil && *payload.TeamID != 0 { - t, err := svc.ds.Team(ctx, *payload.TeamID) + t, err := svc.ds.TeamWithExtras(ctx, *payload.TeamID) if err != nil { return 0, ctxerr.Wrap(ctx, err, "getting team") } diff --git a/ee/server/service/mdm.go b/ee/server/service/mdm.go index f64cd3db9f..ff588cfc2a 100644 --- a/ee/server/service/mdm.go +++ b/ee/server/service/mdm.go @@ -474,7 +474,7 @@ func (svc *Service) GetMDMAppleBootstrapPackageSummary(ctx context.Context, team } if teamID != nil { - _, err := svc.ds.Team(ctx, tmID) + _, err := svc.ds.TeamWithExtras(ctx, tmID) if err != nil { return &fleet.MDMAppleBootstrapPackageSummary{}, err } @@ -586,7 +586,7 @@ func (svc *Service) SetOrUpdateMDMAppleSetupAssistant(ctx context.Context, asst var tm *fleet.Team if asst.TeamID != nil { var err error - tm, err = svc.ds.Team(ctx, *asst.TeamID) + tm, err = svc.ds.TeamWithExtras(ctx, *asst.TeamID) if err != nil { return nil, ctxerr.Wrap(ctx, err, "get team") } @@ -691,7 +691,7 @@ func (svc *Service) DeleteMDMAppleSetupAssistant(ctx context.Context, teamID *ui var teamName *string if teamID != nil { - tm, err := svc.ds.Team(ctx, *teamID) + tm, err := svc.ds.TeamWithExtras(ctx, *teamID) if err != nil { return ctxerr.Wrap(ctx, err, "get team") } @@ -1493,7 +1493,7 @@ func (svc *Service) UpdateABMTokenTeams(ctx context.Context, tokenID uint, macOS token.IPadOSDefaultTeamID = nil if macOSTeamID != nil && *macOSTeamID != 0 { - macOSTeam, err := svc.ds.Team(ctx, *macOSTeamID) + macOSTeam, err := svc.ds.TeamWithExtras(ctx, *macOSTeamID) if err != nil { return nil, &fleet.BadRequestError{ Message: fmt.Sprintf("team with ID %d not found", *macOSTeamID), @@ -1507,7 +1507,7 @@ func (svc *Service) UpdateABMTokenTeams(ctx context.Context, tokenID uint, macOS } if iOSTeamID != nil && *iOSTeamID != 0 { - iOSTeam, err := svc.ds.Team(ctx, *iOSTeamID) + iOSTeam, err := svc.ds.TeamWithExtras(ctx, *iOSTeamID) if err != nil { return nil, &fleet.BadRequestError{ Message: fmt.Sprintf("team with ID %d not found", *iOSTeamID), @@ -1520,7 +1520,7 @@ func (svc *Service) UpdateABMTokenTeams(ctx context.Context, tokenID uint, macOS } if iPadOSTeamID != nil && *iPadOSTeamID != 0 { - iPadOSTeam, err := svc.ds.Team(ctx, *iPadOSTeamID) + iPadOSTeam, err := svc.ds.TeamWithExtras(ctx, *iPadOSTeamID) if err != nil { return nil, &fleet.BadRequestError{ Message: fmt.Sprintf("team with ID %d not found", *iPadOSTeamID), diff --git a/ee/server/service/orbit.go b/ee/server/service/orbit.go index 2c295802d2..d2ec84f3dc 100644 --- a/ee/server/service/orbit.go +++ b/ee/server/service/orbit.go @@ -307,7 +307,7 @@ func isDeviceReleasedManually(ctx context.Context, ds fleet.Datastore, host *fle } manualRelease = ac.MDM.MacOSSetup.EnableReleaseDeviceManually.Value } else { - tm, err := ds.Team(ctx, *host.TeamID) + tm, err := ds.TeamWithExtras(ctx, *host.TeamID) if err != nil { return false, ctxerr.Wrap(ctx, err, "get Team to read enable_release_device_manually") } diff --git a/ee/server/service/setup_experience.go b/ee/server/service/setup_experience.go index 62b0c1695d..cee96941e1 100644 --- a/ee/server/service/setup_experience.go +++ b/ee/server/service/setup_experience.go @@ -30,7 +30,7 @@ func (svc *Service) SetSetupExperienceSoftware(ctx context.Context, platform str return fleet.NewUserMessageError(errors.New("Couldn’t add setup experience software. To add software, first disable manual_agent_install."), http.StatusUnprocessableEntity) } } else { - team, err := svc.ds.Team(ctx, teamID) + team, err := svc.ds.TeamWithExtras(ctx, teamID) if err != nil { return ctxerr.Wrap(ctx, err, "load team") } @@ -109,7 +109,7 @@ func (svc *Service) SetSetupExperienceScript(ctx context.Context, teamID *uint, return fleet.NewUserMessageError(errors.New("Couldn’t add setup experience script. To add script, first disable manual_agent_install."), http.StatusUnprocessableEntity) } } else { - team, err := svc.ds.Team(ctx, *teamID) + team, err := svc.ds.TeamWithExtras(ctx, *teamID) if err != nil { return ctxerr.Wrap(ctx, err, "load team") } diff --git a/ee/server/service/software_installers.go b/ee/server/service/software_installers.go index 18762fd579..9128aa8205 100644 --- a/ee/server/service/software_installers.go +++ b/ee/server/service/software_installers.go @@ -139,7 +139,7 @@ func (svc *Service) UploadSoftwareInstaller(ctx context.Context, payload *fleet. var teamName *string if payload.TeamID != nil && *payload.TeamID != 0 { - t, err := svc.ds.Team(ctx, *payload.TeamID) + t, err := svc.ds.TeamWithExtras(ctx, *payload.TeamID) if err != nil { return nil, ctxerr.Wrap(ctx, err, "getting team name on upload software installer") } @@ -283,7 +283,7 @@ func (svc *Service) UpdateSoftwareInstaller(ctx context.Context, payload *fleet. var teamName *string if *payload.TeamID != 0 { - t, err := svc.ds.TeamWithoutExtras(ctx, *payload.TeamID) + t, err := svc.ds.TeamLite(ctx, *payload.TeamID) if err != nil { return nil, err } @@ -793,7 +793,7 @@ func (svc *Service) deleteVPPApp(ctx context.Context, teamID *uint, meta *fleet. var teamName *string if teamID != nil && *teamID != 0 { - t, err := svc.ds.Team(ctx, *teamID) + t, err := svc.ds.TeamWithExtras(ctx, *teamID) if err != nil { return ctxerr.Wrap(ctx, err, "getting team name for deleted VPP app") } @@ -843,7 +843,7 @@ func (svc *Service) deleteSoftwareInstaller(ctx context.Context, meta *fleet.Sof var teamName *string if meta.TeamID != nil { - t, err := svc.ds.Team(ctx, *meta.TeamID) + t, err := svc.ds.TeamWithExtras(ctx, *meta.TeamID) if err != nil { return ctxerr.Wrap(ctx, err, "getting team name for deleted software") } diff --git a/ee/server/service/teams.go b/ee/server/service/teams.go index 385cb242f2..b2533589f8 100644 --- a/ee/server/service/teams.go +++ b/ee/server/service/teams.go @@ -135,7 +135,7 @@ func (svc *Service) ModifyTeam(ctx context.Context, teamID uint, payload fleet.T return nil, err } - team, err := svc.ds.Team(ctx, teamID) + team, err := svc.ds.TeamWithExtras(ctx, teamID) if err != nil { return nil, err } @@ -462,7 +462,7 @@ func (svc *Service) ModifyTeamAgentOptions(ctx context.Context, teamID uint, tea return nil, err } - team, err := svc.ds.Team(ctx, teamID) + team, err := svc.ds.TeamWithExtras(ctx, teamID) if err != nil { return nil, err } @@ -531,7 +531,7 @@ func (svc *Service) AddTeamUsers(ctx context.Context, teamID uint, users []fleet } } - team, err := svc.ds.Team(ctx, teamID) + team, err := svc.ds.TeamWithExtras(ctx, teamID) if err != nil { return nil, err } @@ -564,7 +564,7 @@ func (svc *Service) DeleteTeamUsers(ctx context.Context, teamID uint, users []fl idMap[user.ID] = true } - team, err := svc.ds.Team(ctx, teamID) + team, err := svc.ds.TeamWithExtras(ctx, teamID) if err != nil { return nil, err } @@ -589,7 +589,7 @@ func (svc *Service) ListTeamUsers(ctx context.Context, teamID uint, opt fleet.Li return nil, err } - team, err := svc.ds.Team(ctx, teamID) + team, err := svc.ds.TeamWithExtras(ctx, teamID) if err != nil { return nil, err } @@ -647,7 +647,7 @@ func (svc *Service) DeleteTeam(ctx context.Context, teamID uint) error { return err } - team, err := svc.ds.Team(ctx, teamID) + team, err := svc.ds.TeamWithExtras(ctx, teamID) if err != nil { return err } @@ -775,7 +775,7 @@ func (svc *Service) GetTeam(ctx context.Context, teamID uint) (*fleet.Team, erro user = vc.User } - team, err := svc.ds.Team(ctx, teamID) + team, err := svc.ds.TeamWithExtras(ctx, teamID) if err != nil { return nil, err } @@ -856,7 +856,7 @@ func (svc *Service) teamByIDOrName(ctx context.Context, id *uint, name *string) err error ) if id != nil { - tm, err = svc.ds.Team(ctx, *id) + tm, err = svc.ds.TeamWithExtras(ctx, *id) if err != nil { return nil, err } diff --git a/ee/server/service/users.go b/ee/server/service/users.go index 7527b75014..a52d96d33a 100644 --- a/ee/server/service/users.go +++ b/ee/server/service/users.go @@ -156,7 +156,7 @@ func rolesChanged(oldGlobal *string, oldTeams []fleet.UserTeam, newGlobal *strin // to a `fleet.User` struct fields `GlobalRole` and `Teams` respectively. func (svc *Service) userRolesFromSSOAttributes(ctx context.Context, ssoRolesInfo fleet.SSORolesInfo) (globalRole *string, teamsRoles []fleet.UserTeam, err error) { for _, teamRole := range ssoRolesInfo.Teams { - team, err := svc.ds.Team(ctx, teamRole.ID) + team, err := svc.ds.TeamWithExtras(ctx, teamRole.ID) if err != nil { return nil, nil, ctxerr.Wrap(ctx, err, "invalid team") } diff --git a/ee/server/service/vpp.go b/ee/server/service/vpp.go index 5ff1a96797..51868e8ebd 100644 --- a/ee/server/service/vpp.go +++ b/ee/server/service/vpp.go @@ -362,7 +362,7 @@ func (svc *Service) AddAppStoreApp(ctx context.Context, teamID *uint, appID flee var teamName string if teamID != nil && *teamID != 0 { - tm, err := svc.ds.Team(ctx, *teamID) + tm, err := svc.ds.TeamWithExtras(ctx, *teamID) if fleet.IsNotFound(err) { return 0, fleet.NewInvalidArgumentError("team_id", fmt.Sprintf("team %d does not exist", *teamID)). WithStatus(http.StatusNotFound) @@ -560,7 +560,7 @@ func (svc *Service) UpdateAppStoreApp(ctx context.Context, titleID uint, teamID var teamName string if teamID != nil && *teamID != 0 { - tm, err := svc.ds.Team(ctx, *teamID) + tm, err := svc.ds.TeamWithExtras(ctx, *teamID) if fleet.IsNotFound(err) { return nil, fleet.NewInvalidArgumentError("team_id", fmt.Sprintf("team %d does not exist", *teamID)). WithStatus(http.StatusNotFound) diff --git a/pkg/mdm/ota_enroll.go b/pkg/mdm/ota_enroll.go index b9be9e5057..db6d35b351 100644 --- a/pkg/mdm/ota_enroll.go +++ b/pkg/mdm/ota_enroll.go @@ -30,7 +30,7 @@ func RequiresEnrollOTAAuthentication(ctx context.Context, ds fleet.AndroidDatast return noTeamIdPEnabled, nil } - tm, err := ds.Team(ctx, *secret.TeamID) + tm, err := ds.TeamWithExtras(ctx, *secret.TeamID) if err != nil { return false, ctxerr.Wrap(ctx, err, "get team for settings") } diff --git a/server/datastore/mysql/app_configs_test.go b/server/datastore/mysql/app_configs_test.go index 2bc198e5b7..827a543073 100644 --- a/server/datastore/mysql/app_configs_test.go +++ b/server/datastore/mysql/app_configs_test.go @@ -469,7 +469,7 @@ func testGetConfigEnableDiskEncryption(t *testing.T, ds *Datastore) { team1, err := ds.NewTeam(ctx, &fleet.Team{Name: "team1"}) require.NoError(t, err) - tm, err := ds.Team(ctx, team1.ID) + tm, err := ds.TeamWithExtras(ctx, team1.ID) require.NoError(t, err) require.NotNil(t, tm) require.False(t, tm.Config.MDM.EnableDiskEncryption) diff --git a/server/datastore/mysql/apple_mdm.go b/server/datastore/mysql/apple_mdm.go index b80002984d..0fc8ed53cb 100644 --- a/server/datastore/mysql/apple_mdm.go +++ b/server/datastore/mysql/apple_mdm.go @@ -6802,7 +6802,7 @@ LIMIT 1` } } else { // use the team settings - tm, err := ds.TeamWithoutExtras(ctx, *dest.TeamID) + tm, err := ds.TeamLite(ctx, *dest.TeamID) if err != nil { return nil, ctxerr.Wrap(ctx, err, "getting team os update settings") } diff --git a/server/datastore/mysql/apple_mdm_test.go b/server/datastore/mysql/apple_mdm_test.go index 85047bb144..e5fb7276bd 100644 --- a/server/datastore/mysql/apple_mdm_test.go +++ b/server/datastore/mysql/apple_mdm_test.go @@ -4643,7 +4643,7 @@ func TestCopyDefaultMDMAppleBootstrapPackage(t *testing.T) { } checkTeamConfig := func(teamID uint, wantURL string) { - tm, err := ds.Team(ctx, teamID) + tm, err := ds.TeamWithExtras(ctx, teamID) require.NoError(t, err) require.Equal(t, wantURL, tm.Config.MDM.MacOSSetup.BootstrapPackage.Value) } @@ -4745,7 +4745,7 @@ func TestCopyDefaultMDMAppleBootstrapPackage(t *testing.T) { checkTeamConfig(teamID, "https://example.com/bootstrap.pkg") // set other team config values so we can confirm they are not affected by bootstrap package changes - tc, err := ds.Team(ctx, teamID) + tc, err := ds.TeamWithExtras(ctx, teamID) require.NoError(t, err) tc.Config.MDM.MacOSSetup.MacOSSetupAssistant = optjson.SetString("/path/to/setupassistant") tc.Config.MDM.MacOSUpdates.Deadline = optjson.SetString("2024-01-01") @@ -4775,7 +4775,7 @@ func TestCopyDefaultMDMAppleBootstrapPackage(t *testing.T) { checkTeamConfig(teamID, "https://example.com/bs.pkg") // confirm other team config values are unchanged - tc, err = ds.Team(ctx, teamID) + tc, err = ds.TeamWithExtras(ctx, teamID) require.NoError(t, err) require.Equal(t, tc.Config.MDM.MacOSSetup.MacOSSetupAssistant.Value, "/path/to/setupassistant") require.Equal(t, tc.Config.MDM.MacOSUpdates.Deadline.Value, "2024-01-01") diff --git a/server/datastore/mysql/hosts.go b/server/datastore/mysql/hosts.go index 8d2539cac4..0bcbb738db 100644 --- a/server/datastore/mysql/hosts.go +++ b/server/datastore/mysql/hosts.go @@ -814,7 +814,7 @@ LIMIT }) } if host.TeamID != nil && len(hostTeamQueriesStats) > 0 { - team, err := ds.Team(ctx, *host.TeamID) + team, err := ds.TeamWithExtras(ctx, *host.TeamID) if err != nil { return nil, err } diff --git a/server/datastore/mysql/microsoft_mdm_test.go b/server/datastore/mysql/microsoft_mdm_test.go index 5123531515..e343d6239f 100644 --- a/server/datastore/mysql/microsoft_mdm_test.go +++ b/server/datastore/mysql/microsoft_mdm_test.go @@ -539,7 +539,7 @@ func testMDMWindowsDiskEncryption(t *testing.T, ds *Datastore) { team, err := ds.NewTeam(ctx, &fleet.Team{Name: "team"}) require.NoError(t, err) - tm, err := ds.Team(ctx, team.ID) + tm, err := ds.TeamWithExtras(ctx, team.ID) require.NoError(t, err) require.NotNil(t, tm) require.False(t, tm.Config.MDM.EnableDiskEncryption) // disk encryption is not enabled for team diff --git a/server/datastore/mysql/software_installers.go b/server/datastore/mysql/software_installers.go index 7a6c25ee99..b34e2b2ef9 100644 --- a/server/datastore/mysql/software_installers.go +++ b/server/datastore/mysql/software_installers.go @@ -233,7 +233,7 @@ func (ds *Datastore) MatchOrCreateSoftwareInstaller(ctx context.Context, payload if exists { teamName := fleet.TeamNameNoTeam if payload.TeamID != nil && *payload.TeamID > 0 { - tm, err := ds.Team(ctx, *payload.TeamID) + tm, err := ds.TeamWithExtras(ctx, *payload.TeamID) if err != nil { return 0, 0, ctxerr.Wrap(ctx, err, "get team for VPP app conflict error") } @@ -2191,7 +2191,7 @@ VALUES teamName := fleet.TeamNameNoTeam if tmID != nil { globalOrTeamID = *tmID - tm, err := ds.Team(ctx, *tmID) + tm, err := ds.TeamWithExtras(ctx, *tmID) if err != nil { return ctxerr.Wrap(ctx, err, "fetch team for batch set software installers") } diff --git a/server/datastore/mysql/teams.go b/server/datastore/mysql/teams.go index c79247d15f..0a0695b7cd 100644 --- a/server/datastore/mysql/teams.go +++ b/server/datastore/mysql/teams.go @@ -55,11 +55,11 @@ func (ds *Datastore) NewTeam(ctx context.Context, team *fleet.Team) (*fleet.Team return team, nil } -func (ds *Datastore) Team(ctx context.Context, tid uint) (*fleet.Team, error) { +func (ds *Datastore) TeamWithExtras(ctx context.Context, tid uint) (*fleet.Team, error) { return teamDB(ctx, ds.reader(ctx), tid, true) } -func (ds *Datastore) TeamWithoutExtras(ctx context.Context, tid uint) (*fleet.Team, error) { +func (ds *Datastore) TeamLite(ctx context.Context, tid uint) (*fleet.Team, error) { return teamDB(ctx, ds.reader(ctx), tid, false) } diff --git a/server/datastore/mysql/teams_test.go b/server/datastore/mysql/teams_test.go index e1a46bacc7..a27fe7a5dc 100644 --- a/server/datastore/mysql/teams_test.go +++ b/server/datastore/mysql/teams_test.go @@ -67,7 +67,7 @@ func testTeamsGetSetDelete(t *testing.T, ds *Datastore) { require.NoError(t, err) assert.NotZero(t, team.ID) - team, err = ds.Team(context.Background(), team.ID) + team, err = ds.TeamWithExtras(context.Background(), team.ID) require.NoError(t, err) assert.Equal(t, tt.name, team.Name) assert.Equal(t, tt.description, team.Description) @@ -214,7 +214,7 @@ func testTeamsUsers(t *testing.T, ds *Datastore) { team2, err := ds.NewTeam(context.Background(), &fleet.Team{Name: "team2"}) require.NoError(t, err) - team1, err = ds.Team(context.Background(), team1.ID) + team1, err = ds.TeamWithExtras(context.Background(), team1.ID) require.NoError(t, err) assert.Len(t, team1.Users, 0) @@ -226,11 +226,11 @@ func testTeamsUsers(t *testing.T, ds *Datastore) { team1, err = ds.SaveTeam(context.Background(), team1) require.NoError(t, err) - team1, err = ds.Team(context.Background(), team1.ID) + team1, err = ds.TeamWithExtras(context.Background(), team1.ID) require.NoError(t, err) require.ElementsMatch(t, team1Users, team1.Users) // Ensure team 2 not effected - team2, err = ds.Team(context.Background(), team2.ID) + team2, err = ds.TeamWithExtras(context.Background(), team2.ID) require.NoError(t, err) assert.Len(t, team2.Users, 0) @@ -240,7 +240,7 @@ func testTeamsUsers(t *testing.T, ds *Datastore) { team1.Users = team1Users team1, err = ds.SaveTeam(context.Background(), team1) require.NoError(t, err) - team1, err = ds.Team(context.Background(), team1.ID) + team1, err = ds.TeamWithExtras(context.Background(), team1.ID) require.NoError(t, err) assert.ElementsMatch(t, team1Users, team1.Users) @@ -250,12 +250,12 @@ func testTeamsUsers(t *testing.T, ds *Datastore) { team2.Users = team2Users team1, err = ds.SaveTeam(context.Background(), team1) require.NoError(t, err) - team1, err = ds.Team(context.Background(), team1.ID) + team1, err = ds.TeamWithExtras(context.Background(), team1.ID) require.NoError(t, err) assert.ElementsMatch(t, team1Users, team1.Users) team2, err = ds.SaveTeam(context.Background(), team2) require.NoError(t, err) - team2, err = ds.Team(context.Background(), team2.ID) + team2, err = ds.TeamWithExtras(context.Background(), team2.ID) require.NoError(t, err) assert.ElementsMatch(t, team2Users, team2.Users) } @@ -316,7 +316,7 @@ func testTeamsList(t *testing.T, ds *Datastore) { // Test that ds.Teams returns the same data as ds.ListTeams // (except list of users). for _, t1 := range teams { - t2, err := ds.Team(context.Background(), t1.ID) + t2, err := ds.TeamWithExtras(context.Background(), t1.ID) require.NoError(t, err) t2.Users = nil require.Equal(t, t1, t2) @@ -477,7 +477,7 @@ func testTeamsDeleteIntegrationsFromTeams(t *testing.T, ds *Datastore) { // expected values expected := [][]string{wantTm1, wantTm2, wantTm3} for i, id := range []uint{team1.ID, team2.ID, team3.ID} { - tm, err := ds.Team(ctx, id) + tm, err := ds.TeamWithExtras(ctx, id) require.NoError(t, err) var urls []string @@ -544,7 +544,7 @@ func testTeamsFeatures(t *testing.T, ds *Datastore) { // retrieving a team also returns a team with the default // features - team, err = ds.Team(ctx, team.ID) + team, err = ds.TeamWithExtras(ctx, team.ID) require.NoError(t, err) assert.Equal(t, defaultFeatures, team.Config.Features) @@ -571,7 +571,7 @@ func testTeamsFeatures(t *testing.T, ds *Datastore) { // retrieving a team also returns a team with the default // features - team, err = ds.Team(ctx, team.ID) + team, err = ds.TeamWithExtras(ctx, team.ID) require.NoError(t, err) assert.Equal(t, defaultFeatures, team.Config.Features) @@ -625,7 +625,7 @@ func testTeamsMDMConfig(t *testing.T, ds *Datastore) { // retrieving a team also returns a team with the default // settings - team, err = ds.Team(ctx, team.ID) + team, err = ds.TeamWithExtras(ctx, team.ID) require.NoError(t, err) assert.Equal(t, defaultMDM, team.Config.MDM) @@ -652,7 +652,7 @@ func testTeamsMDMConfig(t *testing.T, ds *Datastore) { // retrieving a team also returns a team with the default // settings - team, err = ds.Team(ctx, team.ID) + team, err = ds.TeamWithExtras(ctx, team.ID) require.NoError(t, err) assert.Equal(t, defaultMDM, team.Config.MDM) diff --git a/server/datastore/mysql/vpp.go b/server/datastore/mysql/vpp.go index f8b6f609d3..69a74c46bb 100644 --- a/server/datastore/mysql/vpp.go +++ b/server/datastore/mysql/vpp.go @@ -447,7 +447,7 @@ func (ds *Datastore) SetTeamVPPApps(ctx context.Context, teamID *uint, appFleets if len(toAddApps) > 0 { teamName = fleet.TeamNameNoTeam if teamID != nil && *teamID > 0 { - tm, err := ds.Team(ctx, *teamID) + tm, err := ds.TeamWithExtras(ctx, *teamID) if err != nil { return ctxerr.Wrap(ctx, err, "get team for VPP app conflict error") } diff --git a/server/fleet/datastore.go b/server/fleet/datastore.go index 192b93af4e..50d1d63504 100644 --- a/server/fleet/datastore.go +++ b/server/fleet/datastore.go @@ -553,10 +553,10 @@ type Datastore interface { NewTeam(ctx context.Context, team *Team) (*Team, error) // SaveTeam saves any changes to the team. SaveTeam(ctx context.Context, team *Team) (*Team, error) - // Team retrieves the Team by ID. - Team(ctx context.Context, tid uint) (*Team, error) - // TeamWithoutExtras retrieves the Team by ID without extra fields. - TeamWithoutExtras(ctx context.Context, tid uint) (*Team, error) + // TeamWithExtras retrieves the Team by ID, including extra fields. + TeamWithExtras(ctx context.Context, tid uint) (*Team, error) + // TeamLite retrieves a Team by ID, including only id, created_at, name, filename, description, config fields. + TeamLite(ctx context.Context, tid uint) (*Team, error) // DeleteTeam deletes the Team by ID. DeleteTeam(ctx context.Context, tid uint) error // TeamByName retrieves the Team by Name. @@ -2502,7 +2502,7 @@ type AndroidDatastore interface { GetMDMIdPAccountByUUID(ctx context.Context, uuid string) (*MDMIdPAccount, error) AssociateHostMDMIdPAccount(ctx context.Context, hostUUID, idpAcctUUID string) error TeamIDsWithSetupExperienceIdPEnabled(ctx context.Context) ([]uint, error) - Team(ctx context.Context, tid uint) (*Team, error) + TeamWithExtras(ctx context.Context, tid uint) (*Team, error) // BulkUpsertMDMAndroidHostProfiles bulk-adds/updates records to track the // status of a profile in a host. BulkUpsertMDMAndroidHostProfiles(ctx context.Context, payload []*MDMAndroidProfilePayload) error diff --git a/server/mdm/apple/apple_mdm.go b/server/mdm/apple/apple_mdm.go index 07ecb0e59d..04f3989d82 100644 --- a/server/mdm/apple/apple_mdm.go +++ b/server/mdm/apple/apple_mdm.go @@ -908,7 +908,7 @@ func (d *DEPService) processDeviceResponse( func (d *DEPService) getProfileUUIDForTeam(ctx context.Context, tmID *uint, abmTokenOrgName string) (string, error) { var appleBMTeam *fleet.Team if tmID != nil { - tm, err := d.ds.Team(ctx, *tmID) + tm, err := d.ds.TeamWithExtras(ctx, *tmID) if err != nil && !fleet.IsNotFound(err) { return "", ctxerr.Wrap(ctx, err, "get team") } diff --git a/server/mock/datastore_mock.go b/server/mock/datastore_mock.go index 4e27174d89..90026efb1d 100644 --- a/server/mock/datastore_mock.go +++ b/server/mock/datastore_mock.go @@ -5356,14 +5356,14 @@ func (s *DataStore) SaveTeam(ctx context.Context, team *fleet.Team) (*fleet.Team return s.SaveTeamFunc(ctx, team) } -func (s *DataStore) Team(ctx context.Context, tid uint) (*fleet.Team, error) { +func (s *DataStore) TeamWithExtras(ctx context.Context, tid uint) (*fleet.Team, error) { s.mu.Lock() s.TeamFuncInvoked = true s.mu.Unlock() return s.TeamFunc(ctx, tid) } -func (s *DataStore) TeamWithoutExtras(ctx context.Context, tid uint) (*fleet.Team, error) { +func (s *DataStore) TeamLite(ctx context.Context, tid uint) (*fleet.Team, error) { s.mu.Lock() s.TeamWithoutExtrasFuncInvoked = true s.mu.Unlock() diff --git a/server/policies/failing_policies.go b/server/policies/failing_policies.go index 27f8004bee..e88cb66bcd 100644 --- a/server/policies/failing_policies.go +++ b/server/policies/failing_policies.go @@ -207,7 +207,7 @@ func makeTeamConfigCache(ds fleet.Datastore, globalIntgs fleet.Integrations) fun return cfg, nil } - team, err := ds.Team(ctx, teamID) + team, err := ds.TeamWithExtras(ctx, teamID) if err != nil { return cfg, ctxerr.Wrapf(ctx, err, "get team: %d", teamID) } diff --git a/server/service/apple_mdm.go b/server/service/apple_mdm.go index 53c54dff60..60baa8d6ad 100644 --- a/server/service/apple_mdm.go +++ b/server/service/apple_mdm.go @@ -1043,7 +1043,7 @@ func (svc *Service) ListMDMAppleConfigProfiles(ctx context.Context, teamID uint) if teamID >= 1 { // confirm that team exists - if _, err := svc.ds.Team(ctx, teamID); err != nil { + if _, err := svc.ds.TeamWithExtras(ctx, teamID); err != nil { return nil, ctxerr.Wrap(ctx, err) } } diff --git a/server/service/global_policies.go b/server/service/global_policies.go index 10d7d16eb2..9241c5c98d 100644 --- a/server/service/global_policies.go +++ b/server/service/global_policies.go @@ -413,7 +413,7 @@ func (svc *Service) ResetAutomation(ctx context.Context, teamIDs, policyIDs []ui if err := svc.authz.Authorize(ctx, &fleet.Team{ID: id}, fleet.ActionWrite); err != nil { return err } - t, err := svc.ds.Team(ctx, id) + t, err := svc.ds.TeamWithExtras(ctx, id) if err != nil { return err } diff --git a/server/service/hosts.go b/server/service/hosts.go index c7b19978f0..197f9c2aad 100644 --- a/server/service/hosts.go +++ b/server/service/hosts.go @@ -961,7 +961,7 @@ func (svc *Service) createTransferredHostsActivity(ctx context.Context, teamID * var teamName *string if teamID != nil { - tm, err := svc.ds.Team(ctx, *teamID) + tm, err := svc.ds.TeamWithExtras(ctx, *teamID) if err != nil { return ctxerr.Wrap(ctx, err, "get team for activity") } @@ -1894,7 +1894,7 @@ func (svc *Service) AggregatedMacadminsData(ctx context.Context, teamID *uint) ( } if teamID != nil { - _, err := svc.ds.Team(ctx, *teamID) + _, err := svc.ds.TeamWithExtras(ctx, *teamID) if err != nil { return nil, err } diff --git a/server/service/integration_enterprise_test.go b/server/service/integration_enterprise_test.go index 0dcb7bbeba..feefe97ec4 100644 --- a/server/service/integration_enterprise_test.go +++ b/server/service/integration_enterprise_test.go @@ -821,7 +821,7 @@ func (s *integrationEnterpriseTestSuite) TestTeamSpecsPermissions() { }, } s.Do("POST", "/api/latest/fleet/spec/teams", editTeam1Spec, http.StatusOK) - team1b, err := s.ds.Team(context.Background(), team1.ID) + team1b, err := s.ds.TeamWithExtras(context.Background(), team1.ID) require.NoError(t, err) require.Equal(t, *team1b.Config.AgentOptions, agentOpts) diff --git a/server/service/integration_mdm_dep_test.go b/server/service/integration_mdm_dep_test.go index 7ace3ed657..8c462a8a0b 100644 --- a/server/service/integration_mdm_dep_test.go +++ b/server/service/integration_mdm_dep_test.go @@ -449,7 +449,7 @@ func (s *integrationMDMTestSuite) runDEPEnrollReleaseDeviceTest(t *testing.T, de if opts.TeamID != nil { payload["team_id"] = *opts.TeamID if opts.BootstrapPackage { - team, err := s.ds.Team(ctx, *opts.TeamID) + team, err := s.ds.TeamWithExtras(ctx, *opts.TeamID) require.NoError(t, err) team.Config.MDM.MacOSSetup.BootstrapPackage = optjson.SetString("bootstrap.pkg") @@ -470,7 +470,7 @@ func (s *integrationMDMTestSuite) runDEPEnrollReleaseDeviceTest(t *testing.T, de // Get back to the default state. if opts.BootstrapPackage { if opts.TeamID != nil { - team, err := s.ds.Team(ctx, *opts.TeamID) + team, err := s.ds.TeamWithExtras(ctx, *opts.TeamID) require.NoError(t, err) team.Config.MDM.MacOSSetup.BootstrapPackage = optjson.String{} diff --git a/server/service/integration_mdm_profiles_test.go b/server/service/integration_mdm_profiles_test.go index e96418336b..46d810db79 100644 --- a/server/service/integration_mdm_profiles_test.go +++ b/server/service/integration_mdm_profiles_test.go @@ -1421,7 +1421,7 @@ func (s *integrationMDMTestSuite) TestPuppetMatchPreassignProfiles() { h, err := s.ds.Host(ctx, mdmHost.ID) require.NoError(t, err) require.NotNil(t, h.TeamID) - tm1, err := s.ds.Team(ctx, *h.TeamID) + tm1, err := s.ds.TeamWithExtras(ctx, *h.TeamID) require.NoError(t, err) require.Equal(t, "g1", tm1.Name) require.True(t, tm1.Config.MDM.EnableDiskEncryption) @@ -1529,7 +1529,7 @@ func (s *integrationMDMTestSuite) TestPuppetMatchPreassignProfiles() { require.NotNil(t, h.TeamID) require.Equal(t, tm2.ID, *h.TeamID) // tm2 still has disk encryption and release device manually disabled - tm2, err = s.ds.Team(ctx, *h.TeamID) + tm2, err = s.ds.TeamWithExtras(ctx, *h.TeamID) require.NoError(t, err) require.False(t, tm2.Config.MDM.EnableDiskEncryption) require.False(t, tm2.Config.MDM.MacOSSetup.EnableReleaseDeviceManually.Value) @@ -1734,7 +1734,7 @@ func (s *integrationMDMTestSuite) TestPuppetRun() { require.NotNil(t, h1.TeamID) // the team has the right name - tm1, err := s.ds.Team(ctx, *h1.TeamID) + tm1, err := s.ds.TeamWithExtras(ctx, *h1.TeamID) require.NoError(t, err) require.Equal(t, "base - workstations", tm1.Name) // and the right profiles @@ -1754,7 +1754,7 @@ func (s *integrationMDMTestSuite) TestPuppetRun() { require.NotNil(t, h2.TeamID) // the team has the right name - tm2, err := s.ds.Team(ctx, *h2.TeamID) + tm2, err := s.ds.TeamWithExtras(ctx, *h2.TeamID) require.NoError(t, err) require.Equal(t, "base - kiosks - workstations", tm2.Name) // and the right profiles @@ -1982,7 +1982,7 @@ func (s *integrationMDMTestSuite) TestPuppetRun() { require.NotEqual(t, tm2.ID, *h3.TeamID) // a new team is created - tm3, err := s.ds.Team(ctx, *h3.TeamID) + tm3, err := s.ds.TeamWithExtras(ctx, *h3.TeamID) require.NoError(t, err) require.Equal(t, "base - no-nudge - workstations", tm3.Name) // and the right profiles diff --git a/server/service/mdm.go b/server/service/mdm.go index c80c970af2..ae8627a41e 100644 --- a/server/service/mdm.go +++ b/server/service/mdm.go @@ -2593,7 +2593,7 @@ func (svc *Service) ListMDMConfigProfiles(ctx context.Context, teamID *uint, opt if teamID != nil && *teamID > 0 { // confirm that team exists - if _, err := svc.ds.Team(ctx, *teamID); err != nil { + if _, err := svc.ds.TeamWithExtras(ctx, *teamID); err != nil { return nil, nil, ctxerr.Wrap(ctx, err) } } diff --git a/server/service/orbit.go b/server/service/orbit.go index ba60bd37c7..ab35d11407 100644 --- a/server/service/orbit.go +++ b/server/service/orbit.go @@ -180,7 +180,7 @@ func (svc *Service) EnrollOrbit(ctx context.Context, hostInfo fleet.OrbitHostInf isEndUserAuthRequired := appConfig.MDM.MacOSSetup.EnableEndUserAuthentication // If the secret is for a team, get the team config as well. if secret.TeamID != nil { - team, err := svc.ds.Team(ctx, *secret.TeamID) + team, err := svc.ds.TeamWithExtras(ctx, *secret.TeamID) if err != nil { return "", fleet.OrbitError{Message: "failed to get team config: " + err.Error()} } @@ -561,7 +561,7 @@ func (svc *Service) processReleaseDeviceForOldFleetd(ctx context.Context, host * } manualRelease = ac.MDM.MacOSSetup.EnableReleaseDeviceManually.Value } else { - tm, err := svc.ds.Team(ctx, *host.TeamID) + tm, err := svc.ds.TeamWithExtras(ctx, *host.TeamID) if err != nil { return ctxerr.Wrap(ctx, err, "get Team to read enable_release_device_manually") } diff --git a/server/service/osquery.go b/server/service/osquery.go index e7d25b0841..bd16eeda50 100644 --- a/server/service/osquery.go +++ b/server/service/osquery.go @@ -1159,7 +1159,7 @@ func (svc *Service) SubmitDistributedQueryResults( if host.TeamID != nil { teamID = *host.TeamID } - team, err := svc.ds.TeamWithoutExtras(ctx, teamID) + team, err := svc.ds.TeamLite(ctx, teamID) if err != nil { logging.WithErr(ctx, err) } else if teamPolicyAutomationsEnabled(team.Config.WebhookSettings, team.Config.Integrations) { @@ -1268,7 +1268,7 @@ func processCalendarPolicies( return nil } - team, err := ds.Team(ctx, *host.TeamID) + team, err := ds.TeamWithExtras(ctx, *host.TeamID) if err != nil { return ctxerr.Wrap(ctx, err, "load host team") } @@ -2439,7 +2439,7 @@ func (svc *Service) conditionalAccessConfiguredAndEnabledForTeam(ctx context.Con } // Host belongs to a team, thus we load the team configuration. - team, err := svc.ds.TeamWithoutExtras(ctx, *hostTeamID) + team, err := svc.ds.TeamLite(ctx, *hostTeamID) if err != nil { return false, false, ctxerr.Wrap(ctx, err, "failed to load team config") } diff --git a/server/service/queries.go b/server/service/queries.go index 6bb3fb52ba..b80db2f861 100644 --- a/server/service/queries.go +++ b/server/service/queries.go @@ -925,7 +925,7 @@ func (svc *Service) GetQuerySpecs(ctx context.Context, teamID *uint) ([]*fleet.Q func (svc *Service) specFromQuery(ctx context.Context, query *fleet.Query) (*fleet.QuerySpec, error) { var teamName string if query.TeamID != nil { - team, err := svc.ds.Team(ctx, *query.TeamID) + team, err := svc.ds.TeamWithExtras(ctx, *query.TeamID) if err != nil { return nil, ctxerr.Wrap(ctx, err, "get team from id") } diff --git a/server/service/setup_experience.go b/server/service/setup_experience.go index 50da71760a..b79ea37a79 100644 --- a/server/service/setup_experience.go +++ b/server/service/setup_experience.go @@ -244,7 +244,7 @@ func isAllSetupExperienceSoftwareRequired(ctx context.Context, ds fleet.Datastor } requireAllSoftware = ac.MDM.MacOSSetup.RequireAllSoftware } else { - team, err := ds.Team(ctx, *teamID) + team, err := ds.TeamWithExtras(ctx, *teamID) if err != nil { return false, ctxerr.Wrap(ctx, err, "load team") } diff --git a/server/service/team_policies.go b/server/service/team_policies.go index ac8832f151..d16d0d1563 100644 --- a/server/service/team_policies.go +++ b/server/service/team_policies.go @@ -255,7 +255,7 @@ func (svc *Service) ListTeamPolicies(ctx context.Context, teamID uint, opts flee } if teamID > 0 { - if _, err := svc.ds.Team(ctx, teamID); err != nil { + if _, err := svc.ds.TeamWithExtras(ctx, teamID); err != nil { return nil, nil, ctxerr.Wrapf(ctx, err, "loading team %d", teamID) } } @@ -326,7 +326,7 @@ func (svc *Service) CountTeamPolicies(ctx context.Context, teamID uint, matchQue } if teamID > 0 { - if _, err := svc.ds.Team(ctx, teamID); err != nil { + if _, err := svc.ds.TeamWithExtras(ctx, teamID); err != nil { return 0, ctxerr.Wrapf(ctx, err, "loading team %d", teamID) } } @@ -422,7 +422,7 @@ func (svc Service) DeleteTeamPolicies(ctx context.Context, teamID uint, ids []ui } if teamID > 0 { - if _, err := svc.ds.Team(ctx, teamID); err != nil { + if _, err := svc.ds.TeamWithExtras(ctx, teamID); err != nil { return nil, ctxerr.Wrapf(ctx, err, "loading team %d", teamID) } } diff --git a/server/webhooks/host_status.go b/server/webhooks/host_status.go index a3407c86df..82168ec9de 100644 --- a/server/webhooks/host_status.go +++ b/server/webhooks/host_status.go @@ -85,7 +85,7 @@ func triggerTeamHostStatusWebhook(ctx context.Context, ds fleet.Datastore, logge multiErr := &multierror.Error{} for _, teamSummary := range teams { id := teamSummary.ID - team, err := ds.Team(ctx, id) + team, err := ds.TeamWithExtras(ctx, id) if err != nil { multiErr = multierror.Append(multiErr, ctxerr.Wrap(ctx, err, "getting team")) continue diff --git a/server/worker/apple_mdm.go b/server/worker/apple_mdm.go index 054e0ca987..9e6a9d2a25 100644 --- a/server/worker/apple_mdm.go +++ b/server/worker/apple_mdm.go @@ -240,7 +240,7 @@ func (a *AppleMDM) runPostDEPEnrollment(ctx context.Context, args appleMDMArgs) func (a *AppleMDM) getTeamConfig(ctx context.Context, team *fleet.Team, teamID uint) (*fleet.Team, error) { if team == nil { var err error - team, err = a.Datastore.Team(ctx, teamID) + team, err = a.Datastore.TeamWithExtras(ctx, teamID) if err != nil { return nil, ctxerr.Wrap(ctx, err, "fetch team to send AccountConfiguration") } diff --git a/server/worker/apple_mdm_test.go b/server/worker/apple_mdm_test.go index 6021b07698..477dbfa5df 100644 --- a/server/worker/apple_mdm_test.go +++ b/server/worker/apple_mdm_test.go @@ -171,7 +171,7 @@ func TestAppleMDM(t *testing.T) { t.Cleanup(func() { enableAppCfg(false) }) } else { enableTm := func(enable bool) { - tm, err := ds.Team(ctx, *teamID) + tm, err := ds.TeamWithExtras(ctx, *teamID) require.NoError(t, err) tm.Config.MDM.MacOSSetup.EnableReleaseDeviceManually = optjson.SetBool(enable) _, err = ds.SaveTeam(ctx, tm) @@ -553,7 +553,7 @@ func TestAppleMDM(t *testing.T) { tm, err := ds.NewTeam(ctx, &fleet.Team{Name: "test"}) require.NoError(t, err) - tm, err = ds.Team(ctx, tm.ID) + tm, err = ds.TeamWithExtras(ctx, tm.ID) require.NoError(t, err) tm.Config.MDM.MacOSSetup.EnableEndUserAuthentication = true _, err = ds.SaveTeam(ctx, tm) diff --git a/server/worker/jira.go b/server/worker/jira.go index ef257a39bf..206366028c 100644 --- a/server/worker/jira.go +++ b/server/worker/jira.go @@ -161,7 +161,7 @@ func (j *Jira) getClient(ctx context.Context, args jiraArgs) (JiraClient, error) // configuration has changed since it was created. var opts *externalsvc.JiraOptions if useTeamCfg { - tm, err := j.Datastore.TeamWithoutExtras(ctx, teamID) + tm, err := j.Datastore.TeamLite(ctx, teamID) if err != nil { return nil, err } diff --git a/server/worker/macos_setup_assistant.go b/server/worker/macos_setup_assistant.go index cbc6082dde..cceae44e7f 100644 --- a/server/worker/macos_setup_assistant.go +++ b/server/worker/macos_setup_assistant.go @@ -348,7 +348,7 @@ func (m *MacosSetupAssistant) runUpdateProfile(ctx context.Context, args macosSe func (m *MacosSetupAssistant) getTeamNoTeam(ctx context.Context, tmID *uint) (*fleet.Team, error) { var team *fleet.Team if tmID != nil { - tm, err := m.Datastore.Team(ctx, *tmID) + tm, err := m.Datastore.TeamWithExtras(ctx, *tmID) if err != nil { return nil, err } diff --git a/server/worker/zendesk.go b/server/worker/zendesk.go index b64790a3e9..5283e202a7 100644 --- a/server/worker/zendesk.go +++ b/server/worker/zendesk.go @@ -157,7 +157,7 @@ func (z *Zendesk) getClient(ctx context.Context, args zendeskArgs) (ZendeskClien // configuration has changed since it was created. var opts *externalsvc.ZendeskOptions if useTeamCfg { - tm, err := z.Datastore.TeamWithoutExtras(ctx, teamID) + tm, err := z.Datastore.TeamLite(ctx, teamID) if err != nil { return nil, err }