From: Jeff Halter Date: Mon, 6 Jun 2022 23:45:27 +0000 (-0700) Subject: Fix overwrite of file during upload X-Git-Url: https://git.r.bdr.sh/rbdr/mobius/commitdiff_plain/5c14e4c916d76ce35ee2b07bf832d5f3b6118260?ds=sidebyside Fix overwrite of file during upload --- diff --git a/hotline/files.go b/hotline/files.go index 04334e9..42e25db 100644 --- a/hotline/files.go +++ b/hotline/files.go @@ -180,7 +180,7 @@ func effectiveFile(filePath string) (*os.File, error) { } if errors.Is(err, fs.ErrNotExist) { - file, err = os.OpenFile(filePath+incompleteFileSuffix, os.O_APPEND|os.O_WRONLY, 0644) + file, err = os.OpenFile(filePath+incompleteFileSuffix, os.O_CREATE|os.O_APPEND|os.O_WRONLY, 0644) if err != nil { return nil, err } diff --git a/hotline/server.go b/hotline/server.go index cfac442..f164df1 100644 --- a/hotline/server.go +++ b/hotline/server.go @@ -742,11 +742,27 @@ func (s *Server) handleFileTransfer(conn io.ReadWriteCloser) error { } case FileUpload: destinationFile := s.Config.FileRoot + ReadFilePath(fileTransfer.FilePath) + "/" + string(fileTransfer.FileName) - tmpFile := destinationFile + ".incomplete" - file, err := effectiveFile(destinationFile) + var file *os.File + + // A file upload has three possible cases: + // 1) Upload a new file + // 2) Resume a partially transferred file + // 3) Replace a fully uploaded file + // Unfortunately we have to infer which case applies by inspecting what is already on the file system + + // 1) Check for existing file: + _, err := os.Stat(destinationFile) + if err == nil { + // If found, that means this upload is intended to replace the file + if err = os.Remove(destinationFile); err != nil { + return err + } + file, err = os.Create(destinationFile + incompleteFileSuffix) + } if errors.Is(err, fs.ErrNotExist) { - file, err = FS.Create(tmpFile) + // If not found, open or create a new incomplete file + file, err = os.OpenFile(destinationFile+incompleteFileSuffix, os.O_CREATE|os.O_APPEND|os.O_WRONLY, 0644) if err != nil { return err }