@@ -2,6 +2,7 @@ package coderd_test
2
2
3
3
import (
4
4
"context"
5
+ "io"
5
6
"net/http"
6
7
"strings"
7
8
"testing"
@@ -48,13 +49,18 @@ func TestAuthorizeAllEndpoints(t *testing.T) {
48
49
coderdtest .AwaitTemplateVersionJob (t , client , version .ID )
49
50
template := coderdtest .CreateTemplate (t , client , admin .OrganizationID , version .ID )
50
51
workspace := coderdtest .CreateWorkspace (t , client , admin .OrganizationID , template .ID )
52
+ coderdtest .AwaitWorkspaceBuildJob (t , client , workspace .LatestBuild .ID )
51
53
52
54
// Always fail auth from this point forward
53
55
authorizer .AlwaysReturn = rbac .ForbiddenWithInternal (xerrors .New ("fake implementation" ), nil , nil )
54
56
57
+ // Some quick reused objects
58
+ workspaceRBACObj := rbac .ResourceWorkspace .InOrg (organization .ID ).WithID (workspace .ID .String ()).WithOwner (workspace .OwnerID .String ())
59
+
55
60
// skipRoutes allows skipping routes from being checked.
56
61
type routeCheck struct {
57
62
NoAuthorize bool
63
+ AssertAction rbac.Action
58
64
AssertObject rbac.Object
59
65
StatusCode int
60
66
}
@@ -85,13 +91,7 @@ func TestAuthorizeAllEndpoints(t *testing.T) {
85
91
"GET:/api/v2/workspaceagents/{workspaceagent}/turn" : {NoAuthorize : true },
86
92
87
93
// TODO: @emyrk these need to be fixed by adding authorize calls
88
- "GET:/api/v2/workspaceresources/{workspaceresource}" : {NoAuthorize : true },
89
- "GET:/api/v2/workspacebuilds/{workspacebuild}" : {NoAuthorize : true },
90
- "GET:/api/v2/workspacebuilds/{workspacebuild}/logs" : {NoAuthorize : true },
91
- "GET:/api/v2/workspacebuilds/{workspacebuild}/resources" : {NoAuthorize : true },
92
- "GET:/api/v2/workspacebuilds/{workspacebuild}/state" : {NoAuthorize : true },
93
- "PATCH:/api/v2/workspacebuilds/{workspacebuild}/cancel" : {NoAuthorize : true },
94
- "GET:/api/v2/workspaces/{workspace}/builds/{workspacebuildname}" : {NoAuthorize : true },
94
+ "GET:/api/v2/workspaceresources/{workspaceresource}" : {NoAuthorize : true },
95
95
96
96
"GET:/api/v2/users/oauth2/github/callback" : {NoAuthorize : true },
97
97
@@ -125,12 +125,6 @@ func TestAuthorizeAllEndpoints(t *testing.T) {
125
125
126
126
"POST:/api/v2/users/{user}/organizations" : {NoAuthorize : true },
127
127
128
- "GET:/api/v2/workspaces/{workspace}" : {NoAuthorize : true },
129
- "PUT:/api/v2/workspaces/{workspace}/autostart" : {NoAuthorize : true },
130
- "PUT:/api/v2/workspaces/{workspace}/autostop" : {NoAuthorize : true },
131
- "GET:/api/v2/workspaces/{workspace}/builds" : {NoAuthorize : true },
132
- "POST:/api/v2/workspaces/{workspace}/builds" : {NoAuthorize : true },
133
-
134
128
"POST:/api/v2/files" : {NoAuthorize : true },
135
129
"GET:/api/v2/files/{hash}" : {NoAuthorize : true },
136
130
@@ -139,13 +133,55 @@ func TestAuthorizeAllEndpoints(t *testing.T) {
139
133
"GET:/api/v2/users/{user}/organizations" : {StatusCode : http .StatusOK , AssertObject : rbac .ResourceOrganization },
140
134
"GET:/api/v2/users/{user}/workspaces" : {StatusCode : http .StatusOK , AssertObject : rbac .ResourceWorkspace },
141
135
"GET:/api/v2/organizations/{organization}/workspaces/{user}" : {StatusCode : http .StatusOK , AssertObject : rbac .ResourceWorkspace },
142
- "GET:/api/v2/organizations/{organization}/workspaces/{user}/{workspace}" : {
143
- AssertObject : rbac .ResourceWorkspace .InOrg (organization .ID ).WithID (workspace .ID .String ()).WithOwner (workspace .OwnerID .String ()),
136
+ "GET:/api/v2/workspaces/{workspace}/builds/{workspacebuildname}" : {
137
+ AssertAction : rbac .ActionRead ,
138
+ AssertObject : workspaceRBACObj ,
139
+ },
140
+ "GET:/api/v2/organizations/{organization}/workspaces/{user}/{workspacename}" : {
141
+ AssertAction : rbac .ActionRead ,
142
+ AssertObject : workspaceRBACObj ,
144
143
},
145
144
"GET:/api/v2/organizations/{organization}/workspaces" : {StatusCode : http .StatusOK , AssertObject : rbac .ResourceWorkspace },
145
+ "GET:/api/v2/workspacebuilds/{workspacebuild}" : {
146
+ AssertAction : rbac .ActionRead ,
147
+ AssertObject : workspaceRBACObj ,
148
+ },
149
+ "GET:/api/v2/workspacebuilds/{workspacebuild}/logs" : {
150
+ AssertAction : rbac .ActionRead ,
151
+ AssertObject : workspaceRBACObj ,
152
+ },
153
+ "GET:/api/v2/workspaces/{workspace}/builds" : {
154
+ AssertAction : rbac .ActionRead ,
155
+ AssertObject : workspaceRBACObj ,
156
+ },
157
+ "GET:/api/v2/workspaces/{workspace}" : {
158
+ AssertAction : rbac .ActionRead ,
159
+ AssertObject : workspaceRBACObj ,
160
+ },
161
+ "PUT:/api/v2/workspaces/{workspace}/autostart" : {
162
+ AssertAction : rbac .ActionUpdate ,
163
+ AssertObject : workspaceRBACObj ,
164
+ },
165
+ "PUT:/api/v2/workspaces/{workspace}/autostop" : {
166
+ AssertAction : rbac .ActionUpdate ,
167
+ AssertObject : workspaceRBACObj ,
168
+ },
169
+ "PATCH:/api/v2/workspacebuilds/{workspacebuild}/cancel" : {
170
+ AssertAction : rbac .ActionUpdate ,
171
+ AssertObject : workspaceRBACObj ,
172
+ },
173
+ "GET:/api/v2/workspacebuilds/{workspacebuild}/resources" : {
174
+ AssertAction : rbac .ActionRead ,
175
+ AssertObject : workspaceRBACObj ,
176
+ },
177
+ "GET:/api/v2/workspacebuilds/{workspacebuild}/state" : {
178
+ AssertAction : rbac .ActionRead ,
179
+ AssertObject : workspaceRBACObj ,
180
+ },
146
181
147
- // These endpoints need payloads to get to the auth part.
148
- "PUT:/api/v2/users/{user}/roles" : {StatusCode : http .StatusBadRequest , NoAuthorize : true },
182
+ // These endpoints need payloads to get to the auth part. Payloads will be required
183
+ "PUT:/api/v2/users/{user}/roles" : {StatusCode : http .StatusBadRequest , NoAuthorize : true },
184
+ "POST:/api/v2/workspaces/{workspace}/builds" : {StatusCode : http .StatusBadRequest , NoAuthorize : true },
149
185
}
150
186
151
187
c , _ := srv .Config .Handler .(* chi.Mux )
@@ -166,16 +202,24 @@ func TestAuthorizeAllEndpoints(t *testing.T) {
166
202
route = strings .ReplaceAll (route , "{organization}" , admin .OrganizationID .String ())
167
203
route = strings .ReplaceAll (route , "{user}" , admin .UserID .String ())
168
204
route = strings .ReplaceAll (route , "{organizationname}" , organization .Name )
169
- route = strings .ReplaceAll (route , "{workspace}" , workspace .Name )
205
+ route = strings .ReplaceAll (route , "{workspace}" , workspace .ID .String ())
206
+ route = strings .ReplaceAll (route , "{workspacebuild}" , workspace .LatestBuild .ID .String ())
207
+ route = strings .ReplaceAll (route , "{workspacename}" , workspace .Name )
208
+ route = strings .ReplaceAll (route , "{workspacebuildname}" , workspace .LatestBuild .Name )
170
209
171
210
resp , err := client .Request (context .Background (), method , route , nil )
172
211
require .NoError (t , err , "do req" )
212
+ body , _ := io .ReadAll (resp .Body )
213
+ t .Logf ("Response Body: %q" , string (body ))
173
214
_ = resp .Body .Close ()
174
215
175
216
if ! routeAssertions .NoAuthorize {
176
217
assert .NotNil (t , authorizer .Called , "authorizer expected" )
177
218
assert .Equal (t , routeAssertions .StatusCode , resp .StatusCode , "expect unauthorized" )
178
219
if authorizer .Called != nil {
220
+ if routeAssertions .AssertAction != "" {
221
+ assert .Equal (t , routeAssertions .AssertAction , authorizer .Called .Action , "resource action" )
222
+ }
179
223
if routeAssertions .AssertObject .Type != "" {
180
224
assert .Equal (t , routeAssertions .AssertObject .Type , authorizer .Called .Object .Type , "resource type" )
181
225
}
0 commit comments