From 6844ee0648712c9b2f9d868b977da6b5b3bb0f1d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B6rn=20Friedrich=20Dreyer?= Date: Mon, 18 Jan 2021 14:03:28 +0000 Subject: [PATCH] use xml marshaling to render error MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Jörn Friedrich Dreyer --- .../http/services/owncloud/ocdav/error.go | 19 ++++++++++++++++++- .../http/services/owncloud/ocdav/propfind.go | 13 ------------- internal/http/services/owncloud/ocdav/put.go | 16 ++++++++++------ 3 files changed, 28 insertions(+), 20 deletions(-) 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") }