diff --git a/changelog/unreleased/upload-scandata.md b/changelog/unreleased/upload-scandata.md new file mode 100644 index 0000000000..d7da3a1262 --- /dev/null +++ b/changelog/unreleased/upload-scandata.md @@ -0,0 +1,6 @@ +Enhancement: Add ScanData to Uploadsession + +Adds virus scan results to the upload session. + +https://github.com/cs3org/reva/pull/4664 +https://github.com/cs3org/reva/pull/4657 diff --git a/pkg/storage/uploads.go b/pkg/storage/uploads.go index 87d26115bf..f6ef9ad2d7 100644 --- a/pkg/storage/uploads.go +++ b/pkg/storage/uploads.go @@ -76,6 +76,9 @@ type UploadSession interface { // Purge allows completely removing an upload. Should emit a PostprocessingFinished event with a Delete outcome Purge(ctx context.Context) error + + // ScanData returns the scan data for the UploadSession + ScanData() (string, time.Time) } // UploadSessionFilter can be used to filter upload sessions diff --git a/pkg/storage/utils/decomposedfs/decomposedfs.go b/pkg/storage/utils/decomposedfs/decomposedfs.go index 277baa8c39..dc8dd0f3d1 100644 --- a/pkg/storage/utils/decomposedfs/decomposedfs.go +++ b/pkg/storage/utils/decomposedfs/decomposedfs.go @@ -493,6 +493,12 @@ func (fs *Decomposedfs) Postprocessing(ch <-chan events.Event) { log.Error().Err(err).Interface("uploadID", ev.UploadID).Msg("Failed to get node after scan") continue } + sublog := log.With().Str("spaceid", session.SpaceID()).Str("nodeid", session.NodeID()).Logger() + + session.SetScanData(res.Description, res.Scandate) + if err := session.Persist(ctx); err != nil { + sublog.Error().Err(err).Msg("Failed to persist scan results") + } } if err := n.SetScanData(ctx, res.Description, res.Scandate); err != nil { diff --git a/pkg/storage/utils/decomposedfs/upload/session.go b/pkg/storage/utils/decomposedfs/upload/session.go index f438d684f9..279dfd7138 100644 --- a/pkg/storage/utils/decomposedfs/upload/session.go +++ b/pkg/storage/utils/decomposedfs/upload/session.go @@ -297,7 +297,8 @@ func (s *OcisSession) MTime() time.Time { // IsProcessing returns true if all bytes have been received. The session then has entered postprocessing state. func (s *OcisSession) IsProcessing() bool { - return s.info.Size == s.info.Offset + // We might need a more sophisticated way to determine processing status soon + return s.info.Size == s.info.Offset && s.info.MetaData["scanResult"] == "" } // binPath returns the path to the file storing the binary data. @@ -305,6 +306,27 @@ func (s *OcisSession) binPath() string { return filepath.Join(s.store.root, "uploads", s.info.ID) } +// InitiatorID returns the id of the initiating client +func (s *OcisSession) InitiatorID() string { + return s.info.MetaData["initiatorid"] +} + +// SetScanData sets virus scan data to the upload session +func (s *OcisSession) SetScanData(result string, date time.Time) { + s.info.MetaData["scanResult"] = result + s.info.MetaData["scanDate"] = date.Format(time.RFC3339) +} + +// ScanData returns the virus scan data +func (s *OcisSession) ScanData() (string, time.Time) { + date := s.info.MetaData["scanDate"] + if date == "" { + return "", time.Time{} + } + d, _ := time.Parse(time.RFC3339, date) + return s.info.MetaData["scanResult"], d +} + // sessionPath returns the path to the .info file storing the file's info. func sessionPath(root, id string) string { return filepath.Join(root, "uploads", id+".info")