Skip to content

Commit

Permalink
fix(webdav): make sure Mtime after Ctime (#6372 close #6371)
Browse files Browse the repository at this point in the history
* fix(server/webdav) make sure Mtime >= Ctime

* fix(server/webdav) avoid variable 'stream' collides with imported package name
  • Loading branch information
potoo0 committed Apr 24, 2024
1 parent 32ddab9 commit 479fc6d
Show file tree
Hide file tree
Showing 2 changed files with 14 additions and 9 deletions.
13 changes: 9 additions & 4 deletions server/webdav/util.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,16 +8,21 @@ import (
)

func (h *Handler) getModTime(r *http.Request) time.Time {
return h.getHeaderTime(r, "X-OC-Mtime")
return h.getHeaderTime(r, "X-OC-Mtime", "")
}

// owncloud/ nextcloud haven't impl this, but we can add the support since rclone may support this soon
// owncloud/ nextcloud haven't impl this, but we can add the support since rclone may support this soon.
// try ModTime if CreateTime not found in header
func (h *Handler) getCreateTime(r *http.Request) time.Time {
return h.getHeaderTime(r, "X-OC-Ctime")
return h.getHeaderTime(r, "X-OC-Ctime", "X-OC-Mtime")
}

func (h *Handler) getHeaderTime(r *http.Request, header string) time.Time {
func (h *Handler) getHeaderTime(r *http.Request, header, alternative string) time.Time {
hVal := r.Header.Get(header)
// try alternative
if hVal == "" && alternative != "" {
hVal = r.Header.Get(alternative)
}
if hVal != "" {
modTimeUnix, err := strconv.ParseInt(hVal, 10, 64)
if err == nil {
Expand Down
10 changes: 5 additions & 5 deletions server/webdav/webdav.go
Original file line number Diff line number Diff line change
Expand Up @@ -331,21 +331,21 @@ func (h *Handler) handlePut(w http.ResponseWriter, r *http.Request) (status int,
Modified: h.getModTime(r),
Ctime: h.getCreateTime(r),
}
stream := &stream.FileStream{
fsStream := &stream.FileStream{
Obj: &obj,
Reader: r.Body,
Mimetype: r.Header.Get("Content-Type"),
}
if stream.Mimetype == "" {
stream.Mimetype = utils.GetMimeType(reqPath)
if fsStream.Mimetype == "" {
fsStream.Mimetype = utils.GetMimeType(reqPath)
}
err = fs.PutDirectly(ctx, path.Dir(reqPath), stream)
err = fs.PutDirectly(ctx, path.Dir(reqPath), fsStream)
if errs.IsNotFoundError(err) {
return http.StatusNotFound, err
}

_ = r.Body.Close()
_ = stream.Close()
_ = fsStream.Close()
// TODO(rost): Returning 405 Method Not Allowed might not be appropriate.
if err != nil {
return http.StatusMethodNotAllowed, err
Expand Down

0 comments on commit 479fc6d

Please sign in to comment.