MM-22785 audit server CLI (#14144)
Add auditing to server CLI. Also: - simplify auditing in API layer - reduce number of AddMeta calls - have models serialize themselves - more consistent field naming
Этот коммит содержится в:
@@ -6,6 +6,10 @@ package audit
|
||||
// Meta represents metadata that can be added to a audit record as name/value pairs.
|
||||
type Meta map[string]interface{}
|
||||
|
||||
// FuncMetaTypeConv defines a function that can convert meta data types into something
|
||||
// that serializes well for audit records.
|
||||
type FuncMetaTypeConv func(val interface{}) (newVal interface{}, converted bool)
|
||||
|
||||
// Record provides a consistent set of fields used for all audit logging.
|
||||
type Record struct {
|
||||
APIPath string
|
||||
@@ -16,6 +20,7 @@ type Record struct {
|
||||
Client string
|
||||
IPAddress string
|
||||
Meta Meta
|
||||
metaConv []FuncMetaTypeConv
|
||||
}
|
||||
|
||||
// Success marks the audit record status as successful.
|
||||
@@ -33,5 +38,22 @@ func (rec *Record) AddMeta(name string, val interface{}) {
|
||||
if rec.Meta == nil {
|
||||
rec.Meta = Meta{}
|
||||
}
|
||||
|
||||
// possibly convert val to something better suited for serializing
|
||||
// via zero or more conversion functions.
|
||||
var converted bool
|
||||
for _, conv := range rec.metaConv {
|
||||
val, converted = conv(val)
|
||||
if converted {
|
||||
break
|
||||
}
|
||||
}
|
||||
|
||||
rec.Meta[name] = val
|
||||
}
|
||||
|
||||
// AddMetaTypeConverter adds a function capable of converting meta field types
|
||||
// into something more suitable for serialization.
|
||||
func (rec *Record) AddMetaTypeConverter(f FuncMetaTypeConv) {
|
||||
rec.metaConv = append(rec.metaConv, f)
|
||||
}
|
||||
|
||||
76
audit/record_test.go
Обычный файл
76
audit/record_test.go
Обычный файл
@@ -0,0 +1,76 @@
|
||||
// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
|
||||
// See LICENSE.txt for license information.
|
||||
|
||||
package audit
|
||||
|
||||
import (
|
||||
"testing"
|
||||
|
||||
"github.com/stretchr/testify/require"
|
||||
)
|
||||
|
||||
type bloated struct {
|
||||
fld1 string
|
||||
fld2 string
|
||||
fld3 string
|
||||
fld4 string
|
||||
}
|
||||
|
||||
type wilted struct {
|
||||
wilt1 string
|
||||
}
|
||||
|
||||
func conv(val interface{}) (interface{}, bool) {
|
||||
switch v := val.(type) {
|
||||
case *bloated:
|
||||
return &wilted{wilt1: v.fld1}, true
|
||||
}
|
||||
return val, false
|
||||
}
|
||||
|
||||
func TestRecord_AddMeta(t *testing.T) {
|
||||
type fields struct {
|
||||
metaConv []FuncMetaTypeConv
|
||||
}
|
||||
type args struct {
|
||||
name string
|
||||
val interface{}
|
||||
}
|
||||
tests := []struct {
|
||||
name string
|
||||
fields fields
|
||||
args args
|
||||
wantWilt bool
|
||||
wantVal string
|
||||
}{
|
||||
{name: "no converter", wantWilt: false, wantVal: "ok", fields: fields{}, args: args{name: "prop", val: "ok"}},
|
||||
{name: "don't convert", wantWilt: false, wantVal: "ok", fields: fields{metaConv: []FuncMetaTypeConv{conv}}, args: args{name: "prop", val: "ok"}},
|
||||
{name: "convert", wantWilt: true, wantVal: "1", fields: fields{metaConv: []FuncMetaTypeConv{conv}}, args: args{name: "prop", val: &bloated{
|
||||
fld1: "1", fld2: "2", fld3: "3", fld4: "4"}},
|
||||
},
|
||||
}
|
||||
for _, tt := range tests {
|
||||
t.Run(tt.name, func(t *testing.T) {
|
||||
rec := &Record{
|
||||
metaConv: tt.fields.metaConv,
|
||||
}
|
||||
rec.AddMeta(tt.args.name, tt.args.val)
|
||||
|
||||
// fetch the prop store in auditRecord meta data
|
||||
got, ok := rec.Meta["prop"]
|
||||
require.True(t, ok)
|
||||
|
||||
// check if conversion was expected
|
||||
val, ok := got.(*wilted)
|
||||
require.Equal(t, tt.wantWilt, ok)
|
||||
|
||||
if ok {
|
||||
// if converted to wilt then make sure field was copied
|
||||
require.Equal(t, tt.wantVal, val.wilt1)
|
||||
} else {
|
||||
// if not converted, make sure val is unchanged
|
||||
require.Equal(t, tt.wantVal, got)
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
@@ -54,8 +54,7 @@ func NewSyslogTLSTarget(filter logr.Filter, formatter logr.Formatter, params *Sy
|
||||
return s, nil
|
||||
}
|
||||
|
||||
// Shutdown stops processing log records after making best
|
||||
// effort to flush queue.
|
||||
// Shutdown stops processing log records after making best effort to flush queue.
|
||||
func (s *SyslogTLS) Shutdown(ctx context.Context) error {
|
||||
errs := merror.New()
|
||||
|
||||
|
||||
Ссылка в новой задаче
Block a user