diff options
| author | Jeff Halter <868228+jhalter@users.noreply.github.com> | 2022-06-06 16:45:27 -0700 |
|---|---|---|
| committer | Jeff Halter <868228+jhalter@users.noreply.github.com> | 2022-06-06 16:45:27 -0700 |
| commit | 5c14e4c916d76ce35ee2b07bf832d5f3b6118260 (patch) | |
| tree | 813c03c5142cea0f0ada6f2a81bcca524db6f28a /hotline | |
| parent | e42888eb1a6c2bfb6c8bd73baba6acdfddb1f72e (diff) | |
Fix overwrite of file during upload
Diffstat (limited to 'hotline')
| -rw-r--r-- | hotline/files.go | 2 | ||||
| -rw-r--r-- | hotline/server.go | 22 |
2 files changed, 20 insertions, 4 deletions
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 } |