From 612e0b6bf13e887a51d98fc63c38d3ef3cf5cdb1 Mon Sep 17 00:00:00 2001 From: jkoberg Date: Wed, 16 Mar 2022 15:21:52 +0100 Subject: [PATCH 1/9] use feature reva & file config Signed-off-by: jkoberg --- go.mod | 2 ++ go.sum | 4 ++-- storage/pkg/command/storageusers.go | 8 ++++++++ 3 files changed, 12 insertions(+), 2 deletions(-) diff --git a/go.mod b/go.mod index a593e47f8c9..cc1056bbb44 100644 --- a/go.mod +++ b/go.mod @@ -275,3 +275,5 @@ require ( // we need to use a fork to make the windows build pass replace github.com/pkg/xattr => github.com/micbar/xattr v0.4.6-0.20220215112335-88e74d648fb7 + +replace github.com/cs3org/reva/v2 => github.com/kobergj/reva/v2 v2.0.0-20220316140541-9a318b5e3b11 diff --git a/go.sum b/go.sum index 757c94253e4..3ca1b48a8aa 100644 --- a/go.sum +++ b/go.sum @@ -341,8 +341,6 @@ github.com/crewjam/saml v0.4.6/go.mod h1:ZBOXnNPFzB3CgOkRm7Nd6IVdkG+l/wF+0ZXLqD9 github.com/cs3org/cato v0.0.0-20200828125504-e418fc54dd5e/go.mod h1:XJEZ3/EQuI3BXTp/6DUzFr850vlxq11I6satRtz0YQ4= github.com/cs3org/go-cs3apis v0.0.0-20220126114148-64c025ccdd19 h1:1jqPH58jCxvbaJ9WLIJ7W2/m622bWS6ChptzljSG6IQ= github.com/cs3org/go-cs3apis v0.0.0-20220126114148-64c025ccdd19/go.mod h1:UXha4TguuB52H14EMoSsCqDj7k8a/t7g4gVP+bgY5LY= -github.com/cs3org/reva/v2 v2.0.0-20220314085001-8e5b22a20a3f h1:tv7v6OjbFoDFNB2ikGC+LLaWEOIAJnrZjyO5LRTDL0g= -github.com/cs3org/reva/v2 v2.0.0-20220314085001-8e5b22a20a3f/go.mod h1:XNtK1HEClNzmz5vyQa2DUw4KH3oqBjQoEsV1LhAGlV0= github.com/cubewise-code/go-mime v0.0.0-20200519001935-8c5762b177d8 h1:Z9lwXumT5ACSmJ7WGnFl+OMLLjpz5uR2fyz7dC255FI= github.com/cubewise-code/go-mime v0.0.0-20200519001935-8c5762b177d8/go.mod h1:4abs/jPXcmJzYoYGF91JF9Uq9s/KL5n1jvFDix8KcqY= github.com/cyberdelia/templates v0.0.0-20141128023046-ca7fffd4298c/go.mod h1:GyV+0YP4qX0UQ7r2MoYZ+AvYDp12OF5yg4q8rGnyNh4= @@ -908,6 +906,8 @@ github.com/klauspost/cpuid/v2 v2.0.4/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa02 github.com/klauspost/cpuid/v2 v2.0.9 h1:lgaqFMSdTdQYdZ04uHyN2d/eKdOMyi2YLSvlQIBFYa4= github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= github.com/kljensen/snowball v0.6.0/go.mod h1:27N7E8fVU5H68RlUmnWwZCfxgt4POBJfENGMvNRhldw= +github.com/kobergj/reva/v2 v2.0.0-20220316140541-9a318b5e3b11 h1:7pNti5K/6oJDzOW5pJ4Khb/r/zL/jABtYrgpo3uE8ew= +github.com/kobergj/reva/v2 v2.0.0-20220316140541-9a318b5e3b11/go.mod h1:XNtK1HEClNzmz5vyQa2DUw4KH3oqBjQoEsV1LhAGlV0= github.com/kolo/xmlrpc v0.0.0-20200310150728-e0350524596b/go.mod h1:o03bZfuBwAXHetKXuInt4S7omeXUu62/A845kiycsSQ= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= diff --git a/storage/pkg/command/storageusers.go b/storage/pkg/command/storageusers.go index 3edbd6a1b0a..0ebd6811762 100644 --- a/storage/pkg/command/storageusers.go +++ b/storage/pkg/command/storageusers.go @@ -112,6 +112,14 @@ func storageUsersConfigFromStruct(c *cli.Context, cfg *config.Config) map[string "tmp_folder": cfg.Reva.StorageUsers.TempFolder, }, }, + "interceptors": map[string]interface{}{ + "eventsmiddleware": map[string]interface{}{ + "group": "sharing", + "type": "nats", + "address": cfg.Reva.Sharing.Events.Address, + "clusterID": cfg.Reva.Sharing.Events.ClusterID, + }, + }, }, "http": map[string]interface{}{ "network": cfg.Reva.StorageUsers.HTTPNetwork, From 28ea2c97bcadafc92aeab7acb1a6b85a0748a065 Mon Sep 17 00:00:00 2001 From: jkoberg Date: Wed, 16 Mar 2022 15:53:56 +0100 Subject: [PATCH 2/9] pre-implementation Signed-off-by: jkoberg --- audit/pkg/service/service.go | 14 +++++++ audit/pkg/types/conversion.go | 35 +++++++++++++++++ audit/pkg/types/events.go | 7 ++++ audit/pkg/types/types.go | 72 +++++++++++++++++++++++++++++++++++ go.mod | 2 +- go.sum | 4 +- 6 files changed, 131 insertions(+), 3 deletions(-) diff --git a/audit/pkg/service/service.go b/audit/pkg/service/service.go index 905e251ee51..5edc11122d8 100644 --- a/audit/pkg/service/service.go +++ b/audit/pkg/service/service.go @@ -61,6 +61,20 @@ func StartAuditLogger(ctx context.Context, ch <-chan interface{}, log log.Logger auditEvent = types.LinkAccessed(ev) case events.LinkAccessFailed: auditEvent = types.LinkAccessFailed(ev) + case events.FileUploaded: + auditEvent = types.FileUploaded(ev) + case events.FileDownloaded: + auditEvent = types.FileDownloaded(ev) + case events.ItemMoved: + auditEvent = types.ItemMoved(ev) + case events.ItemTrashed: + auditEvent = types.ItemTrashed(ev) + case events.ItemPurged: + auditEvent = types.ItemPurged(ev) + case events.ItemRestored: + auditEvent = types.ItemRestored(ev) + case events.FileVersionRestored: + auditEvent = types.FileVersionRestored(ev) default: log.Error().Interface("event", ev).Msg(fmt.Sprintf("can't handle event of type '%T'", ev)) continue diff --git a/audit/pkg/types/conversion.go b/audit/pkg/types/conversion.go index c90ab0eec43..7ed39441397 100644 --- a/audit/pkg/types/conversion.go +++ b/audit/pkg/types/conversion.go @@ -220,6 +220,41 @@ func LinkAccessFailed(ev events.LinkAccessFailed) AuditEventLinkAccessed { } } +// FileUploaded converts a FileUploaded event to an AuditEventFileCreated +func FileUploaded(ev events.FileUploaded) AuditEventFileCreated { + return AuditEventFileCreated{} +} + +// FileDownloaded converts a FileDownloaded event to an AuditEventFileRead +func FileDownloaded(ev events.FileDownloaded) AuditEventFileRead { + return AuditEventFileRead{} +} + +// ItemMoved converts a ItemMoved event to an AuditEventFileRenamed +func ItemMoved(ev events.ItemMoved) AuditEventFileRenamed { + return AuditEventFileRenamed{} +} + +// ItemTrashed converts a ItemTrashed event to an AuditEventFileDeleted +func ItemTrashed(ev events.ItemTrashed) AuditEventFileDeleted { + return AuditEventFileDeleted{} +} + +// ItemPurged converts a ItemPurged event to an AuditEventFilePurged +func ItemPurged(ev events.ItemPurged) AuditEventFilePurged { + return AuditEventFilePurged{} +} + +// ItemRestored converts a ItemRestored event to an AuditEventFileRestored +func ItemRestored(ev events.ItemRestored) AuditEventFileRestored { + return AuditEventFileRestored{} +} + +// FileVersionRestored converts a FileVersionRestored event to an AuditEventFileVersionRestored +func FileVersionRestored(ev events.FileVersionRestored) AuditEventFileVersionRestored { + return AuditEventFileVersionRestored{} +} + func extractGrantee(uid *user.UserId, gid *group.GroupId) (string, string) { switch { case uid != nil && uid.OpaqueId != "": diff --git a/audit/pkg/types/events.go b/audit/pkg/types/events.go index 801dd41790d..85cb3c99c74 100644 --- a/audit/pkg/types/events.go +++ b/audit/pkg/types/events.go @@ -16,5 +16,12 @@ func RegisteredEvents() []events.Unmarshaller { events.ReceivedShareUpdated{}, events.LinkAccessed{}, events.LinkAccessFailed{}, + events.FileUploaded{}, + events.FileDownloaded{}, + events.ItemTrashed{}, + events.ItemMoved{}, + events.ItemPurged{}, + events.ItemRestored{}, + events.FileVersionRestored{}, } } diff --git a/audit/pkg/types/types.go b/audit/pkg/types/types.go index 17e2d0a3e16..16e779fd557 100644 --- a/audit/pkg/types/types.go +++ b/audit/pkg/types/types.go @@ -15,6 +15,10 @@ type AuditEvent struct { Level int // the log level of the entry (usually 1 for audit events) } +/* + Sharing +*/ + // AuditEventSharing is the basic audit event for shares type AuditEventSharing struct { AuditEvent @@ -76,3 +80,71 @@ type AuditEventLinkAccessed struct { Success bool // If the request was successful. ItemType string // file or folder } + +/* + Files +*/ + +// AuditEventFiles is the basic audit event for files +type AuditEventFiles struct { + AuditEvent + + Path string // The full path to the create file. + Owner string // The UID of the owner of the file. + FileID string // The newly created files identifier. +} + +// AuditEventFileCreated is the event logged when a file is created +type AuditEventFileCreated struct { + AuditEventFiles +} + +// AuditEventFileRead is the event logged when a file is read (aka downloaded) +type AuditEventFileRead struct { + AuditEventFiles +} + +// AuditEventFileUpdated is the event logged when a file is updated +// TODO: How to differentiate between new uploads and new version uploads? +// FIXME: implement +type AuditEventFileUpdated struct { + AuditEventFiles +} + +// AuditEventFileDeleted is the event logged when a file is deleted (aka trashed) +type AuditEventFileDeleted struct { + AuditEventFiles +} + +// AuditEventFileCopied is the event logged when a file is copied +// TODO: copy is a download&upload for now. How to know it was a copy? +// FIXME: implement +type AuditEventFileCopied struct { + AuditEventFiles +} + +// AuditEventFileRenamed is the event logged when a file is renamed (moved) +type AuditEventFileRenamed struct { + AuditEventFiles +} + +// AuditEventFilePurged is the event logged when a file is purged (deleted from trashbin) +type AuditEventFilePurged struct { + AuditEventFiles +} + +// AuditEventFileRestored is the event logged when a file is restored (from trashbin) +type AuditEventFileRestored struct { + AuditEventFiles +} + +// AuditEventFileVersionRestored is the event logged when a file version is restored +type AuditEventFileVersionRestored struct { + AuditEventFiles +} + +// AuditEventFileVersionDeleted is the event logged when a file version is deleted +// TODO: is this even possible? +type AuditEventFileVersionDeleted struct { + AuditEventFiles +} diff --git a/go.mod b/go.mod index cc1056bbb44..a49f5b90c9a 100644 --- a/go.mod +++ b/go.mod @@ -276,4 +276,4 @@ require ( // we need to use a fork to make the windows build pass replace github.com/pkg/xattr => github.com/micbar/xattr v0.4.6-0.20220215112335-88e74d648fb7 -replace github.com/cs3org/reva/v2 => github.com/kobergj/reva/v2 v2.0.0-20220316140541-9a318b5e3b11 +replace github.com/cs3org/reva/v2 => github.com/kobergj/reva/v2 v2.0.0-20220316142653-505576572261 diff --git a/go.sum b/go.sum index 3ca1b48a8aa..74c1d55f2be 100644 --- a/go.sum +++ b/go.sum @@ -906,8 +906,8 @@ github.com/klauspost/cpuid/v2 v2.0.4/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa02 github.com/klauspost/cpuid/v2 v2.0.9 h1:lgaqFMSdTdQYdZ04uHyN2d/eKdOMyi2YLSvlQIBFYa4= github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= github.com/kljensen/snowball v0.6.0/go.mod h1:27N7E8fVU5H68RlUmnWwZCfxgt4POBJfENGMvNRhldw= -github.com/kobergj/reva/v2 v2.0.0-20220316140541-9a318b5e3b11 h1:7pNti5K/6oJDzOW5pJ4Khb/r/zL/jABtYrgpo3uE8ew= -github.com/kobergj/reva/v2 v2.0.0-20220316140541-9a318b5e3b11/go.mod h1:XNtK1HEClNzmz5vyQa2DUw4KH3oqBjQoEsV1LhAGlV0= +github.com/kobergj/reva/v2 v2.0.0-20220316142653-505576572261 h1:cXHbAa17q5pcc3RUDWN0JtvQjAZJ9+xzoKherNkTf/8= +github.com/kobergj/reva/v2 v2.0.0-20220316142653-505576572261/go.mod h1:XNtK1HEClNzmz5vyQa2DUw4KH3oqBjQoEsV1LhAGlV0= github.com/kolo/xmlrpc v0.0.0-20200310150728-e0350524596b/go.mod h1:o03bZfuBwAXHetKXuInt4S7omeXUu62/A845kiycsSQ= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= From b239ded3eb1f40dac8233901aa80bfd5418a98a6 Mon Sep 17 00:00:00 2001 From: jkoberg Date: Wed, 16 Mar 2022 15:56:53 +0100 Subject: [PATCH 3/9] add changelog Signed-off-by: jkoberg --- changelog/unreleased/file-events-audit-logging.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 changelog/unreleased/file-events-audit-logging.md diff --git a/changelog/unreleased/file-events-audit-logging.md b/changelog/unreleased/file-events-audit-logging.md new file mode 100644 index 00000000000..816f0e61d0a --- /dev/null +++ b/changelog/unreleased/file-events-audit-logging.md @@ -0,0 +1,5 @@ +Enhancement: Audit logger will now log file events + +See full list of supported events in `audit/pkg/types/types.go` + +https://github.com/owncloud/ocis/pull/3332 From 83a6d242ee16ff8e4c84650cd51af3dc5775ea58 Mon Sep 17 00:00:00 2001 From: jkoberg Date: Thu, 17 Mar 2022 14:30:03 +0100 Subject: [PATCH 4/9] prerequesists for unit tests Signed-off-by: jkoberg --- audit/pkg/service/service_test.go | 28 +++++++++++++++++++ audit/pkg/types/constants.go | 45 +++++++++++++++++++++++++++++++ 2 files changed, 73 insertions(+) diff --git a/audit/pkg/service/service_test.go b/audit/pkg/service/service_test.go index 8bdcac5cd45..28e84457992 100644 --- a/audit/pkg/service/service_test.go +++ b/audit/pkg/service/service_test.go @@ -294,6 +294,20 @@ var testCases = []struct { require.Equal(t, "token-123", ev.ShareToken) require.Equal(t, false, ev.Success) }, + }, { + Alias: "File uploaded", + SystemEvent: events.FileUploaded{ + FileID: reference("sto-123", "iid-123", "./item"), + }, + CheckAuditEvent: func(t *testing.T, b []byte) { + ev := types.AuditEventFileCreated{} + require.NoError(t, json.Unmarshal(b, &ev)) + + // AuditEvent fields + checkBaseAuditEvent(t, ev.AuditEvent, "", "", "link 'shareid' was accessed. Success: false", "public_link_accessed") + // AuditEventSharing fields + checkFilesAuditEvent(t, ev.AuditEventFiles, "", "", "shareid") + }, }, } @@ -343,6 +357,12 @@ func checkSharingAuditEvent(t *testing.T, ev types.AuditEventSharing, itemID str require.Equal(t, shareID, ev.ShareID) } +func checkFilesAuditEvent(t *testing.T, ev types.AuditEventFiles, itemID string, owner string, path string) { + require.Equal(t, itemID, ev.FileID) + require.Equal(t, owner, ev.Owner) + require.Equal(t, path, ev.Path) +} + func shareID(id string) *collaboration.ShareId { return &collaboration.ShareId{ OpaqueId: id, @@ -376,6 +396,13 @@ func resourceID(sid, oid string) *provider.ResourceId { } } +func reference(sid, oid, path string) *provider.Reference { + return &provider.Reference{ + ResourceId: resourceID(sid, oid), + Path: path, + } +} + func timestamp(seconds uint64) *rtypes.Timestamp { return &rtypes.Timestamp{ Seconds: seconds, @@ -394,6 +421,7 @@ func linkPermissions(perms ...string) *link.PublicSharePermissions { Permissions: permissions(perms...), } } + func permissions(permissions ...string) *provider.ResourcePermissions { perms := &provider.ResourcePermissions{} diff --git a/audit/pkg/types/constants.go b/audit/pkg/types/constants.go index 663996241dd..8a88189fbc7 100644 --- a/audit/pkg/types/constants.go +++ b/audit/pkg/types/constants.go @@ -4,6 +4,7 @@ import "fmt" // short identifiers for audit actions const ( + // Sharing ActionShareCreated = "file_shared" ActionSharePermissionUpdated = "share_permission_updated" ActionShareDisplayNameUpdated = "share_name_updated" @@ -13,6 +14,15 @@ const ( ActionShareAccepted = "share_accepted" ActionShareDeclined = "share_declined" ActionLinkAccessed = "public_link_accessed" + + // Files + ActionFileCreated = "file_created" + ActionFileRead = "file_read" + ActionFileTrashed = "file_delete" + ActionFileRename = "file_renamed" + ActionFilePurged = "file_trash_delete" + ActionFileRestored = "file_trash_restored" + ActionFileVersionRestored = "file_version_restore" ) // MessageShareCreated returns the human readable string that describes the action @@ -59,3 +69,38 @@ func MessageShareDeclined(userid, shareid, sharerid string) string { func MessageLinkAccessed(linkid string, success bool) string { return fmt.Sprintf("link '%s' was accessed. Success: %v", linkid, success) } + +// MessageFileCreated returns the human readable string that describes the action +func MessageFileCreated(item string) string { + return fmt.Sprintf("File '%s' was created", item) +} + +// MessageFileRead returns the human readable string that describes the action +func MessageFileRead(item string) string { + return fmt.Sprintf("File '%s' was read", item) +} + +// MessageFileTrashed returns the human readable string that describes the action +func MessageFileTrashed(item string) string { + return fmt.Sprintf("File '%s' was trashed", item) +} + +// MessageFileRenamed returns the human readable string that describes the action +func MessageFileRenamed(item, oldpath, newpath string) string { + return fmt.Sprintf("File '%s' was moved from '%s' to '%s'", item, oldpath, newpath) +} + +// MessageFilePurged returns the human readable string that describes the action +func MessageFilePurged(item string) string { + return fmt.Sprintf("File '%s' was removed from trashbin", item) +} + +// MessageFileRestored returns the human readable string that describes the action +func MessageFileRestored(item string, path string) string { + return fmt.Sprintf("File '%s' was restored from trashbin to '%s'", item, path) +} + +// MessageFileVersionRestored returns the human readable string that describes the action +func MessageFileVersionRestored(item string, version string) string { + return fmt.Sprintf("File '%s' was restored in version '%s'", item, version) +} From 665a1c9c496ae8617042743b98b7f4a3e2774bc5 Mon Sep 17 00:00:00 2001 From: jkoberg Date: Thu, 17 Mar 2022 14:45:46 +0100 Subject: [PATCH 5/9] file created event Signed-off-by: jkoberg --- audit/pkg/service/service_test.go | 5 +++-- audit/pkg/types/conversion.go | 25 ++++++++++++++++++++++++- 2 files changed, 27 insertions(+), 3 deletions(-) diff --git a/audit/pkg/service/service_test.go b/audit/pkg/service/service_test.go index 28e84457992..978330e5960 100644 --- a/audit/pkg/service/service_test.go +++ b/audit/pkg/service/service_test.go @@ -298,15 +298,16 @@ var testCases = []struct { Alias: "File uploaded", SystemEvent: events.FileUploaded{ FileID: reference("sto-123", "iid-123", "./item"), + Owner: userID("uid-123"), // NOTE: owner not yet implemented in reva }, CheckAuditEvent: func(t *testing.T, b []byte) { ev := types.AuditEventFileCreated{} require.NoError(t, json.Unmarshal(b, &ev)) // AuditEvent fields - checkBaseAuditEvent(t, ev.AuditEvent, "", "", "link 'shareid' was accessed. Success: false", "public_link_accessed") + checkBaseAuditEvent(t, ev.AuditEvent, "uid-123", "", "File 'iid-123' was created", "file_created") // AuditEventSharing fields - checkFilesAuditEvent(t, ev.AuditEventFiles, "", "", "shareid") + checkFilesAuditEvent(t, ev.AuditEventFiles, "iid-123", "uid-123", "./item") }, }, } diff --git a/audit/pkg/types/conversion.go b/audit/pkg/types/conversion.go index 7ed39441397..e2be05aa469 100644 --- a/audit/pkg/types/conversion.go +++ b/audit/pkg/types/conversion.go @@ -220,9 +220,32 @@ func LinkAccessFailed(ev events.LinkAccessFailed) AuditEventLinkAccessed { } } +// FilesAuditEvent creates an AuditEventFiles from the given values +func FilesAuditEvent(base AuditEvent, itemid string, owner string, path string) AuditEventFiles { + return AuditEventFiles{ + AuditEvent: base, + FileID: itemid, + Owner: owner, + Path: path, + } +} + // FileUploaded converts a FileUploaded event to an AuditEventFileCreated func FileUploaded(ev events.FileUploaded) AuditEventFileCreated { - return AuditEventFileCreated{} + iid, path := "", "" + if ev.FileID != nil { + iid = ev.FileID.GetResourceId().GetOpaqueId() + path = ev.FileID.GetPath() + } + + uid := "" + if ev.Owner != nil { + uid = ev.Owner.GetOpaqueId() + } + base := BasicAuditEvent(uid, "", MessageFileCreated(iid), ActionFileCreated) + return AuditEventFileCreated{ + AuditEventFiles: FilesAuditEvent(base, iid, uid, path), + } } // FileDownloaded converts a FileDownloaded event to an AuditEventFileRead From 0a2ddfac887f507df621125f7b34fe13adb7a32b Mon Sep 17 00:00:00 2001 From: jkoberg Date: Thu, 17 Mar 2022 16:07:07 +0100 Subject: [PATCH 6/9] remaining tests & events Signed-off-by: jkoberg --- audit/pkg/service/service_test.go | 107 +++++++++++++++++++++++++++++- audit/pkg/types/constants.go | 10 +-- audit/pkg/types/conversion.go | 79 +++++++++++++++++----- audit/pkg/types/types.go | 6 ++ 4 files changed, 178 insertions(+), 24 deletions(-) diff --git a/audit/pkg/service/service_test.go b/audit/pkg/service/service_test.go index 978330e5960..d64615426a7 100644 --- a/audit/pkg/service/service_test.go +++ b/audit/pkg/service/service_test.go @@ -295,7 +295,7 @@ var testCases = []struct { require.Equal(t, false, ev.Success) }, }, { - Alias: "File uploaded", + Alias: "File created", SystemEvent: events.FileUploaded{ FileID: reference("sto-123", "iid-123", "./item"), Owner: userID("uid-123"), // NOTE: owner not yet implemented in reva @@ -305,10 +305,113 @@ var testCases = []struct { require.NoError(t, json.Unmarshal(b, &ev)) // AuditEvent fields - checkBaseAuditEvent(t, ev.AuditEvent, "uid-123", "", "File 'iid-123' was created", "file_created") + checkBaseAuditEvent(t, ev.AuditEvent, "uid-123", "", "File 'iid-123' was created", "file_create") // AuditEventSharing fields checkFilesAuditEvent(t, ev.AuditEventFiles, "iid-123", "uid-123", "./item") }, + }, { + Alias: "File read", + SystemEvent: events.FileDownloaded{ + FileID: reference("sto-123", "iid-123", "./item"), + Owner: userID("uid-123"), // NOTE: owner not yet implemented in reva + }, + CheckAuditEvent: func(t *testing.T, b []byte) { + ev := types.AuditEventFileRead{} + require.NoError(t, json.Unmarshal(b, &ev)) + + // AuditEvent fields + checkBaseAuditEvent(t, ev.AuditEvent, "uid-123", "", "File 'iid-123' was read", "file_read") + // AuditEventSharing fields + checkFilesAuditEvent(t, ev.AuditEventFiles, "iid-123", "uid-123", "./item") + }, + }, { + Alias: "File trashed", + SystemEvent: events.ItemTrashed{ + FileID: reference("sto-123", "iid-123", "./item"), + Owner: userID("uid-123"), // NOTE: owner not yet implemented in reva + }, + CheckAuditEvent: func(t *testing.T, b []byte) { + ev := types.AuditEventFileDeleted{} + require.NoError(t, json.Unmarshal(b, &ev)) + + // AuditEvent fields + checkBaseAuditEvent(t, ev.AuditEvent, "uid-123", "", "File 'iid-123' was trashed", "file_delete") + // AuditEventSharing fields + checkFilesAuditEvent(t, ev.AuditEventFiles, "iid-123", "uid-123", "./item") + }, + }, { + Alias: "File renamed", + SystemEvent: events.ItemMoved{ + FileID: reference("sto-123", "iid-123", "./item"), + OldReference: reference("sto-123", "iid-123", "./anotheritem"), + Owner: userID("uid-123"), // NOTE: owner not yet implemented in reva + }, + CheckAuditEvent: func(t *testing.T, b []byte) { + ev := types.AuditEventFileRenamed{} + require.NoError(t, json.Unmarshal(b, &ev)) + + // AuditEvent fields + checkBaseAuditEvent(t, ev.AuditEvent, "uid-123", "", "File 'iid-123' was moved from './anotheritem' to './item'", "file_rename") + // AuditEventSharing fields + checkFilesAuditEvent(t, ev.AuditEventFiles, "iid-123", "uid-123", "./item") + // AuditEventFileRenamed fields + require.Equal(t, "./anotheritem", ev.OldPath) + + }, + }, { + Alias: "File purged", + SystemEvent: events.ItemPurged{ + FileID: reference("sto-123", "iid-123", "./item"), + Owner: userID("uid-123"), // NOTE: owner not yet implemented in reva + }, + CheckAuditEvent: func(t *testing.T, b []byte) { + ev := types.AuditEventFilePurged{} + require.NoError(t, json.Unmarshal(b, &ev)) + + // AuditEvent fields + checkBaseAuditEvent(t, ev.AuditEvent, "uid-123", "", "File 'iid-123' was removed from trashbin", "file_trash_delete") + // AuditEventSharing fields + checkFilesAuditEvent(t, ev.AuditEventFiles, "iid-123", "uid-123", "./item") + }, + }, { + Alias: "File restored", + SystemEvent: events.ItemRestored{ + FileID: reference("sto-123", "iid-123", "./item"), + Owner: userID("uid-123"), // NOTE: owner not yet implemented in reva + OldReference: reference("sto-123", "iid-123", "./oldpath"), + Key: "", + }, + CheckAuditEvent: func(t *testing.T, b []byte) { + ev := types.AuditEventFileRestored{} + require.NoError(t, json.Unmarshal(b, &ev)) + + // AuditEvent fields + checkBaseAuditEvent(t, ev.AuditEvent, "uid-123", "", "File 'iid-123' was restored from trashbin to './item' (previous location: './oldpath')", "file_trash_restore") + // AuditEventSharing fields + checkFilesAuditEvent(t, ev.AuditEventFiles, "iid-123", "uid-123", "./item") + // AuditEventFileRestored fields + require.Equal(t, "./oldpath", ev.OldPath) + + }, + }, { + Alias: "File version restored", + SystemEvent: events.FileVersionRestored{ + FileID: reference("sto-123", "iid-123", "./item"), + Owner: userID("uid-123"), // NOTE: owner not yet implemented in reva + Key: "v1", + }, + CheckAuditEvent: func(t *testing.T, b []byte) { + ev := types.AuditEventFileVersionRestored{} + require.NoError(t, json.Unmarshal(b, &ev)) + + // AuditEvent fields + checkBaseAuditEvent(t, ev.AuditEvent, "uid-123", "", "File 'iid-123' was restored in version 'v1'", "file_version_restore") + // AuditEventSharing fields + checkFilesAuditEvent(t, ev.AuditEventFiles, "iid-123", "uid-123", "./item") + // AuditEventFileRestored fields + require.Equal(t, "v1", ev.Key) + + }, }, } diff --git a/audit/pkg/types/constants.go b/audit/pkg/types/constants.go index 8a88189fbc7..39093880ee1 100644 --- a/audit/pkg/types/constants.go +++ b/audit/pkg/types/constants.go @@ -16,12 +16,12 @@ const ( ActionLinkAccessed = "public_link_accessed" // Files - ActionFileCreated = "file_created" + ActionFileCreated = "file_create" ActionFileRead = "file_read" ActionFileTrashed = "file_delete" - ActionFileRename = "file_renamed" + ActionFileRenamed = "file_rename" ActionFilePurged = "file_trash_delete" - ActionFileRestored = "file_trash_restored" + ActionFileRestored = "file_trash_restore" ActionFileVersionRestored = "file_version_restore" ) @@ -96,8 +96,8 @@ func MessageFilePurged(item string) string { } // MessageFileRestored returns the human readable string that describes the action -func MessageFileRestored(item string, path string) string { - return fmt.Sprintf("File '%s' was restored from trashbin to '%s'", item, path) +func MessageFileRestored(item, oldpath, path string) string { + return fmt.Sprintf("File '%s' was restored from trashbin to '%s' (previous location: '%s')", item, path, oldpath) } // MessageFileVersionRestored returns the human readable string that describes the action diff --git a/audit/pkg/types/conversion.go b/audit/pkg/types/conversion.go index e2be05aa469..befc7f77475 100644 --- a/audit/pkg/types/conversion.go +++ b/audit/pkg/types/conversion.go @@ -8,6 +8,7 @@ import ( group "github.com/cs3org/go-cs3apis/cs3/identity/group/v1beta1" 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" ) @@ -221,7 +222,7 @@ func LinkAccessFailed(ev events.LinkAccessFailed) AuditEventLinkAccessed { } // FilesAuditEvent creates an AuditEventFiles from the given values -func FilesAuditEvent(base AuditEvent, itemid string, owner string, path string) AuditEventFiles { +func FilesAuditEvent(base AuditEvent, itemid, owner, path string) AuditEventFiles { return AuditEventFiles{ AuditEvent: base, FileID: itemid, @@ -232,16 +233,7 @@ func FilesAuditEvent(base AuditEvent, itemid string, owner string, path string) // FileUploaded converts a FileUploaded event to an AuditEventFileCreated func FileUploaded(ev events.FileUploaded) AuditEventFileCreated { - iid, path := "", "" - if ev.FileID != nil { - iid = ev.FileID.GetResourceId().GetOpaqueId() - path = ev.FileID.GetPath() - } - - uid := "" - if ev.Owner != nil { - uid = ev.Owner.GetOpaqueId() - } + iid, path, uid := extractFileDetails(ev.FileID, ev.Owner) base := BasicAuditEvent(uid, "", MessageFileCreated(iid), ActionFileCreated) return AuditEventFileCreated{ AuditEventFiles: FilesAuditEvent(base, iid, uid, path), @@ -250,32 +242,71 @@ func FileUploaded(ev events.FileUploaded) AuditEventFileCreated { // FileDownloaded converts a FileDownloaded event to an AuditEventFileRead func FileDownloaded(ev events.FileDownloaded) AuditEventFileRead { - return AuditEventFileRead{} + iid, path, uid := extractFileDetails(ev.FileID, ev.Owner) + base := BasicAuditEvent(uid, "", MessageFileRead(iid), ActionFileRead) + return AuditEventFileRead{ + AuditEventFiles: FilesAuditEvent(base, iid, uid, path), + } } // ItemMoved converts a ItemMoved event to an AuditEventFileRenamed func ItemMoved(ev events.ItemMoved) AuditEventFileRenamed { - return AuditEventFileRenamed{} + iid, path, uid := extractFileDetails(ev.FileID, ev.Owner) + + oldpath := "" + if ev.OldReference != nil { + oldpath = ev.OldReference.GetPath() + } + + base := BasicAuditEvent(uid, "", MessageFileRenamed(iid, oldpath, path), ActionFileRenamed) + return AuditEventFileRenamed{ + AuditEventFiles: FilesAuditEvent(base, iid, uid, path), + OldPath: oldpath, + } } // ItemTrashed converts a ItemTrashed event to an AuditEventFileDeleted func ItemTrashed(ev events.ItemTrashed) AuditEventFileDeleted { - return AuditEventFileDeleted{} + iid, path, uid := extractFileDetails(ev.FileID, ev.Owner) + base := BasicAuditEvent(uid, "", MessageFileTrashed(iid), ActionFileTrashed) + return AuditEventFileDeleted{ + AuditEventFiles: FilesAuditEvent(base, iid, uid, path), + } } // ItemPurged converts a ItemPurged event to an AuditEventFilePurged func ItemPurged(ev events.ItemPurged) AuditEventFilePurged { - return AuditEventFilePurged{} + iid, path, uid := extractFileDetails(ev.FileID, ev.Owner) + base := BasicAuditEvent(uid, "", MessageFilePurged(iid), ActionFilePurged) + return AuditEventFilePurged{ + AuditEventFiles: FilesAuditEvent(base, iid, uid, path), + } } // ItemRestored converts a ItemRestored event to an AuditEventFileRestored func ItemRestored(ev events.ItemRestored) AuditEventFileRestored { - return AuditEventFileRestored{} + iid, path, uid := extractFileDetails(ev.FileID, ev.Owner) + + oldpath := "" + if ev.OldReference != nil { + oldpath = ev.OldReference.GetPath() + } + + base := BasicAuditEvent(uid, "", MessageFileRestored(iid, oldpath, path), ActionFileRestored) + return AuditEventFileRestored{ + AuditEventFiles: FilesAuditEvent(base, iid, uid, path), + OldPath: oldpath, + } } // FileVersionRestored converts a FileVersionRestored event to an AuditEventFileVersionRestored func FileVersionRestored(ev events.FileVersionRestored) AuditEventFileVersionRestored { - return AuditEventFileVersionRestored{} + iid, path, uid := extractFileDetails(ev.FileID, ev.Owner) + base := BasicAuditEvent(uid, "", MessageFileVersionRestored(iid, ev.Key), ActionFileVersionRestored) + return AuditEventFileVersionRestored{ + AuditEventFiles: FilesAuditEvent(base, iid, uid, path), + Key: ev.Key, + } } func extractGrantee(uid *user.UserId, gid *group.GroupId) (string, string) { @@ -289,6 +320,20 @@ func extractGrantee(uid *user.UserId, gid *group.GroupId) (string, string) { return "", "" } +func extractFileDetails(ref *provider.Reference, owner *user.UserId) (string, string, string) { + iid, path := "", "" + if ref != nil { + iid = ref.GetResourceId().GetOpaqueId() + path = ref.GetPath() + } + + uid := "" + if owner != nil { + uid = owner.GetOpaqueId() + } + return iid, path, uid +} + func formatTime(t *types.Timestamp) string { if t == nil { return "" diff --git a/audit/pkg/types/types.go b/audit/pkg/types/types.go index 16e779fd557..1b1728f0237 100644 --- a/audit/pkg/types/types.go +++ b/audit/pkg/types/types.go @@ -126,6 +126,8 @@ type AuditEventFileCopied struct { // AuditEventFileRenamed is the event logged when a file is renamed (moved) type AuditEventFileRenamed struct { AuditEventFiles + + OldPath string } // AuditEventFilePurged is the event logged when a file is purged (deleted from trashbin) @@ -136,11 +138,15 @@ type AuditEventFilePurged struct { // AuditEventFileRestored is the event logged when a file is restored (from trashbin) type AuditEventFileRestored struct { AuditEventFiles + + OldPath string } // AuditEventFileVersionRestored is the event logged when a file version is restored type AuditEventFileVersionRestored struct { AuditEventFiles + + Key string } // AuditEventFileVersionDeleted is the event logged when a file version is deleted From d4a74a8b88d0412fac295f31f2644dfe4230e6e5 Mon Sep 17 00:00:00 2001 From: jkoberg Date: Thu, 17 Mar 2022 16:34:23 +0100 Subject: [PATCH 7/9] use edge reva Signed-off-by: jkoberg --- go.mod | 4 +--- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/go.mod b/go.mod index 35a033b1843..5378d6c931a 100644 --- a/go.mod +++ b/go.mod @@ -22,7 +22,7 @@ require ( github.com/blevesearch/bleve/v2 v2.3.1 github.com/coreos/go-oidc/v3 v3.1.0 github.com/cs3org/go-cs3apis v0.0.0-20220126114148-64c025ccdd19 - github.com/cs3org/reva/v2 v2.0.0-20220316045927-99115670eb33 + github.com/cs3org/reva/v2 v2.0.0-20220317153101-5a93e519610c github.com/disintegration/imaging v1.6.2 github.com/glauth/glauth/v2 v2.0.0-20211021011345-ef3151c28733 github.com/go-chi/chi/v5 v5.0.7 @@ -275,5 +275,3 @@ require ( // we need to use a fork to make the windows build pass replace github.com/pkg/xattr => github.com/micbar/xattr v0.4.6-0.20220215112335-88e74d648fb7 - -replace github.com/cs3org/reva/v2 => github.com/kobergj/reva/v2 v2.0.0-20220316142653-505576572261 diff --git a/go.sum b/go.sum index e65d10c05ad..f2cea32d57a 100644 --- a/go.sum +++ b/go.sum @@ -341,6 +341,8 @@ github.com/crewjam/saml v0.4.6/go.mod h1:ZBOXnNPFzB3CgOkRm7Nd6IVdkG+l/wF+0ZXLqD9 github.com/cs3org/cato v0.0.0-20200828125504-e418fc54dd5e/go.mod h1:XJEZ3/EQuI3BXTp/6DUzFr850vlxq11I6satRtz0YQ4= github.com/cs3org/go-cs3apis v0.0.0-20220126114148-64c025ccdd19 h1:1jqPH58jCxvbaJ9WLIJ7W2/m622bWS6ChptzljSG6IQ= github.com/cs3org/go-cs3apis v0.0.0-20220126114148-64c025ccdd19/go.mod h1:UXha4TguuB52H14EMoSsCqDj7k8a/t7g4gVP+bgY5LY= +github.com/cs3org/reva/v2 v2.0.0-20220317153101-5a93e519610c h1:tTAuVwgbDNPyeqNJPjMrT1xZ4jZYGSJ2AWqDkvSpXuA= +github.com/cs3org/reva/v2 v2.0.0-20220317153101-5a93e519610c/go.mod h1:XNtK1HEClNzmz5vyQa2DUw4KH3oqBjQoEsV1LhAGlV0= github.com/cubewise-code/go-mime v0.0.0-20200519001935-8c5762b177d8 h1:Z9lwXumT5ACSmJ7WGnFl+OMLLjpz5uR2fyz7dC255FI= github.com/cubewise-code/go-mime v0.0.0-20200519001935-8c5762b177d8/go.mod h1:4abs/jPXcmJzYoYGF91JF9Uq9s/KL5n1jvFDix8KcqY= github.com/cyberdelia/templates v0.0.0-20141128023046-ca7fffd4298c/go.mod h1:GyV+0YP4qX0UQ7r2MoYZ+AvYDp12OF5yg4q8rGnyNh4= @@ -906,8 +908,6 @@ github.com/klauspost/cpuid/v2 v2.0.4/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa02 github.com/klauspost/cpuid/v2 v2.0.9 h1:lgaqFMSdTdQYdZ04uHyN2d/eKdOMyi2YLSvlQIBFYa4= github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= github.com/kljensen/snowball v0.6.0/go.mod h1:27N7E8fVU5H68RlUmnWwZCfxgt4POBJfENGMvNRhldw= -github.com/kobergj/reva/v2 v2.0.0-20220316142653-505576572261 h1:cXHbAa17q5pcc3RUDWN0JtvQjAZJ9+xzoKherNkTf/8= -github.com/kobergj/reva/v2 v2.0.0-20220316142653-505576572261/go.mod h1:XNtK1HEClNzmz5vyQa2DUw4KH3oqBjQoEsV1LhAGlV0= github.com/kolo/xmlrpc v0.0.0-20200310150728-e0350524596b/go.mod h1:o03bZfuBwAXHetKXuInt4S7omeXUu62/A845kiycsSQ= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= From 2a3ff5413a5b0607fc40b979980de9a9988163ce Mon Sep 17 00:00:00 2001 From: jkoberg Date: Thu, 17 Mar 2022 17:00:15 +0100 Subject: [PATCH 8/9] improvements from manual testing Signed-off-by: jkoberg --- audit/pkg/service/service_test.go | 30 +++++++++++++++--------------- audit/pkg/types/constants.go | 4 ++-- audit/pkg/types/conversion.go | 10 ++++++---- 3 files changed, 23 insertions(+), 21 deletions(-) diff --git a/audit/pkg/service/service_test.go b/audit/pkg/service/service_test.go index d64615426a7..2c54d2fa5cd 100644 --- a/audit/pkg/service/service_test.go +++ b/audit/pkg/service/service_test.go @@ -305,9 +305,9 @@ var testCases = []struct { require.NoError(t, json.Unmarshal(b, &ev)) // AuditEvent fields - checkBaseAuditEvent(t, ev.AuditEvent, "uid-123", "", "File 'iid-123' was created", "file_create") + checkBaseAuditEvent(t, ev.AuditEvent, "uid-123", "", "File 'sto-123!iid-123!./item' was created", "file_create") // AuditEventSharing fields - checkFilesAuditEvent(t, ev.AuditEventFiles, "iid-123", "uid-123", "./item") + checkFilesAuditEvent(t, ev.AuditEventFiles, "sto-123!iid-123!./item", "uid-123", "./item") }, }, { Alias: "File read", @@ -320,9 +320,9 @@ var testCases = []struct { require.NoError(t, json.Unmarshal(b, &ev)) // AuditEvent fields - checkBaseAuditEvent(t, ev.AuditEvent, "uid-123", "", "File 'iid-123' was read", "file_read") + checkBaseAuditEvent(t, ev.AuditEvent, "uid-123", "", "File 'sto-123!iid-123!./item' was read", "file_read") // AuditEventSharing fields - checkFilesAuditEvent(t, ev.AuditEventFiles, "iid-123", "uid-123", "./item") + checkFilesAuditEvent(t, ev.AuditEventFiles, "sto-123!iid-123!./item", "uid-123", "./item") }, }, { Alias: "File trashed", @@ -335,9 +335,9 @@ var testCases = []struct { require.NoError(t, json.Unmarshal(b, &ev)) // AuditEvent fields - checkBaseAuditEvent(t, ev.AuditEvent, "uid-123", "", "File 'iid-123' was trashed", "file_delete") + checkBaseAuditEvent(t, ev.AuditEvent, "uid-123", "", "File 'sto-123!iid-123!./item' was trashed", "file_delete") // AuditEventSharing fields - checkFilesAuditEvent(t, ev.AuditEventFiles, "iid-123", "uid-123", "./item") + checkFilesAuditEvent(t, ev.AuditEventFiles, "sto-123!iid-123!./item", "uid-123", "./item") }, }, { Alias: "File renamed", @@ -351,9 +351,9 @@ var testCases = []struct { require.NoError(t, json.Unmarshal(b, &ev)) // AuditEvent fields - checkBaseAuditEvent(t, ev.AuditEvent, "uid-123", "", "File 'iid-123' was moved from './anotheritem' to './item'", "file_rename") + checkBaseAuditEvent(t, ev.AuditEvent, "uid-123", "", "File 'sto-123!iid-123!./item' was moved from './anotheritem' to './item'", "file_rename") // AuditEventSharing fields - checkFilesAuditEvent(t, ev.AuditEventFiles, "iid-123", "uid-123", "./item") + checkFilesAuditEvent(t, ev.AuditEventFiles, "sto-123!iid-123!./item", "uid-123", "./item") // AuditEventFileRenamed fields require.Equal(t, "./anotheritem", ev.OldPath) @@ -369,16 +369,16 @@ var testCases = []struct { require.NoError(t, json.Unmarshal(b, &ev)) // AuditEvent fields - checkBaseAuditEvent(t, ev.AuditEvent, "uid-123", "", "File 'iid-123' was removed from trashbin", "file_trash_delete") + checkBaseAuditEvent(t, ev.AuditEvent, "uid-123", "", "File 'sto-123!iid-123!./item' was removed from trashbin", "file_trash_delete") // AuditEventSharing fields - checkFilesAuditEvent(t, ev.AuditEventFiles, "iid-123", "uid-123", "./item") + checkFilesAuditEvent(t, ev.AuditEventFiles, "sto-123!iid-123!./item", "uid-123", "./item") }, }, { Alias: "File restored", SystemEvent: events.ItemRestored{ FileID: reference("sto-123", "iid-123", "./item"), Owner: userID("uid-123"), // NOTE: owner not yet implemented in reva - OldReference: reference("sto-123", "iid-123", "./oldpath"), + OldReference: reference("sto-123", "sto-123!iid-123!./item", "./oldpath"), Key: "", }, CheckAuditEvent: func(t *testing.T, b []byte) { @@ -386,9 +386,9 @@ var testCases = []struct { require.NoError(t, json.Unmarshal(b, &ev)) // AuditEvent fields - checkBaseAuditEvent(t, ev.AuditEvent, "uid-123", "", "File 'iid-123' was restored from trashbin to './item' (previous location: './oldpath')", "file_trash_restore") + checkBaseAuditEvent(t, ev.AuditEvent, "uid-123", "", "File 'sto-123!iid-123!./item' was restored from trashbin to './item'", "file_trash_restore") // AuditEventSharing fields - checkFilesAuditEvent(t, ev.AuditEventFiles, "iid-123", "uid-123", "./item") + checkFilesAuditEvent(t, ev.AuditEventFiles, "sto-123!iid-123!./item", "uid-123", "./item") // AuditEventFileRestored fields require.Equal(t, "./oldpath", ev.OldPath) @@ -405,9 +405,9 @@ var testCases = []struct { require.NoError(t, json.Unmarshal(b, &ev)) // AuditEvent fields - checkBaseAuditEvent(t, ev.AuditEvent, "uid-123", "", "File 'iid-123' was restored in version 'v1'", "file_version_restore") + checkBaseAuditEvent(t, ev.AuditEvent, "uid-123", "", "File 'sto-123!iid-123!./item' was restored in version 'v1'", "file_version_restore") // AuditEventSharing fields - checkFilesAuditEvent(t, ev.AuditEventFiles, "iid-123", "uid-123", "./item") + checkFilesAuditEvent(t, ev.AuditEventFiles, "sto-123!iid-123!./item", "uid-123", "./item") // AuditEventFileRestored fields require.Equal(t, "v1", ev.Key) diff --git a/audit/pkg/types/constants.go b/audit/pkg/types/constants.go index 39093880ee1..10b51a35c38 100644 --- a/audit/pkg/types/constants.go +++ b/audit/pkg/types/constants.go @@ -96,8 +96,8 @@ func MessageFilePurged(item string) string { } // MessageFileRestored returns the human readable string that describes the action -func MessageFileRestored(item, oldpath, path string) string { - return fmt.Sprintf("File '%s' was restored from trashbin to '%s' (previous location: '%s')", item, path, oldpath) +func MessageFileRestored(item, path string) string { + return fmt.Sprintf("File '%s' was restored from trashbin to '%s'", item, path) } // MessageFileVersionRestored returns the human readable string that describes the action diff --git a/audit/pkg/types/conversion.go b/audit/pkg/types/conversion.go index befc7f77475..14991fa68d2 100644 --- a/audit/pkg/types/conversion.go +++ b/audit/pkg/types/conversion.go @@ -292,7 +292,7 @@ func ItemRestored(ev events.ItemRestored) AuditEventFileRestored { oldpath = ev.OldReference.GetPath() } - base := BasicAuditEvent(uid, "", MessageFileRestored(iid, oldpath, path), ActionFileRestored) + base := BasicAuditEvent(uid, "", MessageFileRestored(iid, path), ActionFileRestored) return AuditEventFileRestored{ AuditEventFiles: FilesAuditEvent(base, iid, uid, path), OldPath: oldpath, @@ -321,17 +321,19 @@ func extractGrantee(uid *user.UserId, gid *group.GroupId) (string, string) { } func extractFileDetails(ref *provider.Reference, owner *user.UserId) (string, string, string) { - iid, path := "", "" + id, path := "", "" if ref != nil { - iid = ref.GetResourceId().GetOpaqueId() path = ref.GetPath() + if rid := ref.GetResourceId(); rid != nil { + id = rid.GetStorageId() + "!" + rid.GetOpaqueId() + "!" + path + } } uid := "" if owner != nil { uid = owner.GetOpaqueId() } - return iid, path, uid + return id, path, uid } func formatTime(t *types.Timestamp) string { From 23e3c6fca8017bdf6545911d907baf5819408021 Mon Sep 17 00:00:00 2001 From: jkoberg Date: Fri, 18 Mar 2022 10:28:08 +0100 Subject: [PATCH 9/9] use utils package to generate itemID Signed-off-by: jkoberg --- audit/pkg/service/service_test.go | 30 +++++++++++++++--------------- audit/pkg/types/conversion.go | 5 ++--- 2 files changed, 17 insertions(+), 18 deletions(-) diff --git a/audit/pkg/service/service_test.go b/audit/pkg/service/service_test.go index 2c54d2fa5cd..0bd1d22966f 100644 --- a/audit/pkg/service/service_test.go +++ b/audit/pkg/service/service_test.go @@ -305,9 +305,9 @@ var testCases = []struct { require.NoError(t, json.Unmarshal(b, &ev)) // AuditEvent fields - checkBaseAuditEvent(t, ev.AuditEvent, "uid-123", "", "File 'sto-123!iid-123!./item' was created", "file_create") + checkBaseAuditEvent(t, ev.AuditEvent, "uid-123", "", "File 'sto-123!iid-123/item' was created", "file_create") // AuditEventSharing fields - checkFilesAuditEvent(t, ev.AuditEventFiles, "sto-123!iid-123!./item", "uid-123", "./item") + checkFilesAuditEvent(t, ev.AuditEventFiles, "sto-123!iid-123/item", "uid-123", "./item") }, }, { Alias: "File read", @@ -320,9 +320,9 @@ var testCases = []struct { require.NoError(t, json.Unmarshal(b, &ev)) // AuditEvent fields - checkBaseAuditEvent(t, ev.AuditEvent, "uid-123", "", "File 'sto-123!iid-123!./item' was read", "file_read") + checkBaseAuditEvent(t, ev.AuditEvent, "uid-123", "", "File 'sto-123!iid-123/item' was read", "file_read") // AuditEventSharing fields - checkFilesAuditEvent(t, ev.AuditEventFiles, "sto-123!iid-123!./item", "uid-123", "./item") + checkFilesAuditEvent(t, ev.AuditEventFiles, "sto-123!iid-123/item", "uid-123", "./item") }, }, { Alias: "File trashed", @@ -335,9 +335,9 @@ var testCases = []struct { require.NoError(t, json.Unmarshal(b, &ev)) // AuditEvent fields - checkBaseAuditEvent(t, ev.AuditEvent, "uid-123", "", "File 'sto-123!iid-123!./item' was trashed", "file_delete") + checkBaseAuditEvent(t, ev.AuditEvent, "uid-123", "", "File 'sto-123!iid-123/item' was trashed", "file_delete") // AuditEventSharing fields - checkFilesAuditEvent(t, ev.AuditEventFiles, "sto-123!iid-123!./item", "uid-123", "./item") + checkFilesAuditEvent(t, ev.AuditEventFiles, "sto-123!iid-123/item", "uid-123", "./item") }, }, { Alias: "File renamed", @@ -351,9 +351,9 @@ var testCases = []struct { require.NoError(t, json.Unmarshal(b, &ev)) // AuditEvent fields - checkBaseAuditEvent(t, ev.AuditEvent, "uid-123", "", "File 'sto-123!iid-123!./item' was moved from './anotheritem' to './item'", "file_rename") + checkBaseAuditEvent(t, ev.AuditEvent, "uid-123", "", "File 'sto-123!iid-123/item' was moved from './anotheritem' to './item'", "file_rename") // AuditEventSharing fields - checkFilesAuditEvent(t, ev.AuditEventFiles, "sto-123!iid-123!./item", "uid-123", "./item") + checkFilesAuditEvent(t, ev.AuditEventFiles, "sto-123!iid-123/item", "uid-123", "./item") // AuditEventFileRenamed fields require.Equal(t, "./anotheritem", ev.OldPath) @@ -369,16 +369,16 @@ var testCases = []struct { require.NoError(t, json.Unmarshal(b, &ev)) // AuditEvent fields - checkBaseAuditEvent(t, ev.AuditEvent, "uid-123", "", "File 'sto-123!iid-123!./item' was removed from trashbin", "file_trash_delete") + checkBaseAuditEvent(t, ev.AuditEvent, "uid-123", "", "File 'sto-123!iid-123/item' was removed from trashbin", "file_trash_delete") // AuditEventSharing fields - checkFilesAuditEvent(t, ev.AuditEventFiles, "sto-123!iid-123!./item", "uid-123", "./item") + checkFilesAuditEvent(t, ev.AuditEventFiles, "sto-123!iid-123/item", "uid-123", "./item") }, }, { Alias: "File restored", SystemEvent: events.ItemRestored{ FileID: reference("sto-123", "iid-123", "./item"), Owner: userID("uid-123"), // NOTE: owner not yet implemented in reva - OldReference: reference("sto-123", "sto-123!iid-123!./item", "./oldpath"), + OldReference: reference("sto-123", "sto-123!iid-123/item", "./oldpath"), Key: "", }, CheckAuditEvent: func(t *testing.T, b []byte) { @@ -386,9 +386,9 @@ var testCases = []struct { require.NoError(t, json.Unmarshal(b, &ev)) // AuditEvent fields - checkBaseAuditEvent(t, ev.AuditEvent, "uid-123", "", "File 'sto-123!iid-123!./item' was restored from trashbin to './item'", "file_trash_restore") + checkBaseAuditEvent(t, ev.AuditEvent, "uid-123", "", "File 'sto-123!iid-123/item' was restored from trashbin to './item'", "file_trash_restore") // AuditEventSharing fields - checkFilesAuditEvent(t, ev.AuditEventFiles, "sto-123!iid-123!./item", "uid-123", "./item") + checkFilesAuditEvent(t, ev.AuditEventFiles, "sto-123!iid-123/item", "uid-123", "./item") // AuditEventFileRestored fields require.Equal(t, "./oldpath", ev.OldPath) @@ -405,9 +405,9 @@ var testCases = []struct { require.NoError(t, json.Unmarshal(b, &ev)) // AuditEvent fields - checkBaseAuditEvent(t, ev.AuditEvent, "uid-123", "", "File 'sto-123!iid-123!./item' was restored in version 'v1'", "file_version_restore") + checkBaseAuditEvent(t, ev.AuditEvent, "uid-123", "", "File 'sto-123!iid-123/item' was restored in version 'v1'", "file_version_restore") // AuditEventSharing fields - checkFilesAuditEvent(t, ev.AuditEventFiles, "sto-123!iid-123!./item", "uid-123", "./item") + checkFilesAuditEvent(t, ev.AuditEventFiles, "sto-123!iid-123/item", "uid-123", "./item") // AuditEventFileRestored fields require.Equal(t, "v1", ev.Key) diff --git a/audit/pkg/types/conversion.go b/audit/pkg/types/conversion.go index 14991fa68d2..29dde252511 100644 --- a/audit/pkg/types/conversion.go +++ b/audit/pkg/types/conversion.go @@ -5,6 +5,7 @@ import ( "time" "github.com/cs3org/reva/v2/pkg/events" + "github.com/cs3org/reva/v2/pkg/utils" group "github.com/cs3org/go-cs3apis/cs3/identity/group/v1beta1" user "github.com/cs3org/go-cs3apis/cs3/identity/user/v1beta1" @@ -324,9 +325,7 @@ func extractFileDetails(ref *provider.Reference, owner *user.UserId) (string, st id, path := "", "" if ref != nil { path = ref.GetPath() - if rid := ref.GetResourceId(); rid != nil { - id = rid.GetStorageId() + "!" + rid.GetOpaqueId() + "!" + path - } + id, _ = utils.FormatStorageSpaceReference(ref) } uid := ""