diff --git a/api/event/event.fbs b/api/event/event.fbs index 373e86e0..98e5f9fd 100755 --- a/api/event/event.fbs +++ b/api/event/event.fbs @@ -143,6 +143,7 @@ table AuthDetails { realmId:string; clientId:string; userId:string; + username:string; ipAddress:string; } @@ -164,6 +165,7 @@ table AdminEvent { time:long; realmId:string; authDetails:AuthDetails; + details:[Tuple]; resourceType:ResourceType; operationType:OperationType; resourcePath:string; diff --git a/api/event/fb/AdminEvent.go b/api/event/fb/AdminEvent.go index 5db250b1..8c9e2423 100644 --- a/api/event/fb/AdminEvent.go +++ b/api/event/fb/AdminEvent.go @@ -71,19 +71,27 @@ func (rcv *AdminEvent) AuthDetails(obj *AuthDetails) *AuthDetails { return nil } -func (rcv *AdminEvent) ResourceType() int8 { +func (rcv *AdminEvent) Details(obj *Tuple, j int) bool { o := flatbuffers.UOffsetT(rcv._tab.Offset(12)) if o != 0 { - return rcv._tab.GetInt8(o + rcv._tab.Pos) + x := rcv._tab.Vector(o) + x += flatbuffers.UOffsetT(j) * 4 + x = rcv._tab.Indirect(x) + obj.Init(rcv._tab.Bytes, x) + return true } - return 0 + return false } -func (rcv *AdminEvent) MutateResourceType(n int8) bool { - return rcv._tab.MutateInt8Slot(12, n) +func (rcv *AdminEvent) DetailsLength() int { + o := flatbuffers.UOffsetT(rcv._tab.Offset(12)) + if o != 0 { + return rcv._tab.VectorLen(o) + } + return 0 } -func (rcv *AdminEvent) OperationType() int8 { +func (rcv *AdminEvent) ResourceType() ResourceType { o := flatbuffers.UOffsetT(rcv._tab.Offset(14)) if o != 0 { return rcv._tab.GetInt8(o + rcv._tab.Pos) @@ -91,12 +99,24 @@ func (rcv *AdminEvent) OperationType() int8 { return 0 } -func (rcv *AdminEvent) MutateOperationType(n int8) bool { +func (rcv *AdminEvent) MutateResourceType(n ResourceType) bool { return rcv._tab.MutateInt8Slot(14, n) } -func (rcv *AdminEvent) ResourcePath() []byte { +func (rcv *AdminEvent) OperationType() OperationType { o := flatbuffers.UOffsetT(rcv._tab.Offset(16)) + if o != 0 { + return rcv._tab.GetInt8(o + rcv._tab.Pos) + } + return 0 +} + +func (rcv *AdminEvent) MutateOperationType(n OperationType) bool { + return rcv._tab.MutateInt8Slot(16, n) +} + +func (rcv *AdminEvent) ResourcePath() []byte { + o := flatbuffers.UOffsetT(rcv._tab.Offset(18)) if o != 0 { return rcv._tab.ByteVector(o + rcv._tab.Pos) } @@ -104,7 +124,7 @@ func (rcv *AdminEvent) ResourcePath() []byte { } func (rcv *AdminEvent) Representation() []byte { - o := flatbuffers.UOffsetT(rcv._tab.Offset(18)) + o := flatbuffers.UOffsetT(rcv._tab.Offset(20)) if o != 0 { return rcv._tab.ByteVector(o + rcv._tab.Pos) } @@ -112,7 +132,7 @@ func (rcv *AdminEvent) Representation() []byte { } func (rcv *AdminEvent) Error() []byte { - o := flatbuffers.UOffsetT(rcv._tab.Offset(20)) + o := flatbuffers.UOffsetT(rcv._tab.Offset(22)) if o != 0 { return rcv._tab.ByteVector(o + rcv._tab.Pos) } @@ -120,7 +140,7 @@ func (rcv *AdminEvent) Error() []byte { } func AdminEventStart(builder *flatbuffers.Builder) { - builder.StartObject(9) + builder.StartObject(10) } func AdminEventAddUid(builder *flatbuffers.Builder, uid int64) { builder.PrependInt64Slot(0, uid, 0) @@ -134,20 +154,26 @@ func AdminEventAddRealmId(builder *flatbuffers.Builder, realmId flatbuffers.UOff func AdminEventAddAuthDetails(builder *flatbuffers.Builder, authDetails flatbuffers.UOffsetT) { builder.PrependUOffsetTSlot(3, flatbuffers.UOffsetT(authDetails), 0) } +func AdminEventAddDetails(builder *flatbuffers.Builder, details flatbuffers.UOffsetT) { + builder.PrependUOffsetTSlot(4, flatbuffers.UOffsetT(details), 0) +} +func AdminEventStartDetailsVector(builder *flatbuffers.Builder, numElems int) flatbuffers.UOffsetT { + return builder.StartVector(4, numElems, 4) +} func AdminEventAddResourceType(builder *flatbuffers.Builder, resourceType int8) { - builder.PrependInt8Slot(4, resourceType, 0) + builder.PrependInt8Slot(5, resourceType, 0) } func AdminEventAddOperationType(builder *flatbuffers.Builder, operationType int8) { - builder.PrependInt8Slot(5, operationType, 0) + builder.PrependInt8Slot(6, operationType, 0) } func AdminEventAddResourcePath(builder *flatbuffers.Builder, resourcePath flatbuffers.UOffsetT) { - builder.PrependUOffsetTSlot(6, flatbuffers.UOffsetT(resourcePath), 0) + builder.PrependUOffsetTSlot(7, flatbuffers.UOffsetT(resourcePath), 0) } func AdminEventAddRepresentation(builder *flatbuffers.Builder, representation flatbuffers.UOffsetT) { - builder.PrependUOffsetTSlot(7, flatbuffers.UOffsetT(representation), 0) + builder.PrependUOffsetTSlot(8, flatbuffers.UOffsetT(representation), 0) } func AdminEventAddError(builder *flatbuffers.Builder, error flatbuffers.UOffsetT) { - builder.PrependUOffsetTSlot(8, flatbuffers.UOffsetT(error), 0) + builder.PrependUOffsetTSlot(9, flatbuffers.UOffsetT(error), 0) } func AdminEventEnd(builder *flatbuffers.Builder) flatbuffers.UOffsetT { return builder.EndObject() diff --git a/api/event/fb/AuthDetails.go b/api/event/fb/AuthDetails.go index 4b46d268..4c55c791 100644 --- a/api/event/fb/AuthDetails.go +++ b/api/event/fb/AuthDetails.go @@ -50,7 +50,7 @@ func (rcv *AuthDetails) UserId() []byte { return nil } -func (rcv *AuthDetails) IpAddress() []byte { +func (rcv *AuthDetails) Username() []byte { o := flatbuffers.UOffsetT(rcv._tab.Offset(10)) if o != 0 { return rcv._tab.ByteVector(o + rcv._tab.Pos) @@ -58,8 +58,16 @@ func (rcv *AuthDetails) IpAddress() []byte { return nil } +func (rcv *AuthDetails) IpAddress() []byte { + o := flatbuffers.UOffsetT(rcv._tab.Offset(12)) + if o != 0 { + return rcv._tab.ByteVector(o + rcv._tab.Pos) + } + return nil +} + func AuthDetailsStart(builder *flatbuffers.Builder) { - builder.StartObject(4) + builder.StartObject(5) } func AuthDetailsAddRealmId(builder *flatbuffers.Builder, realmId flatbuffers.UOffsetT) { builder.PrependUOffsetTSlot(0, flatbuffers.UOffsetT(realmId), 0) @@ -70,8 +78,11 @@ func AuthDetailsAddClientId(builder *flatbuffers.Builder, clientId flatbuffers.U func AuthDetailsAddUserId(builder *flatbuffers.Builder, userId flatbuffers.UOffsetT) { builder.PrependUOffsetTSlot(2, flatbuffers.UOffsetT(userId), 0) } +func AuthDetailsAddUsername(builder *flatbuffers.Builder, username flatbuffers.UOffsetT) { + builder.PrependUOffsetTSlot(3, flatbuffers.UOffsetT(username), 0) +} func AuthDetailsAddIpAddress(builder *flatbuffers.Builder, ipAddress flatbuffers.UOffsetT) { - builder.PrependUOffsetTSlot(3, flatbuffers.UOffsetT(ipAddress), 0) + builder.PrependUOffsetTSlot(4, flatbuffers.UOffsetT(ipAddress), 0) } func AuthDetailsEnd(builder *flatbuffers.Builder) flatbuffers.UOffsetT { return builder.EndObject() diff --git a/pkg/event/component.go b/pkg/event/component.go index 92868f85..1633360f 100755 --- a/pkg/event/component.go +++ b/pkg/event/component.go @@ -4,7 +4,6 @@ import ( "context" "encoding/json" "fmt" - "regexp" "strings" "sync" "time" @@ -218,14 +217,22 @@ func adminEventToMap(adminEvent *fb.AdminEvent) map[string]string { addInfo["ip_address"] = string(authDetails.IpAddress()) adminEventMap[database.CtEventAgentRealmName] = string(authDetails.RealmId()) // agent_realm_name adminEventMap[database.CtEventAgentUserID] = string(authDetails.UserId()) //agent_user_id + adminEventMap[database.CtEventAgentUsername] = string(authDetails.Username()) //agent_username + + //details contains the user_id and the username of the user affected by the action + var detailsLength = adminEvent.DetailsLength() + for i := 0; i < detailsLength; i++ { + var tuple = new(fb.Tuple) + adminEvent.Details(tuple, i) + if string(tuple.Key()) == database.CtEventUsername || string(tuple.Key()) == database.CtEventUserID { + adminEventMap[string(tuple.Key())] = string(tuple.Value()) + } + + } addInfo["resource_type"] = string(adminEvent.ResourceType()) adminEventMap[database.CtEventKcOperationType] = fb.EnumNamesOperationType[int8(adminEvent.OperationType())] //kc_operation_type addInfo["resource_path"] = string(adminEvent.ResourcePath()) - reg := regexp.MustCompile(`[0-9a-fA-F]{8}\-[0-9a-fA-F]{4}\-[0-9a-fA-F]{4}\-[0-9a-fA-F]{4}\-[0-9a-fA-F]{12}`) - if strings.HasPrefix(addInfo["resource_path"], "users") { - adminEventMap[database.CtEventUserID] = string(reg.Find([]byte(addInfo["resource_path"]))) //user_id - } addInfo["representation"] = string(adminEvent.Representation()) addInfo["error"] = string(adminEvent.Error()) diff --git a/pkg/event/component_test.go b/pkg/event/component_test.go index 0881df4e..9ce8f66a 100755 --- a/pkg/event/component_test.go +++ b/pkg/event/component_test.go @@ -456,6 +456,12 @@ func TestAdminEventToMap(t *testing.T) { var realmID = "realm" var representation = "representation" var error = "error" + var agentUsername = "agent_test_username" + var agentUserID = "agent_test_id" + var userID = "user_id" + var username = "username" + var ipAddr = "127.0.0.1" + var clientID = "clientid_test" var adminEvent *fb.AdminEvent { @@ -466,23 +472,37 @@ func TestAdminEventToMap(t *testing.T) { var resourceP = builder.CreateString(resourcePath) var error = builder.CreateString(error) - var key1 = builder.CreateString("username") - var value1 = builder.CreateString("test_username") + var agentUsrValue = builder.CreateString(agentUsername) + var agentIDValue = builder.CreateString(agentUserID) + var agentRealmValue = builder.CreateString(realmID) + var ipValue = builder.CreateString(ipAddr) + var clientIDValue = builder.CreateString(clientID) + + fb.AuthDetailsStart(builder) + fb.AuthDetailsAddUserId(builder, agentIDValue) + fb.AuthDetailsAddUsername(builder, agentUsrValue) + fb.AuthDetailsAddRealmId(builder, agentRealmValue) + fb.AuthDetailsAddIpAddress(builder, ipValue) + fb.AuthDetailsAddClientId(builder, clientIDValue) + var authDetails = fb.AuthDetailsEnd(builder) + + var key3 = builder.CreateString(database.CtEventUsername) + var value3 = builder.CreateString(username) fb.TupleStart(builder) - fb.TupleAddKey(builder, key1) - fb.TupleAddValue(builder, value1) - var detail1 = fb.TupleEnd(builder) + fb.TupleAddKey(builder, key3) + fb.TupleAddValue(builder, value3) + var detail3 = fb.TupleEnd(builder) - var key2 = builder.CreateString("key2") - var value2 = builder.CreateString("value2") + var key4 = builder.CreateString(database.CtEventUserID) + var value4 = builder.CreateString(userID) fb.TupleStart(builder) - fb.TupleAddKey(builder, key2) - fb.TupleAddValue(builder, value2) - var detail2 = fb.TupleEnd(builder) + fb.TupleAddKey(builder, key4) + fb.TupleAddValue(builder, value4) + var detail4 = fb.TupleEnd(builder) fb.EventStartDetailsVector(builder, 2) - builder.PrependUOffsetT(detail1) - builder.PrependUOffsetT(detail2) + builder.PrependUOffsetT(detail3) + builder.PrependUOffsetT(detail4) var details = builder.EndVector(2) fb.AdminEventStart(builder) @@ -494,7 +514,8 @@ func TestAdminEventToMap(t *testing.T) { fb.AdminEventAddOperationType(builder, optype) fb.AdminEventAddResourcePath(builder, resourceP) fb.AdminEventAddError(builder, error) - fb.AdminEventAddAuthDetails(builder, details) + fb.AdminEventAddAuthDetails(builder, authDetails) + fb.AdminEventAddDetails(builder, details) var eventOffset = fb.EventEnd(builder) builder.Finish(eventOffset) adminEvent = fb.GetRootAsAdminEvent(builder.FinishedBytes(), 0) @@ -505,12 +526,19 @@ func TestAdminEventToMap(t *testing.T) { assert.Equal(t, time.Unix(0, epoch*1000000).UTC().Format("2006-01-02 15:04:05.000"), m[database.CtEventAuditTime]) assert.Equal(t, fb.EnumNamesOperationType[int8(optype)], m[database.CtEventKcOperationType]) assert.Equal(t, realmID, m[database.CtEventRealmName]) + assert.Equal(t, username, m[database.CtEventUsername]) + assert.Equal(t, userID, m[database.CtEventUserID]) + assert.Equal(t, agentUsername, m[database.CtEventAgentUsername]) + assert.Equal(t, agentUserID, m[database.CtEventAgentUserID]) + assert.Equal(t, clientID, m[database.CtEventClientID]) + assert.Equal(t, realmID, m[database.CtEventAgentRealmName]) var f = make(map[string]string) err := json.Unmarshal([]byte(m[database.CtEventAdditionalInfo]), &f) assert.Nil(t, err) assert.Equal(t, strconv.FormatInt(uid, 10), f["uid"]) assert.Equal(t, resourcePath, f["resource_path"]) assert.Equal(t, representation, f["representation"]) + assert.Equal(t, ipAddr, f["ip_address"]) assert.Equal(t, error, f["error"]) assert.Equal(t, "ADMIN", m[database.CtEventType]) @@ -519,35 +547,35 @@ func TestAdminEventToMap(t *testing.T) { func TestAdminEventToMapAccountCreated(t *testing.T) { var resourcePath = "users/8caefab3-90d1-492e-87e0-1bf6cecc76ea/role-mappings/realm " var optype int8 + var agentUsername = "agent_test_username" + var agentUserID = "agent_test_id" + var ipAddr = "127.0.0.1" + var clientID = "clientid_test" + var realmID = "realm" var adminEvent *fb.AdminEvent { var builder = flatbuffers.NewBuilder(0) var resourceP = builder.CreateString(resourcePath) - var key1 = builder.CreateString("username") - var value1 = builder.CreateString("test_username") - fb.TupleStart(builder) - fb.TupleAddKey(builder, key1) - fb.TupleAddValue(builder, value1) - var detail1 = fb.TupleEnd(builder) - - var key2 = builder.CreateString("key2") - var value2 = builder.CreateString("value2") - fb.TupleStart(builder) - fb.TupleAddKey(builder, key2) - fb.TupleAddValue(builder, value2) - var detail2 = fb.TupleEnd(builder) + var agentUsrValue = builder.CreateString(agentUsername) + var agentIDValue = builder.CreateString(agentUserID) + var agentRealmValue = builder.CreateString(realmID) + var ipValue = builder.CreateString(ipAddr) + var clientIDValue = builder.CreateString(clientID) - fb.EventStartDetailsVector(builder, 2) - builder.PrependUOffsetT(detail1) - builder.PrependUOffsetT(detail2) - var details = builder.EndVector(2) + fb.AuthDetailsStart(builder) + fb.AuthDetailsAddUserId(builder, agentIDValue) + fb.AuthDetailsAddUsername(builder, agentUsrValue) + fb.AuthDetailsAddRealmId(builder, agentRealmValue) + fb.AuthDetailsAddIpAddress(builder, ipValue) + fb.AuthDetailsAddClientId(builder, clientIDValue) + var authDetails = fb.AuthDetailsEnd(builder) fb.AdminEventStart(builder) fb.AdminEventAddOperationType(builder, optype) fb.AdminEventAddResourcePath(builder, resourceP) - fb.AdminEventAddAuthDetails(builder, details) + fb.AdminEventAddAuthDetails(builder, authDetails) var eventOffset = fb.EventEnd(builder) builder.Finish(eventOffset) adminEvent = fb.GetRootAsAdminEvent(builder.FinishedBytes(), 0) @@ -561,51 +589,35 @@ func TestAdminEventToMapAccountCreated(t *testing.T) { func TestAdminEventToMapActivationEmailSent(t *testing.T) { var resourcePath = "users/8caefab3-90d1-492e-87e0-1bf6cecc76ea/send-verify-email" var optype int8 = 3 + var agentUsername = "agent_test_username" + var agentUserID = "agent_test_id" + var ipAddr = "127.0.0.1" + var clientID = "clientid_test" + var realmID = "realm" var adminEvent *fb.AdminEvent { var builder = flatbuffers.NewBuilder(0) var resourceP = builder.CreateString(resourcePath) - var key1 = builder.CreateString("clientId") - var value1 = builder.CreateString("test_username") - fb.TupleStart(builder) - fb.TupleAddKey(builder, key1) - fb.TupleAddValue(builder, value1) - var detail1 = fb.TupleEnd(builder) + var agentUsrValue = builder.CreateString(agentUsername) + var agentIDValue = builder.CreateString(agentUserID) + var agentRealmValue = builder.CreateString(realmID) + var ipValue = builder.CreateString(ipAddr) + var clientIDValue = builder.CreateString(clientID) - var key2 = builder.CreateString("ipAddress") - var value2 = builder.CreateString("127.0.0.1") - fb.TupleStart(builder) - fb.TupleAddKey(builder, key2) - fb.TupleAddValue(builder, value2) - var detail2 = fb.TupleEnd(builder) - - var key3 = builder.CreateString("realmId") - var value3 = builder.CreateString("master") - fb.TupleStart(builder) - fb.TupleAddKey(builder, key3) - fb.TupleAddValue(builder, value3) - var detail3 = fb.TupleEnd(builder) - - var key4 = builder.CreateString("userId") - var value4 = builder.CreateString("dummy_user") - fb.TupleStart(builder) - fb.TupleAddKey(builder, key4) - fb.TupleAddValue(builder, value4) - var detail4 = fb.TupleEnd(builder) - - fb.EventStartDetailsVector(builder, 4) - builder.PrependUOffsetT(detail1) - builder.PrependUOffsetT(detail2) - builder.PrependUOffsetT(detail3) - builder.PrependUOffsetT(detail4) - var details = builder.EndVector(4) + fb.AuthDetailsStart(builder) + fb.AuthDetailsAddUserId(builder, agentIDValue) + fb.AuthDetailsAddUsername(builder, agentUsrValue) + fb.AuthDetailsAddRealmId(builder, agentRealmValue) + fb.AuthDetailsAddIpAddress(builder, ipValue) + fb.AuthDetailsAddClientId(builder, clientIDValue) + var authDetails = fb.AuthDetailsEnd(builder) fb.AdminEventStart(builder) fb.AdminEventAddOperationType(builder, optype) fb.AdminEventAddResourcePath(builder, resourceP) - fb.AdminEventAddAuthDetails(builder, details) + fb.AdminEventAddAuthDetails(builder, authDetails) var eventOffset = fb.EventEnd(builder) builder.Finish(eventOffset) adminEvent = fb.GetRootAsAdminEvent(builder.FinishedBytes(), 0) @@ -639,47 +651,31 @@ func createAdminEvent(operationType int8, uid int64) *fb.AdminEvent { func createAdminEventBytes(operationType int8, uid int64) []byte { var builder = flatbuffers.NewBuilder(0) + var agentUsername = "agent_test_username" + var agentUserID = "agent_test_id" + var ipAddr = "127.0.0.1" + var clientID = "clientid_test" + var realmID = "realm" + + var agentUsrValue = builder.CreateString(agentUsername) + var agentIDValue = builder.CreateString(agentUserID) + var agentRealmValue = builder.CreateString(realmID) + var ipValue = builder.CreateString(ipAddr) + var clientIDValue = builder.CreateString(clientID) - var key1 = builder.CreateString("clientId") - var value1 = builder.CreateString("test_username") - fb.TupleStart(builder) - fb.TupleAddKey(builder, key1) - fb.TupleAddValue(builder, value1) - var detail1 = fb.TupleEnd(builder) - - var key2 = builder.CreateString("ipAddress") - var value2 = builder.CreateString("127.0.0.1") - fb.TupleStart(builder) - fb.TupleAddKey(builder, key2) - fb.TupleAddValue(builder, value2) - var detail2 = fb.TupleEnd(builder) - - var key3 = builder.CreateString("realmId") - var value3 = builder.CreateString("master") - fb.TupleStart(builder) - fb.TupleAddKey(builder, key3) - fb.TupleAddValue(builder, value3) - var detail3 = fb.TupleEnd(builder) - - var key4 = builder.CreateString("userId") - var value4 = builder.CreateString("dummy_user") - fb.TupleStart(builder) - fb.TupleAddKey(builder, key4) - fb.TupleAddValue(builder, value4) - var detail4 = fb.TupleEnd(builder) - - fb.EventStartDetailsVector(builder, 4) - builder.PrependUOffsetT(detail1) - builder.PrependUOffsetT(detail2) - builder.PrependUOffsetT(detail3) - builder.PrependUOffsetT(detail4) - var details = builder.EndVector(4) + fb.AuthDetailsStart(builder) + fb.AuthDetailsAddUserId(builder, agentIDValue) + fb.AuthDetailsAddUsername(builder, agentUsrValue) + fb.AuthDetailsAddRealmId(builder, agentRealmValue) + fb.AuthDetailsAddIpAddress(builder, ipValue) + fb.AuthDetailsAddClientId(builder, clientIDValue) + var authDetails = fb.AuthDetailsEnd(builder) fb.AdminEventStart(builder) fb.AdminEventAddTime(builder, time.Now().Unix()) fb.AdminEventAddUid(builder, uid) fb.AdminEventAddOperationType(builder, operationType) - fb.AdminEventAddAuthDetails(builder, details) + fb.AdminEventAddAuthDetails(builder, authDetails) var adminEventOffset = fb.AdminEventEnd(builder) builder.Finish(adminEventOffset) return builder.FinishedBytes()