@@ -22,9 +22,11 @@ import (
2222"sync"
2323"testing"
2424
25+ authnv1 "k8s.io/api/authentication/v1"
2526auditinternal "k8s.io/apiserver/pkg/apis/audit"
2627
2728"github.com/stretchr/testify/assert"
29+ "github.com/stretchr/testify/require"
2830)
2931
3032func TestEnabled (t * testing.T ) {
@@ -175,6 +177,159 @@ func TestAuditAnnotationsWithAuditLoggingSetup(t *testing.T) {
175177assert .Equal (t , expected , actual )
176178}
177179
180+ func TestGetEventUser (t * testing.T ) {
181+ tests := []struct {
182+ name string
183+ auditEventUser authnv1.UserInfo
184+ wantUser authnv1.UserInfo
185+ }{
186+ {
187+ name : "fields with zero values are returned as fields with zero values" ,
188+ auditEventUser : authnv1.UserInfo {},
189+ wantUser : authnv1.UserInfo {},
190+ },
191+ {
192+ name : "fields with non-zero values are returned as copies" ,
193+ auditEventUser : authnv1.UserInfo {
194+ Username : "test-user" ,
195+ UID : "test-uid" ,
196+ Groups : []string {"test-group1" , "test-group2" },
197+ Extra : map [string ]authnv1.ExtraValue {
198+ "test-extra1" : {"test-extra1-val1" , "test-extra1-val2" },
199+ "test-extra2" : {"test-extra2-val1" , "test-extra2-val2" },
200+ },
201+ },
202+ wantUser : authnv1.UserInfo {
203+ Username : "test-user" ,
204+ UID : "test-uid" ,
205+ Groups : []string {"test-group1" , "test-group2" },
206+ Extra : map [string ]authnv1.ExtraValue {
207+ "test-extra1" : {"test-extra1-val1" , "test-extra1-val2" },
208+ "test-extra2" : {"test-extra2-val1" , "test-extra2-val2" },
209+ },
210+ },
211+ },
212+ }
213+ for _ , test := range tests {
214+ t .Run (test .name , func (t * testing.T ) {
215+ ac := AuditContext {event : auditinternal.Event {User : test .auditEventUser }}
216+ got := ac .GetEventUser ()
217+ require .Equal (t , test .wantUser , got )
218+ })
219+ }
220+
221+ t .Run ("mutating the returned groups does not change the audit event's User's groups" , func (t * testing.T ) {
222+ ac := AuditContext {
223+ event : auditinternal.Event {
224+ User : authnv1.UserInfo {
225+ Groups : []string {"test-group1" , "test-group2" },
226+ },
227+ },
228+ }
229+ got := ac .GetEventUser ()
230+ require .Equal (t , []string {"test-group1" , "test-group2" }, got .Groups )
231+ got .Groups [0 ] = "mutated group"
232+ require .Equal (t , []string {"mutated group" , "test-group2" }, got .Groups )
233+ // The event's groups are not changed.
234+ require .Equal (t , []string {"test-group1" , "test-group2" }, ac .event .User .Groups )
235+ })
236+
237+ t .Run ("mutating the returned extras does not change the audit event's User's extras" , func (t * testing.T ) {
238+ ac := AuditContext {
239+ event : auditinternal.Event {
240+ User : authnv1.UserInfo {
241+ Extra : map [string ]authnv1.ExtraValue {"test-extra" : {"test-extra-val" }},
242+ },
243+ },
244+ }
245+ got := ac .GetEventUser ()
246+ require .Equal (t , map [string ]authnv1.ExtraValue {"test-extra" : {"test-extra-val" }}, got .Extra )
247+ got .Extra ["test-extra" ] = authnv1.ExtraValue {"mutated value" }
248+ require .Equal (t , map [string ]authnv1.ExtraValue {"test-extra" : {"mutated value" }}, got .Extra )
249+ // The event's extras are not changed.
250+ require .Equal (t , map [string ]authnv1.ExtraValue {"test-extra" : {"test-extra-val" }}, ac .event .User .Extra )
251+ })
252+ }
253+
254+ func TestGetEventImpersonatedUser (t * testing.T ) {
255+ tests := []struct {
256+ name string
257+ auditEventImpersonatedUser * authnv1.UserInfo
258+ wantUser * authnv1.UserInfo
259+ }{
260+ {
261+ name : "nil ImpersonatedUser returns nil" ,
262+ auditEventImpersonatedUser : nil ,
263+ wantUser : nil ,
264+ },
265+ {
266+ name : "fields with zero values are returned as fields with zero values" ,
267+ auditEventImpersonatedUser : & authnv1.UserInfo {},
268+ wantUser : & authnv1.UserInfo {},
269+ },
270+ {
271+ name : "fields with non-zero values are returned as copies" ,
272+ auditEventImpersonatedUser : & authnv1.UserInfo {
273+ Username : "test-user" ,
274+ UID : "test-uid" ,
275+ Groups : []string {"test-group1" , "test-group2" },
276+ Extra : map [string ]authnv1.ExtraValue {
277+ "test-extra1" : {"test-extra1-val1" , "test-extra1-val2" },
278+ "test-extra2" : {"test-extra2-val1" , "test-extra2-val2" },
279+ },
280+ },
281+ wantUser : & authnv1.UserInfo {
282+ Username : "test-user" ,
283+ UID : "test-uid" ,
284+ Groups : []string {"test-group1" , "test-group2" },
285+ Extra : map [string ]authnv1.ExtraValue {
286+ "test-extra1" : {"test-extra1-val1" , "test-extra1-val2" },
287+ "test-extra2" : {"test-extra2-val1" , "test-extra2-val2" },
288+ },
289+ },
290+ },
291+ }
292+ for _ , test := range tests {
293+ t .Run (test .name , func (t * testing.T ) {
294+ ac := AuditContext {event : auditinternal.Event {ImpersonatedUser : test .auditEventImpersonatedUser }}
295+ got := ac .GetEventImpersonatedUser ()
296+ require .Equal (t , test .wantUser , got )
297+ })
298+ }
299+
300+ t .Run ("mutating the returned groups does not change the audit event's ImpersonatedUser's groups" , func (t * testing.T ) {
301+ ac := AuditContext {
302+ event : auditinternal.Event {
303+ ImpersonatedUser : & authnv1.UserInfo {
304+ Groups : []string {"test-group1" , "test-group2" },
305+ },
306+ },
307+ }
308+ got := ac .GetEventImpersonatedUser ()
309+ require .Equal (t , []string {"test-group1" , "test-group2" }, got .Groups )
310+ got .Groups [0 ] = "mutated group"
311+ require .Equal (t , []string {"mutated group" , "test-group2" }, got .Groups )
312+ // The event's groups are not changed.
313+ require .Equal (t , []string {"test-group1" , "test-group2" }, ac .event .ImpersonatedUser .Groups )
314+ })
315+
316+ t .Run ("mutating the returned extras does not change the audit event's ImpersonatedUser's extras" , func (t * testing.T ) {
317+ ac := AuditContext {
318+ event : auditinternal.Event {
319+ ImpersonatedUser : & authnv1.UserInfo {
320+ Extra : map [string ]authnv1.ExtraValue {"test-extra" : {"test-extra-val" }},
321+ },
322+ },
323+ }
324+ got := ac .GetEventImpersonatedUser ()
325+ require .Equal (t , map [string ]authnv1.ExtraValue {"test-extra" : {"test-extra-val" }}, got .Extra )
326+ got .Extra ["test-extra" ] = authnv1.ExtraValue {"mutated value" }
327+ require .Equal (t , map [string ]authnv1.ExtraValue {"test-extra" : {"mutated value" }}, got .Extra )
328+ // The event's extras are not changed.
329+ require .Equal (t , map [string ]authnv1.ExtraValue {"test-extra" : {"test-extra-val" }}, ac .event .ImpersonatedUser .Extra )
330+ })
331+ }
332+
178333func withAuditContextAndLevel (ctx context.Context , t * testing.T , l auditinternal.Level ) context.Context {
179334ctx = WithAuditContext (ctx )
180335if err := AuditContextFrom (ctx ).Init (RequestAuditConfig {Level : l }, nil ); err != nil {
0 commit comments