Skip to content

Commit

Permalink
fix the error message for errors that occur during file transfers
Browse files Browse the repository at this point in the history
we should special case path errors and replace the fs path with the
virtual path.

Thanks to @nezzzumi for reporting this issue

Signed-off-by: Nicola Murino <nicola.murino@gmail.com>
  • Loading branch information
drakkan committed May 10, 2024
1 parent a6a92f0 commit a73c656
Show file tree
Hide file tree
Showing 4 changed files with 20 additions and 4 deletions.
8 changes: 5 additions & 3 deletions internal/common/connection.go
Expand Up @@ -18,6 +18,7 @@ import (
"errors"
"fmt"
"io"
"io/fs"
"os"
"path"
"strings"
Expand Down Expand Up @@ -1665,9 +1666,10 @@ func (c *BaseConnection) GetGenericError(err error) error {
return fmt.Errorf("%w: %v", sftp.ErrSSHFxFailure, err.Error())
}
if err != nil {
if e, ok := err.(*os.PathError); ok {
c.Log(logger.LevelError, "generic path error: %+v", e)
return fmt.Errorf("%w: %v %v", sftp.ErrSSHFxFailure, e.Op, e.Err.Error())
var pathError *fs.PathError
if errors.As(err, &pathError) {
c.Log(logger.LevelError, "generic path error: %+v", pathError)
return fmt.Errorf("%w: %v %v", sftp.ErrSSHFxFailure, pathError.Op, pathError.Err.Error())
}
c.Log(logger.LevelError, "generic error: %+v", err)
return fmt.Errorf("%w: %v", sftp.ErrSSHFxFailure, ErrGenericFailure.Error())
Expand Down
6 changes: 6 additions & 0 deletions internal/common/transfer.go
Expand Up @@ -16,6 +16,8 @@ package common

import (
"errors"
"fmt"
"io/fs"
"path"
"sync"
"sync/atomic"
Expand Down Expand Up @@ -220,6 +222,10 @@ func (t *BaseTransfer) ConvertError(err error) error {
} else if t.Fs.IsPermission(err) {
return t.Connection.GetPermissionDeniedError()
}
var pathError *fs.PathError
if errors.As(err, &pathError) {
return fmt.Errorf("%s %s: %s", pathError.Op, t.GetVirtualPath(), pathError.Err.Error())
}
return err
}

Expand Down
8 changes: 8 additions & 0 deletions internal/common/transfer_test.go
Expand Up @@ -16,6 +16,7 @@ package common

import (
"errors"
"fmt"
"os"
"path/filepath"
"testing"
Expand Down Expand Up @@ -226,6 +227,13 @@ func TestTransferErrors(t *testing.T) {
conn := NewBaseConnection("id", ProtocolSFTP, "", "", u)
transfer := NewBaseTransfer(file, conn, nil, testFile, testFile, "/transfer_test_file", TransferUpload,
0, 0, 0, 0, true, fs, dataprovider.TransferQuota{})
pathError := &os.PathError{
Op: "test",
Path: testFile,
Err: os.ErrInvalid,
}
err = transfer.ConvertError(pathError)
assert.EqualError(t, err, fmt.Sprintf("%s %s: %s", pathError.Op, "/transfer_test_file", pathError.Err.Error()))
err = transfer.ConvertError(os.ErrNotExist)
assert.ErrorIs(t, err, sftp.ErrSSHFxNoSuchFile)
err = transfer.ConvertError(os.ErrPermission)
Expand Down
2 changes: 1 addition & 1 deletion internal/sftpd/internal_test.go
Expand Up @@ -1722,7 +1722,7 @@ func TestSCPUploadFiledata(t *testing.T) {

transfer.Connection.AddTransfer(transfer)
err = scpCommand.getUploadFileData(2, transfer)
assert.True(t, errors.Is(err, os.ErrClosed))
assert.ErrorContains(t, err, os.ErrClosed.Error())

err = os.Remove(testfile)
assert.NoError(t, err)
Expand Down

0 comments on commit a73c656

Please sign in to comment.