diff --git a/internal/http/services/owncloud/ocdav/error.go b/internal/http/services/owncloud/ocdav/error.go index 745918d4663..e20fbc3aff1 100644 --- a/internal/http/services/owncloud/ocdav/error.go +++ b/internal/http/services/owncloud/ocdav/error.go @@ -23,18 +23,23 @@ import ( "net/http" rpc "github.com/cs3org/go-cs3apis/cs3/rpc/v1beta1" + "github.com/pkg/errors" "github.com/rs/zerolog" ) type code int const ( + + // SabredavMethodBadRequest maps to HTTP 400 + SabredavMethodBadRequest code = iota // SabredavMethodNotAllowed maps to HTTP 405 - SabredavMethodNotAllowed code = iota + SabredavMethodNotAllowed ) var ( codesEnum = []string{ + "Sabre\\DAV\\Exception\\BadRequest", "Sabre\\DAV\\Exception\\MethodNotAllowed", } ) @@ -54,6 +59,18 @@ func Marshal(e exception) ([]byte, error) { }) } +// http://www.webdav.org/specs/rfc4918.html#ELEMENT_error +type errorXML struct { + XMLName xml.Name `xml:"d:error"` + Xmlnsd string `xml:"xmlns:d,attr"` + Xmlnss string `xml:"xmlns:s,attr"` + Exception string `xml:"s:exception"` + Message string `xml:"s:message"` + InnerXML []byte `xml:",innerxml"` +} + +var errInvalidPropfind = errors.New("webdav: invalid propfind") + // HandleErrorStatus checks the status code, logs a Debug or Error level message // and writes an appropriate http status func HandleErrorStatus(log *zerolog.Logger, w http.ResponseWriter, s *rpc.Status) { diff --git a/internal/http/services/owncloud/ocdav/propfind.go b/internal/http/services/owncloud/ocdav/propfind.go index c7c073c3247..01c79abc521 100644 --- a/internal/http/services/owncloud/ocdav/propfind.go +++ b/internal/http/services/owncloud/ocdav/propfind.go @@ -43,7 +43,6 @@ import ( "github.com/cs3org/reva/pkg/appctx" ctxuser "github.com/cs3org/reva/pkg/user" "github.com/cs3org/reva/pkg/utils" - "github.com/pkg/errors" ) const ( @@ -818,15 +817,3 @@ type propertyXML struct { // even including the DAV: namespace. InnerXML []byte `xml:",innerxml"` } - -// http://www.webdav.org/specs/rfc4918.html#ELEMENT_error -type errorXML struct { - XMLName xml.Name `xml:"d:error"` - Xmlnsd string `xml:"xmlns:d,attr"` - Xmlnss string `xml:"xmlns:s,attr"` - Exception string `xml:"s:exception"` - Message string `xml:"s:message"` - InnerXML []byte `xml:",innerxml"` -} - -var errInvalidPropfind = errors.New("webdav: invalid propfind") diff --git a/internal/http/services/owncloud/ocdav/put.go b/internal/http/services/owncloud/ocdav/put.go index 5f87323ed32..71a8c1b7b31 100644 --- a/internal/http/services/owncloud/ocdav/put.go +++ b/internal/http/services/owncloud/ocdav/put.go @@ -283,12 +283,16 @@ func (s *svc) handlePutHelper(w http.ResponseWriter, r *http.Request, content io } if httpRes.StatusCode == errtypes.StatusChecksumMismatch { w.WriteHeader(http.StatusBadRequest) - xml := ` - - Sabre\DAV\Exception\BadRequest - The computed checksum does not match the one received from the client. -` - _, err := w.Write([]byte(xml)) + b, err := Marshal(exception{ + code: SabredavMethodBadRequest, + message: "The computed checksum does not match the one received from the client.", + }) + if err != nil { + sublog.Error().Msgf("error marshaling xml response: %s", b) + w.WriteHeader(http.StatusInternalServerError) + return + } + _, err = w.Write(b) if err != nil { sublog.Err(err).Msg("error writing response") }