diff --git a/internal/http/services/owncloud/ocdav/tus.go b/internal/http/services/owncloud/ocdav/tus.go index 91c07e7becd..ab45fd8caf7 100644 --- a/internal/http/services/owncloud/ocdav/tus.go +++ b/internal/http/services/owncloud/ocdav/tus.go @@ -37,6 +37,31 @@ import ( "go.opencensus.io/trace" ) +type nameRule interface { + Test(name string) bool +} + +type nameNotEmpty struct{} + +func (r nameNotEmpty) Test(name string) bool { + return len(strings.TrimSpace(name)) > 0 +} + +type nameDoesNotContain struct { + chars string +} + +func (r nameDoesNotContain) Test(name string) bool { + return !strings.ContainsAny(name, r.chars) +} + +var ( + nameRules = [...]nameRule{ + nameNotEmpty{}, + nameDoesNotContain{chars: "\f\r\n\\"}, + } +) + func (s *svc) handlePathTusPost(w http.ResponseWriter, r *http.Request, ns string) { ctx := r.Context() ctx, span := trace.StartSpan(ctx, "tus-post") @@ -44,9 +69,11 @@ func (s *svc) handlePathTusPost(w http.ResponseWriter, r *http.Request, ns strin // read filename from metadata meta := tusd.ParseMetadataHeader(r.Header.Get(HeaderUploadMetadata)) - if meta["filename"] == "" { - w.WriteHeader(http.StatusPreconditionFailed) - return + for _, r := range nameRules { + if !r.Test(meta["filename"]) { + w.WriteHeader(http.StatusPreconditionFailed) + return + } } // append filename to current dir