From dfba7c70d7bd0bebae5674ba2b293f22e2e4446a Mon Sep 17 00:00:00 2001 From: Florian Schade Date: Wed, 4 Sep 2024 13:57:33 +0200 Subject: [PATCH] enhancement(audit): observe the ScienceMeshInviteTokenGenerated event in the audit service --- services/audit/pkg/service/service.go | 2 ++ services/audit/pkg/service/service_test.go | 30 +++++++++++++++++++++- services/audit/pkg/types/conversion.go | 15 +++++++++++ services/audit/pkg/types/events.go | 1 + services/audit/pkg/types/messages.go | 8 ++++++ services/audit/pkg/types/types.go | 10 ++++++++ 6 files changed, 65 insertions(+), 1 deletion(-) diff --git a/services/audit/pkg/service/service.go b/services/audit/pkg/service/service.go index 929bb2621..14690f7c7 100644 --- a/services/audit/pkg/service/service.go +++ b/services/audit/pkg/service/service.go @@ -109,6 +109,8 @@ func StartAuditLogger(ctx context.Context, ch <-chan events.Event, log log.Logge auditEvent = types.GroupMemberAdded(ev) case events.GroupMemberRemoved: auditEvent = types.GroupMemberRemoved(ev) + case events.ScienceMeshInviteTokenGenerated: + auditEvent = types.ScienceMeshInviteTokenGenerated(ev) default: log.Error().Interface("event", ev).Msg(fmt.Sprintf("can't handle event of type '%T'", ev)) continue diff --git a/services/audit/pkg/service/service_test.go b/services/audit/pkg/service/service_test.go index b8a452aa3..95224d314 100644 --- a/services/audit/pkg/service/service_test.go +++ b/services/audit/pkg/service/service_test.go @@ -5,10 +5,11 @@ import ( "encoding/json" "testing" + "github.com/stretchr/testify/require" + "github.com/cs3org/reva/v2/pkg/events" "github.com/owncloud/ocis/v2/ocis-pkg/log" "github.com/owncloud/ocis/v2/services/audit/pkg/types" - "github.com/stretchr/testify/require" group "github.com/cs3org/go-cs3apis/cs3/identity/group/v1beta1" user "github.com/cs3org/go-cs3apis/cs3/identity/user/v1beta1" @@ -558,6 +559,33 @@ var testCases = []struct { checkSpacesAuditEvent(t, ev.AuditEventSpaces, "storage-1$space-123") }, }, + { + Alias: "ScienceMesh - InviteTokenGenerated", + SystemEvent: events.Event{ + Event: events.ScienceMeshInviteTokenGenerated{ + Sharer: userID("sharer-user-id"), + RecipientMail: "mail@ocis.test", + Token: "token-123", + Description: "some-description", + Expiration: uint64(10e8), + InviteLink: "http://ocis.test/invite", + Timestamp: timestamp(10e8), + }, + }, + CheckAuditEvent: func(t *testing.T, b []byte) { + ev := types.AuditEventScienceMeshInviteTokenGenerated{} + require.NoError(t, json.Unmarshal(b, &ev)) + + // AuditEvent fields + checkBaseAuditEvent(t, ev.AuditEvent, "sharer-user-id", "2001-09-09T01:46:40Z", "user 'sharer-user-id' generated a ScienceMesh invite with token 'token-123'", "science_mesh_invite_token_generated") + // AuditEventScienceMeshInviteTokenGenerated fields + require.Equal(t, "mail@ocis.test", ev.RecipientMail) + require.Equal(t, "token-123", ev.Token) + require.Equal(t, "some-description", ev.Description) + require.Equal(t, uint64(10e8), ev.Expiration) + require.Equal(t, "http://ocis.test/invite", ev.InviteLink) + }, + }, } func TestAuditLogging(t *testing.T) { diff --git a/services/audit/pkg/types/conversion.go b/services/audit/pkg/types/conversion.go index 1dd86f0ba..55c6da847 100644 --- a/services/audit/pkg/types/conversion.go +++ b/services/audit/pkg/types/conversion.go @@ -13,6 +13,7 @@ import ( user "github.com/cs3org/go-cs3apis/cs3/identity/user/v1beta1" provider "github.com/cs3org/go-cs3apis/cs3/storage/provider/v1beta1" types "github.com/cs3org/go-cs3apis/cs3/types/v1beta1" + sdk "github.com/cs3org/reva/v2/pkg/sdk/common" ) @@ -505,6 +506,20 @@ func GroupMemberRemoved(ev events.GroupMemberRemoved) AuditEventGroupMemberRemov } } +// ScienceMeshInviteTokenGenerated converts a ScienceMeshInviteTokenGenerated event to an AuditEventScienceMeshInviteTokenGenerated +func ScienceMeshInviteTokenGenerated(ev events.ScienceMeshInviteTokenGenerated) AuditEventScienceMeshInviteTokenGenerated { + msg := MessageScienceMeshInviteTokenGenerated(ev.Sharer.GetOpaqueId(), ev.Token) + base := BasicAuditEvent(ev.Sharer.GetOpaqueId(), formatTime(ev.Timestamp), msg, ActionScienceMeshInviteTokenGenerated) + return AuditEventScienceMeshInviteTokenGenerated{ + AuditEvent: base, + RecipientMail: ev.RecipientMail, + Token: ev.Token, + Description: ev.Description, + Expiration: ev.Expiration, + InviteLink: ev.InviteLink, + } +} + func extractGrantee(uid *user.UserId, gid *group.GroupId) (string, string) { switch { case uid != nil && uid.OpaqueId != "": diff --git a/services/audit/pkg/types/events.go b/services/audit/pkg/types/events.go index 58c5b20c4..abd387dba 100644 --- a/services/audit/pkg/types/events.go +++ b/services/audit/pkg/types/events.go @@ -40,5 +40,6 @@ func RegisteredEvents() []events.Unmarshaller { events.GroupMemberAdded{}, events.GroupMemberRemoved{}, events.BackchannelLogout{}, + events.ScienceMeshInviteTokenGenerated{}, } } diff --git a/services/audit/pkg/types/messages.go b/services/audit/pkg/types/messages.go index 020bc0da3..aedef538f 100644 --- a/services/audit/pkg/types/messages.go +++ b/services/audit/pkg/types/messages.go @@ -51,6 +51,9 @@ const ( ActionGroupDeleted = "group_deleted" ActionGroupMemberAdded = "group_member_added" ActionGroupMemberRemoved = "group_member_removed" + + // ScienceMesh + ActionScienceMeshInviteTokenGenerated = "science_mesh_invite_token_generated" ) // MessageShareCreated returns the human-readable string that describes the action @@ -234,3 +237,8 @@ func MessageGroupMemberAdded(executant, userID, groupID string) string { func MessageGroupMemberRemoved(executant, userID, groupID string) string { return fmt.Sprintf("user '%s' added user '%s' was removed from group '%s'", executant, userID, groupID) } + +// MessageScienceMeshInviteTokenGenerated returns the human-readable string that describes the action +func MessageScienceMeshInviteTokenGenerated(user, token string) string { + return fmt.Sprintf("user '%s' generated a ScienceMesh invite with token '%s'", user, token) +} diff --git a/services/audit/pkg/types/types.go b/services/audit/pkg/types/types.go index 1f4d8b250..9e5278351 100644 --- a/services/audit/pkg/types/types.go +++ b/services/audit/pkg/types/types.go @@ -274,3 +274,13 @@ type AuditEventGroupMemberRemoved struct { GroupID string UserID string } + +// AuditEventScienceMeshInviteTokenGenerated is the event logged when a ScienceMesh invite token is generated +type AuditEventScienceMeshInviteTokenGenerated struct { + AuditEvent + RecipientMail string + Token string + Description string + Expiration uint64 + InviteLink string +}