Skip to content

Commit 6fb3b83

Browse files
committed
correctly report token, use "{none}" instead of "" for folder_id
1 parent 383f99d commit 6fb3b83

File tree

3 files changed

+94
-6
lines changed

3 files changed

+94
-6
lines changed

internal/audit/audit_event.go

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ type GRPCCallEvent struct {
6565
GenericAuditFields
6666

6767
MethodName string `json:"operation"`
68-
GRPCRequest json.RawMessage `json:"grpc_request"`
68+
GRPCRequest json.RawMessage `json:"grpc_request,omitempty"`
6969
}
7070

7171
func makeEnvelope(event any) (*EventEnvelope, error) {
@@ -101,6 +101,15 @@ func getStatus(inProgress bool, err error) (AuditEventStatus, string) {
101101
return status, reason
102102
}
103103

104+
func formatContainerID(containerID string) string {
105+
switch containerID {
106+
case "", "{none}":
107+
return "{none}"
108+
default:
109+
return containerID
110+
}
111+
}
112+
104113
func formatDatabase(database string) string {
105114
switch database {
106115
case "", "{none}":
@@ -164,7 +173,7 @@ func GRPCCallAuditEvent(
164173
Action: ActionFromMethodName(ctx, methodName),
165174
Resource: ResourceFromMethodName(ctx, methodName),
166175
Component: "grpc_api",
167-
FolderID: containerID,
176+
FolderID: formatContainerID(containerID),
168177
Database: formatDatabase(database),
169178
Subject: formatSubject(subject),
170179
SanitizedToken: token,
@@ -191,7 +200,7 @@ func ReportGRPCCallBegin(
191200

192201
func ReportGRPCCallEnd(
193202
ctx context.Context, methodName string,
194-
subject string, containerID string, token string, database string, err error,
203+
subject string, token string, containerID string, database string, err error,
195204
) {
196205
event := GRPCCallAuditEvent(
197206
ctx, methodName, nil, subject, token, containerID, database, false, err,

internal/audit/audit_event_test.go

Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -400,3 +400,82 @@ func TestWithGRPCInfo(t *testing.T) {
400400
require.Equal(t, "container-1", fields.ContainerID)
401401
require.Equal(t, "db-1", fields.Database)
402402
}
403+
404+
func TestReportGRPCCallBeginJSON(t *testing.T) {
405+
ctx := grpcinfo.WithGRPCInfo(context.Background())
406+
ctx = peer.NewContext(
407+
ctx, &peer.Peer{
408+
Addr: &mockAddr{address: "192.168.1.1"},
409+
},
410+
)
411+
ctx = metadata.NewIncomingContext(ctx, metadata.Pairs("x_forwarded_for", "10.0.0.1"))
412+
413+
req := &pb.GetBackupRequest{Id: "id-req"}
414+
method := pb.BackupScheduleService_GetBackupSchedule_FullMethodName
415+
subj := "subj"
416+
token := "tok.***"
417+
418+
out := CaptureEventAsString(
419+
t, func() {
420+
ReportGRPCCallBegin(ctx, req, method, subj, token)
421+
},
422+
)
423+
424+
var ej EventJson
425+
require.NoError(t, json.Unmarshal([]byte(out), &ej))
426+
427+
var evt GRPCCallEvent
428+
require.NoError(t, json.Unmarshal([]byte(ej.Event.TextData), &evt))
429+
430+
assert.Equal(t, method, evt.MethodName)
431+
assert.Equal(t, StatusInProcess, evt.Status)
432+
assert.Equal(t, formatSubject(subj), evt.Subject)
433+
assert.Equal(t, token, evt.SanitizedToken)
434+
assert.Equal(t, "{none}", evt.FolderID)
435+
assert.Equal(t, "{none}", evt.Database)
436+
requestID, _ := grpcinfo.GetRequestID(ctx)
437+
assert.Equal(t, requestID, evt.IdempotencyKey)
438+
assert.Contains(t, string(evt.GRPCRequest), "id-req")
439+
assert.Contains(t, evt.RemoteAddress, "10.0.0.1")
440+
assert.Contains(t, evt.RemoteAddress, "192.168.1.1")
441+
}
442+
443+
func TestReportGRPCCallEndJSON(t *testing.T) {
444+
ctx := grpcinfo.WithGRPCInfo(context.Background())
445+
// add peer info and forwarded header
446+
ctx = peer.NewContext(
447+
ctx, &peer.Peer{
448+
Addr: &mockAddr{address: "192.168.2.2"},
449+
},
450+
)
451+
ctx = metadata.NewIncomingContext(ctx, metadata.Pairs("x_forwarded_for", "172.16.0.5"))
452+
453+
method := pb.BackupScheduleService_GetBackupSchedule_FullMethodName
454+
subj := "end-subj"
455+
token := "end-tok"
456+
database := "db-1"
457+
err := status.Error(codes.NotFound, "not found")
458+
459+
out := CaptureEventAsString(
460+
t, func() {
461+
ReportGRPCCallEnd(ctx, method, subj, token, "", database, err)
462+
},
463+
)
464+
465+
var ej EventJson
466+
require.NoError(t, json.Unmarshal([]byte(out), &ej))
467+
468+
var evt GRPCCallEvent
469+
require.NoError(t, json.Unmarshal([]byte(ej.Event.TextData), &evt))
470+
471+
assert.Equal(t, method, evt.MethodName)
472+
assert.Equal(t, formatSubject(subj), evt.Subject)
473+
assert.Equal(t, token, evt.SanitizedToken)
474+
assert.Equal(t, "{none}", evt.FolderID)
475+
assert.Equal(t, database, evt.Database)
476+
assert.Equal(t, StatusError, evt.Status)
477+
assert.Equal(t, err.Error(), evt.Reason)
478+
assert.Nil(t, evt.GRPCRequest)
479+
assert.Contains(t, evt.RemoteAddress, "172.16.0.5")
480+
assert.Contains(t, evt.RemoteAddress, "192.168.2.2")
481+
}

internal/audit/audit_interceptor.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -30,8 +30,8 @@ func GetAuditFieldsForRequest(requestID string) *AuditFields {
3030
v, ok := containerStore.Load(requestID)
3131
if !ok {
3232
return &AuditFields{
33-
ContainerID: "",
34-
Database: "",
33+
ContainerID: "{none}",
34+
Database: "{none}",
3535
}
3636
}
3737
return v.(*AuditFields)
@@ -60,7 +60,7 @@ func NewAuditGRPCInterceptor(provider auth.AuthProvider) grpc.UnaryServerInterce
6060
requestID, _ := grpcinfo.GetRequestID(ctx)
6161
fields := GetAuditFieldsForRequest(requestID)
6262
defer ClearAuditFieldsForRequest(requestID)
63-
ReportGRPCCallEnd(ctx, info.FullMethod, subject, fields.ContainerID, fields.Database, token, grpcErr)
63+
ReportGRPCCallEnd(ctx, info.FullMethod, subject, token, fields.ContainerID, fields.Database, grpcErr)
6464
return response, grpcErr
6565
}
6666
}

0 commit comments

Comments
 (0)