diff --git a/audit/log.go b/audit/log.go new file mode 100644 index 00000000..816eca1b --- /dev/null +++ b/audit/log.go @@ -0,0 +1,26 @@ +package audit + +import "fmt" + +// LogResourceActivity prints an entry to the audit log with information about the given event, file and user. +// +// The event should be describing the activity that was performed, e.g. Deletion. +// This results in a log entry like "Deletion of file with path /srv/test.txt by user test (42)". +func LogResourceActivity(info ResourceActivity) { + message := createLogMessage(info) + logToAuditLogger(message) +} + +func createLogMessage(info ResourceActivity) string { + return fmt.Sprintf( + "%v of resource with path %v by user %v (%v)", + info.Event, + info.ResourcePath, + info.User.Username, + info.User.ID, + ) +} + +func logToAuditLogger(message string) { + auditLogger.Println(message) +} diff --git a/audit/log_test.go b/audit/log_test.go new file mode 100644 index 00000000..6a1cf187 --- /dev/null +++ b/audit/log_test.go @@ -0,0 +1,59 @@ +package audit + +import ( + "bytes" + "github.com/filebrowser/filebrowser/v2/users" + "log" + "testing" +) + +func TestLogFileActivity(t *testing.T) { + resultBuffer := setupTestLogger() + + info := ResourceActivity{ + Event: "Deletion", + ResourcePath: "/srv/test.txt", + User: &users.User{ + Username: "test", + ID: 42, + }, + } + + LogResourceActivity(info) + + result := resultBuffer.String() + expectedResult := "Deletion of resource with path /srv/test.txt by user test (42)\n" + if result != expectedResult { + t.Errorf("Log entry should be \"%v\" but is \"%v\"", expectedResult, result) + } +} + +func TestLogFileActivityDirectory(t *testing.T) { + resultBuffer := setupTestLogger() + + info := ResourceActivity{ + Event: "Creation", + ResourcePath: "/srv/test.txt", + User: &users.User{ + Username: "test", + ID: 42, + }, + } + + LogResourceActivity(info) + + result := resultBuffer.String() + expectedResult := "Creation of resource with path /srv/test.txt by user test (42)\n" + if result != expectedResult { + t.Errorf("Log entry should be \"%v\" but is \"%v\"", expectedResult, result) + } +} + +func setupTestLogger() *bytes.Buffer { + var testBuffer bytes.Buffer + testLogger := log.New(&testBuffer, "", 0) + + auditLogger = testLogger + + return &testBuffer +} diff --git a/audit/types.go b/audit/types.go new file mode 100644 index 00000000..f5f400a3 --- /dev/null +++ b/audit/types.go @@ -0,0 +1,11 @@ +package audit + +import ( + "github.com/filebrowser/filebrowser/v2/users" +) + +type ResourceActivity struct { + Event string + ResourcePath string + User *users.User +}