Skip to content

Commit e822677

Browse files
jdomeracki-codersreyaf0ssel
authored
fix: require update permission to recreate devcontainers (#25812) (#26258)
Cherry-pick backport to `release/2.34`. Co-authored-by: Jon Ayers <jon@coder.com> Co-authored-by: Garrett Delfosse <delfossegarrett@gmail.com>
1 parent 6879532 commit e822677

2 files changed

Lines changed: 50 additions & 0 deletions

File tree

coderd/workspaceagents.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1096,6 +1096,11 @@ func (api *API) workspaceAgentRecreateDevcontainer(rw http.ResponseWriter, r *ht
10961096
ctx := r.Context()
10971097
waws := httpmw.WorkspaceAgentAndWorkspaceParam(r)
10981098

1099+
if !api.Authorize(r, policy.ActionUpdate, waws.WorkspaceTable) {
1100+
httpapi.Forbidden(rw)
1101+
return
1102+
}
1103+
10991104
devcontainer := chi.URLParam(r, "devcontainer")
11001105
if devcontainer == "" {
11011106
httpapi.Write(ctx, rw, http.StatusBadRequest, codersdk.Response{

coderd/workspaceagents_test.go

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1876,6 +1876,51 @@ func TestWorkspaceAgentRecreateDevcontainer(t *testing.T) {
18761876
})
18771877
}
18781878

1879+
func TestWorkspaceAgentRecreateDevcontainerAuthorization(t *testing.T) {
1880+
t.Parallel()
1881+
1882+
for _, tc := range []struct {
1883+
name string
1884+
role func(uuid.UUID) rbac.RoleIdentifier
1885+
}{
1886+
{
1887+
name: "TemplateAdmin",
1888+
role: func(uuid.UUID) rbac.RoleIdentifier {
1889+
return rbac.RoleTemplateAdmin()
1890+
},
1891+
},
1892+
{
1893+
name: "OrgTemplateAdmin",
1894+
role: rbac.ScopedRoleOrgTemplateAdmin,
1895+
},
1896+
} {
1897+
t.Run(tc.name, func(t *testing.T) {
1898+
t.Parallel()
1899+
1900+
var (
1901+
ctx = testutil.Context(t, testutil.WaitMedium)
1902+
client, db = coderdtest.NewWithDatabase(t, nil)
1903+
admin = coderdtest.CreateFirstUser(t, client)
1904+
_, workspaceOwner = coderdtest.CreateAnotherUser(t, client, admin.OrganizationID)
1905+
templateAdminClient, _ = coderdtest.CreateAnotherUser(t, client, admin.OrganizationID, tc.role(admin.OrganizationID))
1906+
workspace = dbfake.WorkspaceBuild(t, db, database.WorkspaceTable{
1907+
OrganizationID: admin.OrganizationID,
1908+
OwnerID: workspaceOwner.ID,
1909+
}).WithAgent(func(agents []*proto.Agent) []*proto.Agent {
1910+
return agents
1911+
}).Do()
1912+
)
1913+
1914+
_, err := templateAdminClient.WorkspaceAgentRecreateDevcontainer(ctx, workspace.Agents[0].ID, uuid.NewString())
1915+
require.Error(t, err)
1916+
1917+
var sdkErr *codersdk.Error
1918+
require.ErrorAs(t, err, &sdkErr)
1919+
require.Equal(t, http.StatusForbidden, sdkErr.StatusCode())
1920+
})
1921+
}
1922+
}
1923+
18791924
func TestWorkspaceAgentDeleteDevcontainer(t *testing.T) {
18801925
t.Parallel()
18811926

0 commit comments

Comments
 (0)