@@ -37,6 +37,43 @@ import (
37
37
"github.com/gravitational/teleport/lib/utils"
38
38
)
39
39
40
+ func TestFailedAccessCheck (t * testing.T ) {
41
+ t .Parallel ()
42
+ checker := fakeChecker {
43
+ allowedVerbs : []string {types .VerbRead , types .VerbList , types .VerbCreate , types .VerbUpdate },
44
+ }
45
+ s := newService (t , authz .AdminActionAuthMFAVerified , & checker )
46
+ desktop , err := types .NewDynamicWindowsDesktopV1 ("test2" , nil , types.DynamicWindowsDesktopSpecV1 {Addr : "addr" })
47
+ require .NoError (t , err )
48
+ req := dynamicwindowsv1.CreateDynamicWindowsDesktopRequest {
49
+ Desktop : desktop ,
50
+ }
51
+ _ , err = s .CreateDynamicWindowsDesktop (context .Background (), & req )
52
+ require .NoError (t , err )
53
+ checker .failAccess = true
54
+ testCases := []string {
55
+ "CreateDynamicWindowsDesktop" ,
56
+ "UpdateDynamicWindowsDesktop" ,
57
+ "UpsertDynamicWindowsDesktop" ,
58
+ "DeleteDynamicWindowsDesktop" ,
59
+ "GetDynamicWindowsDesktop" ,
60
+ }
61
+ for _ , tt := range testCases {
62
+ t .Run (fmt .Sprintf ("%s failed access check" , tt ), func (t * testing.T ) {
63
+ err := callMethod (s , tt )
64
+ require .True (t , trace .IsAccessDenied (err ))
65
+ })
66
+ }
67
+ t .Run ("ListDynamicWindowsDesktops failed access check" , func (t * testing.T ) {
68
+ req := dynamicwindowsv1.ListDynamicWindowsDesktopsRequest {
69
+ PageSize : 10 ,
70
+ }
71
+ resp , err := s .ListDynamicWindowsDesktops (context .Background (), & req )
72
+ require .NoError (t , err )
73
+ require .Empty (t , resp .Desktops )
74
+ })
75
+ }
76
+
40
77
func TestServiceAccess (t * testing.T ) {
41
78
t .Parallel ()
42
79
@@ -87,7 +124,7 @@ func TestServiceAccess(t *testing.T) {
87
124
for _ , state := range tt .allowedStates {
88
125
for _ , verbs := range utils .Combinations (tt .allowedVerbs ) {
89
126
t .Run (fmt .Sprintf ("%v,allowed:%v,verbs:%v" , tt .name , stateToString (state ), verbs ), func (t * testing.T ) {
90
- service := newService (t , state , fakeChecker {allowedVerbs : verbs })
127
+ service := newService (t , state , & fakeChecker {allowedVerbs : verbs })
91
128
err := callMethod (service , tt .name )
92
129
// expect access denied except with full set of verbs.
93
130
if len (verbs ) == len (tt .allowedVerbs ) {
@@ -105,7 +142,7 @@ func TestServiceAccess(t *testing.T) {
105
142
t .Run (fmt .Sprintf ("%v,disallowed:%v" , tt .name , stateToString (state )), func (t * testing.T ) {
106
143
// it is enough to test against tt.allowedVerbs,
107
144
// this is the only different data point compared to the test cases above.
108
- service := newService (t , state , fakeChecker {allowedVerbs : tt .allowedVerbs })
145
+ service := newService (t , state , & fakeChecker {allowedVerbs : tt .allowedVerbs })
109
146
err := callMethod (service , tt .name )
110
147
require .True (t , trace .IsAccessDenied (err ))
111
148
})
@@ -157,16 +194,19 @@ func callMethod(service *Service, method string) error {
157
194
if desc .MethodName == method {
158
195
_ , err := desc .Handler (service , context .Background (), func (arg any ) error {
159
196
switch arg := arg .(type ) {
197
+ case * dynamicwindowsv1.GetDynamicWindowsDesktopRequest :
198
+ arg .Name = "test2"
199
+
160
200
case * dynamicwindowsv1.CreateDynamicWindowsDesktopRequest :
161
201
arg .Desktop , _ = types .NewDynamicWindowsDesktopV1 ("test" , nil , types.DynamicWindowsDesktopSpecV1 {
162
202
Addr : "test" ,
163
203
})
164
204
case * dynamicwindowsv1.UpdateDynamicWindowsDesktopRequest :
165
- arg .Desktop , _ = types .NewDynamicWindowsDesktopV1 ("test " , nil , types.DynamicWindowsDesktopSpecV1 {
205
+ arg .Desktop , _ = types .NewDynamicWindowsDesktopV1 ("test2 " , nil , types.DynamicWindowsDesktopSpecV1 {
166
206
Addr : "test" ,
167
207
})
168
208
case * dynamicwindowsv1.UpsertDynamicWindowsDesktopRequest :
169
- arg .Desktop , _ = types .NewDynamicWindowsDesktopV1 ("test " , nil , types.DynamicWindowsDesktopSpecV1 {
209
+ arg .Desktop , _ = types .NewDynamicWindowsDesktopV1 ("test2 " , nil , types.DynamicWindowsDesktopSpecV1 {
170
210
Addr : "test" ,
171
211
})
172
212
}
@@ -180,10 +220,11 @@ func callMethod(service *Service, method string) error {
180
220
181
221
type fakeChecker struct {
182
222
allowedVerbs []string
223
+ failAccess bool
183
224
services.AccessChecker
184
225
}
185
226
186
- func (f fakeChecker ) CheckAccessToRule (_ services.RuleContext , _ string , resource string , verb string ) error {
227
+ func (f * fakeChecker ) CheckAccessToRule (_ services.RuleContext , _ string , resource string , verb string ) error {
187
228
if resource == types .KindDynamicWindowsDesktop {
188
229
if slices .Contains (f .allowedVerbs , verb ) {
189
230
return nil
@@ -193,7 +234,10 @@ func (f fakeChecker) CheckAccessToRule(_ services.RuleContext, _ string, resourc
193
234
return trace .AccessDenied ("access denied to rule=%v/verb=%v" , resource , verb )
194
235
}
195
236
196
- func (f fakeChecker ) CheckAccess (r services.AccessCheckable , state services.AccessState , matchers ... services.RoleMatcher ) error {
237
+ func (f * fakeChecker ) CheckAccess (r services.AccessCheckable , state services.AccessState , matchers ... services.RoleMatcher ) error {
238
+ if f .failAccess {
239
+ return trace .AccessDenied ("denied" )
240
+ }
197
241
return nil
198
242
}
199
243
0 commit comments