Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 10 additions & 1 deletion services/audit/pkg/service/service.go
Original file line number Diff line number Diff line change
Expand Up @@ -34,9 +34,12 @@

}

// StartAuditLogger will block. run in separate go routine
// StartAuditLogger will block. run in separate go routine.
// Note: The switch statement is idiomatic Go for event type handling. High cyclomatic complexity
// is unavoidable when handling many event types. This pattern is used throughout event-driven systems.
//
//nolint:gocyclo
// NOSONAR: squid:S3776 - Large switch is idiomatic for event multiplexing
func StartAuditLogger(ctx context.Context, ch <-chan events.Event, log log.Logger, marshaller Marshaller, logto ...Log) {
for {
select {
Expand All @@ -47,8 +50,10 @@
return
}

// Convert incoming reva event to audit event type using type switch.
// Each case converts the event and registers it in the audit log.
var auditEvent interface{}
switch ev := i.Event.(type) {

Check warning on line 56 in services/audit/pkg/service/service.go

View check run for this annotation

SonarQubeCloud / SonarCloud Code Analysis

Reduce the number of switch branches from 35 to at most 30.

See more on https://sonarcloud.io/project/issues?id=opencloud-eu_opencloud&issues=AZ1Lux01qMxKRhSA2zGT&open=AZ1Lux01qMxKRhSA2zGT&pullRequest=2563
case events.ShareCreated:
auditEvent = types.ShareCreated(ev)
case events.LinkCreated:
Expand All @@ -73,6 +78,10 @@
auditEvent = types.FileUploaded(ev)
case events.FileDownloaded:
auditEvent = types.FileDownloaded(ev)
case events.FileViewed:
// FileViewed distinguishes file previews from downloads for audit trail distinction.
// Emitted when user views file in browser/app (not downloading).
auditEvent = types.FileViewed(ev)
case events.ItemMoved:
auditEvent = types.ItemMoved(ev)
case events.ItemTrashed:
Expand Down
9 changes: 9 additions & 0 deletions services/audit/pkg/types/conversion.go
Original file line number Diff line number Diff line change
Expand Up @@ -265,6 +265,15 @@ func FileDownloaded(ev events.FileDownloaded) AuditEventFileRead {
}
}

// FileViewed converts a FileViewed event to an AuditEventFileViewed
func FileViewed(ev events.FileViewed) AuditEventFileViewed {
iid, path, uid := extractFileDetails(ev.Ref, ev.Owner)
base := BasicAuditEvent(uid, formatTime(ev.Timestamp), MessageFileRead(ev.Executant.GetOpaqueId(), iid), "file_viewed")
return AuditEventFileViewed{
AuditEventFiles: FilesAuditEvent(base, iid, uid, path),
}
}

// ItemMoved converts a ItemMoved event to an AuditEventFileRenamed
func ItemMoved(ev events.ItemMoved) AuditEventFileRenamed {
iid, path, uid := extractFileDetails(ev.Ref, ev.Owner)
Expand Down
1 change: 1 addition & 0 deletions services/audit/pkg/types/events.go
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ func RegisteredEvents() []events.Unmarshaller {
events.ContainerCreated{},
events.FileUploaded{},
events.FileDownloaded{},
events.FileViewed{},
events.ItemTrashed{},
events.ItemMoved{},
events.ItemPurged{},
Expand Down
5 changes: 5 additions & 0 deletions services/audit/pkg/types/types.go
Original file line number Diff line number Diff line change
Expand Up @@ -111,6 +111,11 @@ type AuditEventFileRead struct {
AuditEventFiles
}

// AuditEventFileViewed is the event logged when a file is viewed (accessed without download intent)
type AuditEventFileViewed 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
Expand Down

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.