@@ -403,6 +403,10 @@ func (s *APIServer) GetAuditLog(ctx context.Context, req *apipb.GetAuditLogReque
403403 if selector == nil {
404404 selector = & apipb.AuditLogSelector {}
405405 }
406+ pageToken , err := parseAuditLogPageToken (req .GetPageToken ())
407+ if err != nil {
408+ return nil , err
409+ }
406410
407411 startTime := selector .GetStartTime ()
408412 if startTime == nil {
@@ -422,6 +426,17 @@ func (s *APIServer) GetAuditLog(ctx context.Context, req *apipb.GetAuditLogReque
422426 if startTime .AsTime ().After (endTime .AsTime ()) {
423427 return nil , status .InvalidArgumentErrorf ("start_time must not be after end_time" )
424428 }
429+ startUsec := startTime .AsTime ().UnixMicro ()
430+ endUsec := endTime .AsTime ().UnixMicro ()
431+ if pageToken != nil {
432+ if selector .GetEndTime () != nil && endUsec != pageToken .EndTimeUsec {
433+ return nil , status .InvalidArgumentError ("page_token does not match selector.end_time" )
434+ }
435+ endUsec = pageToken .EndTimeUsec
436+ }
437+ if startUsec > endUsec {
438+ return nil , status .InvalidArgumentErrorf ("start_time must not be after end_time" )
439+ }
425440
426441 if s .env .GetAuditLogger () == nil || s .env .GetOLAPDBHandle () == nil {
427442 return nil , status .UnimplementedError ("Audit logger not configured" )
@@ -447,19 +462,13 @@ func (s *APIServer) GetAuditLog(ctx context.Context, req *apipb.GetAuditLogReque
447462 pageSize = defaultAuditLogPageSize
448463 }
449464 pageSize = min (pageSize , maxAuditLogPageSize )
450- startUsec := startTime .AsTime ().UnixMicro ()
451- endUsec := endTime .AsTime ().UnixMicro ()
452465
453466 q := query_builder .NewQuery (`SELECT * FROM AuditLogs` )
454467 q .AddWhereClause ("group_id = ?" , user .GetGroupID ())
455468 q .AddWhereClause ("event_time_usec >= ?" , startUsec )
456469 q .AddWhereClause ("event_time_usec < ?" , endUsec )
457- if req .GetPageToken () != "" {
458- token , err := parseAuditLogPageToken (req .GetPageToken ())
459- if err != nil {
460- return nil , err
461- }
462- q .AddWhereClause ("(event_time_usec, audit_log_id) > (?, ?)" , token .EventTimeUsec , token .AuditLogID )
470+ if pageToken != nil {
471+ q .AddWhereClause ("(event_time_usec, audit_log_id) > (?, ?)" , pageToken .EventTimeUsec , pageToken .AuditLogID )
463472 }
464473 // Match AuditLogs sort key to keep keyset pagination index-friendly.
465474 q .SetOrderBy ("group_id, event_time_usec, audit_log_id" , true )
@@ -491,6 +500,7 @@ func (s *APIServer) GetAuditLog(ctx context.Context, req *apipb.GetAuditLogReque
491500
492501 rsp .Entry = append (rsp .Entry , entry )
493502 lastReturnedToken = auditLogPageToken {
503+ EndTimeUsec : endUsec ,
494504 EventTimeUsec : row .EventTimeUsec ,
495505 AuditLogID : row .AuditLogID ,
496506 }
@@ -504,6 +514,7 @@ func (s *APIServer) GetAuditLog(ctx context.Context, req *apipb.GetAuditLogReque
504514}
505515
506516type auditLogPageToken struct {
517+ EndTimeUsec int64 `json:"end_time_usec"`
507518 EventTimeUsec int64 `json:"event_time_usec"`
508519 AuditLogID string `json:"audit_log_id"`
509520}
@@ -516,17 +527,20 @@ func encodeAuditLogPageToken(token auditLogPageToken) (string, error) {
516527 return base64 .RawURLEncoding .EncodeToString (data ), nil
517528}
518529
519- func parseAuditLogPageToken (pageToken string ) (auditLogPageToken , error ) {
530+ func parseAuditLogPageToken (pageToken string ) (* auditLogPageToken , error ) {
531+ if pageToken == "" {
532+ return nil , nil
533+ }
520534 data , err := base64 .RawURLEncoding .DecodeString (pageToken )
521535 if err != nil {
522- return auditLogPageToken {} , status .InvalidArgumentErrorf ("invalid page_token" )
536+ return nil , status .InvalidArgumentErrorf ("invalid page_token" )
523537 }
524- token := auditLogPageToken {}
525- if err := json .Unmarshal (data , & token ); err != nil {
526- return auditLogPageToken {} , status .InvalidArgumentErrorf ("invalid page_token" )
538+ token := & auditLogPageToken {}
539+ if err := json .Unmarshal (data , token ); err != nil {
540+ return nil , status .InvalidArgumentErrorf ("invalid page_token" )
527541 }
528542 if token .AuditLogID == "" {
529- return auditLogPageToken {} , status .InvalidArgumentErrorf ("invalid page_token" )
543+ return nil , status .InvalidArgumentErrorf ("invalid page_token" )
530544 }
531545 return token , nil
532546}
0 commit comments