diff --git a/server/datastore/mysql/software_titles.go b/server/datastore/mysql/software_titles.go index bd98f58b03..44c9c02d69 100644 --- a/server/datastore/mysql/software_titles.go +++ b/server/datastore/mysql/software_titles.go @@ -204,7 +204,7 @@ SELECT MAX(COALESCE(sthc.updated_at, date('0001-01-01 00:00:00'))) as counts_updated_at, si.filename as software_package FROM software_titles st -LEFT JOIN software_installers si ON si.title_id = st.id +LEFT JOIN software_installers si ON si.title_id = st.id AND si.team_id = ? LEFT JOIN software_titles_host_counts sthc ON sthc.software_title_id = st.id AND sthc.team_id = ? -- placeholder for JOIN on software/software_cve %s @@ -220,9 +220,10 @@ GROUP BY st.id, software_package` } var globalOrTeamID uint - args := []any{0} + args := []any{0, 0} if opt.TeamID != nil { args[0] = *opt.TeamID + args[1] = *opt.TeamID globalOrTeamID = *opt.TeamID } diff --git a/server/service/integration_enterprise_test.go b/server/service/integration_enterprise_test.go index e5a7aca8b7..0f260e6b3f 100644 --- a/server/service/integration_enterprise_test.go +++ b/server/service/integration_enterprise_test.go @@ -7623,6 +7623,7 @@ func (s *integrationEnterpriseTestSuite) TestAllSoftwareTitles() { payload := &fleet.UploadSoftwareInstallerPayload{ InstallScript: "install", Filename: "ruby.deb", + TeamID: &team1.ID, } s.uploadSoftwareInstaller(payload, http.StatusOK, "") @@ -7632,6 +7633,30 @@ func (s *integrationEnterpriseTestSuite) TestAllSoftwareTitles() { listSoftwareTitlesRequest{}, http.StatusOK, &resp, "query", "ruby", + "team_id", fmt.Sprintf("%d", team1.ID), + ) + + require.Len(t, resp.SoftwareTitles, 1) + require.NotNil(t, resp.SoftwareTitles[0].SoftwarePackage) + require.Equal(t, "ruby.deb", *resp.SoftwareTitles[0].SoftwarePackage) + + // Upload an installer for the same software but different arch to a different team + payload = &fleet.UploadSoftwareInstallerPayload{ + InstallScript: "install", + Filename: "ruby_arm64.deb", + TeamID: &team2.ID, + } + s.uploadSoftwareInstaller(payload, http.StatusOK, "") + + // We should only see the one we uploaded to team 1 + + resp = listSoftwareTitlesResponse{} + s.DoJSON( + "GET", "/api/latest/fleet/software/titles", + listSoftwareTitlesRequest{}, + http.StatusOK, &resp, + "query", "ruby", + "team_id", fmt.Sprintf("%d", team1.ID), ) require.Len(t, resp.SoftwareTitles, 1) diff --git a/server/service/testdata/software-installers/ruby_arm64.deb b/server/service/testdata/software-installers/ruby_arm64.deb new file mode 100644 index 0000000000..b8ac63e044 Binary files /dev/null and b/server/service/testdata/software-installers/ruby_arm64.deb differ