Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit ff97e0f

Browse files
Emyrkpull[bot]
authored andcommitted
chore: use system permission to prevent fetching all workspaces (#8843)
* chore: use system permission to prevent fetching all workspaces
1 parent d239840 commit ff97e0f

File tree

3 files changed

+12
-14
lines changed

3 files changed

+12
-14
lines changed

coderd/database/dbauthz/dbauthz.go

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -953,14 +953,9 @@ func (q *querier) GetLatestWorkspaceBuilds(ctx context.Context) ([]database.Work
953953
}
954954

955955
func (q *querier) GetLatestWorkspaceBuildsByWorkspaceIDs(ctx context.Context, ids []uuid.UUID) ([]database.WorkspaceBuild, error) {
956-
// This is not ideal as not all builds will be returned if the workspace cannot be read.
957-
// This should probably be handled differently? Maybe join workspace builds with workspace
958-
// ownership properties and filter on that.
959-
for _, id := range ids {
960-
_, err := q.GetWorkspaceByID(ctx, id)
961-
if err != nil {
962-
return nil, err
963-
}
956+
// This function is a system function until we implement a join for workspace builds.
957+
if err := q.authorizeContext(ctx, rbac.ActionRead, rbac.ResourceSystem); err != nil {
958+
return nil, err
964959
}
965960

966961
return q.db.GetLatestWorkspaceBuildsByWorkspaceIDs(ctx, ids)

coderd/database/dbauthz/dbauthz_test.go

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1024,11 +1024,6 @@ func (s *MethodTestSuite) TestWorkspace() {
10241024
b := dbgen.WorkspaceBuild(s.T(), db, database.WorkspaceBuild{WorkspaceID: ws.ID})
10251025
check.Args(ws.ID).Asserts(ws, rbac.ActionRead).Returns(b)
10261026
}))
1027-
s.Run("GetLatestWorkspaceBuildsByWorkspaceIDs", s.Subtest(func(db database.Store, check *expects) {
1028-
ws := dbgen.Workspace(s.T(), db, database.Workspace{})
1029-
b := dbgen.WorkspaceBuild(s.T(), db, database.WorkspaceBuild{WorkspaceID: ws.ID})
1030-
check.Args([]uuid.UUID{ws.ID}).Asserts(ws, rbac.ActionRead).Returns(slice.New(b))
1031-
}))
10321027
s.Run("GetWorkspaceAgentByID", s.Subtest(func(db database.Store, check *expects) {
10331028
ws := dbgen.Workspace(s.T(), db, database.Workspace{})
10341029
build := dbgen.WorkspaceBuild(s.T(), db, database.WorkspaceBuild{WorkspaceID: ws.ID, JobID: uuid.New()})
@@ -1298,6 +1293,11 @@ func (s *MethodTestSuite) TestSystemFunctions() {
12981293
LoginType: database.LoginTypeGithub,
12991294
}).Asserts(rbac.ResourceSystem, rbac.ActionUpdate).Returns(l)
13001295
}))
1296+
s.Run("GetLatestWorkspaceBuildsByWorkspaceIDs", s.Subtest(func(db database.Store, check *expects) {
1297+
ws := dbgen.Workspace(s.T(), db, database.Workspace{})
1298+
b := dbgen.WorkspaceBuild(s.T(), db, database.WorkspaceBuild{WorkspaceID: ws.ID})
1299+
check.Args([]uuid.UUID{ws.ID}).Asserts(rbac.ResourceSystem, rbac.ActionRead).Returns(slice.New(b))
1300+
}))
13011301
s.Run("UpsertDefaultProxy", s.Subtest(func(db database.Store, check *expects) {
13021302
check.Args(database.UpsertDefaultProxyParams{}).Asserts(rbac.ResourceSystem, rbac.ActionUpdate).Returns()
13031303
}))

coderd/workspaces.go

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ import (
1717
"cdr.dev/slog"
1818
"github.com/coder/coder/coderd/audit"
1919
"github.com/coder/coder/coderd/database"
20+
"github.com/coder/coder/coderd/database/dbauthz"
2021
"github.com/coder/coder/coderd/httpapi"
2122
"github.com/coder/coder/coderd/httpmw"
2223
"github.com/coder/coder/coderd/rbac"
@@ -1031,7 +1032,9 @@ func (api *API) workspaceData(ctx context.Context, workspaces []database.Workspa
10311032
return workspaceData{}, xerrors.Errorf("get templates: %w", err)
10321033
}
10331034

1034-
builds, err := api.Database.GetLatestWorkspaceBuildsByWorkspaceIDs(ctx, workspaceIDs)
1035+
// This query must be run as system restricted to be efficient.
1036+
// nolint:gocritic
1037+
builds, err := api.Database.GetLatestWorkspaceBuildsByWorkspaceIDs(dbauthz.AsSystemRestricted(ctx), workspaceIDs)
10351038
if err != nil && !errors.Is(err, sql.ErrNoRows) {
10361039
return workspaceData{}, xerrors.Errorf("get workspace builds: %w", err)
10371040
}

0 commit comments

Comments
 (0)