mirror of
https://github.com/drakkan/sftpgo.git
synced 2025-12-06 14:20:55 +03:00
try harder to convert transfer errors in well-known error types
Signed-off-by: Nicola Murino <nicola.murino@gmail.com>
This commit is contained in:
@@ -1675,7 +1675,8 @@ func (c *BaseConnection) GetGenericError(err error) error {
|
|||||||
return sftp.ErrSSHFxFailure
|
return sftp.ErrSSHFxFailure
|
||||||
default:
|
default:
|
||||||
if err == ErrPermissionDenied || err == ErrNotExist || err == ErrOpUnsupported ||
|
if err == ErrPermissionDenied || err == ErrNotExist || err == ErrOpUnsupported ||
|
||||||
err == ErrQuotaExceeded || err == vfs.ErrStorageSizeUnavailable || err == ErrShuttingDown {
|
err == ErrQuotaExceeded || err == ErrReadQuotaExceeded || err == vfs.ErrStorageSizeUnavailable ||
|
||||||
|
err == ErrShuttingDown {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
c.Log(logger.LevelError, "generic error: %+v", err)
|
c.Log(logger.LevelError, "generic error: %+v", err)
|
||||||
|
|||||||
@@ -211,6 +211,18 @@ func (t *BaseTransfer) SetCancelFn(cancelFn func()) {
|
|||||||
t.cancelFn = cancelFn
|
t.cancelFn = cancelFn
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ConvertError accepts an error that occurs during a read or write and
|
||||||
|
// converts it into a more understandable form for the client if it is a
|
||||||
|
// well-known type of error
|
||||||
|
func (t *BaseTransfer) ConvertError(err error) error {
|
||||||
|
if t.Fs.IsNotExist(err) {
|
||||||
|
return t.Connection.GetNotExistError()
|
||||||
|
} else if t.Fs.IsPermission(err) {
|
||||||
|
return t.Connection.GetPermissionDeniedError()
|
||||||
|
}
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
// CheckRead returns an error if read if not allowed
|
// CheckRead returns an error if read if not allowed
|
||||||
func (t *BaseTransfer) CheckRead() error {
|
func (t *BaseTransfer) CheckRead() error {
|
||||||
if t.transferQuota.AllowedDLSize == 0 && t.transferQuota.AllowedTotalSize == 0 {
|
if t.transferQuota.AllowedDLSize == 0 && t.transferQuota.AllowedTotalSize == 0 {
|
||||||
|
|||||||
@@ -21,6 +21,7 @@ import (
|
|||||||
"testing"
|
"testing"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
|
"github.com/pkg/sftp"
|
||||||
"github.com/sftpgo/sdk"
|
"github.com/sftpgo/sdk"
|
||||||
"github.com/stretchr/testify/assert"
|
"github.com/stretchr/testify/assert"
|
||||||
"github.com/stretchr/testify/require"
|
"github.com/stretchr/testify/require"
|
||||||
@@ -225,6 +226,10 @@ func TestTransferErrors(t *testing.T) {
|
|||||||
conn := NewBaseConnection("id", ProtocolSFTP, "", "", u)
|
conn := NewBaseConnection("id", ProtocolSFTP, "", "", u)
|
||||||
transfer := NewBaseTransfer(file, conn, nil, testFile, testFile, "/transfer_test_file", TransferUpload,
|
transfer := NewBaseTransfer(file, conn, nil, testFile, testFile, "/transfer_test_file", TransferUpload,
|
||||||
0, 0, 0, 0, true, fs, dataprovider.TransferQuota{})
|
0, 0, 0, 0, true, fs, dataprovider.TransferQuota{})
|
||||||
|
err = transfer.ConvertError(os.ErrNotExist)
|
||||||
|
assert.ErrorIs(t, err, sftp.ErrSSHFxNoSuchFile)
|
||||||
|
err = transfer.ConvertError(os.ErrPermission)
|
||||||
|
assert.ErrorIs(t, err, sftp.ErrSSHFxPermissionDenied)
|
||||||
assert.Nil(t, transfer.cancelFn)
|
assert.Nil(t, transfer.cancelFn)
|
||||||
assert.Equal(t, testFile, transfer.GetFsPath())
|
assert.Equal(t, testFile, transfer.GetFsPath())
|
||||||
transfer.SetCancelFn(cancelFn)
|
transfer.SetCancelFn(cancelFn)
|
||||||
|
|||||||
@@ -67,6 +67,7 @@ func (t *transfer) Read(p []byte) (n int, err error) {
|
|||||||
}
|
}
|
||||||
if err != nil && err != io.EOF {
|
if err != nil && err != io.EOF {
|
||||||
t.TransferError(err)
|
t.TransferError(err)
|
||||||
|
err = t.ConvertError(err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
t.HandleThrottle()
|
t.HandleThrottle()
|
||||||
@@ -85,6 +86,7 @@ func (t *transfer) Write(p []byte) (n int, err error) {
|
|||||||
}
|
}
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.TransferError(err)
|
t.TransferError(err)
|
||||||
|
err = t.ConvertError(err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
t.HandleThrottle()
|
t.HandleThrottle()
|
||||||
|
|||||||
@@ -67,6 +67,7 @@ func (f *httpdFile) Read(p []byte) (n int, err error) {
|
|||||||
}
|
}
|
||||||
if err != nil && err != io.EOF {
|
if err != nil && err != io.EOF {
|
||||||
f.TransferError(err)
|
f.TransferError(err)
|
||||||
|
err = f.ConvertError(err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
f.HandleThrottle()
|
f.HandleThrottle()
|
||||||
@@ -91,6 +92,7 @@ func (f *httpdFile) Write(p []byte) (n int, err error) {
|
|||||||
}
|
}
|
||||||
if err != nil {
|
if err != nil {
|
||||||
f.TransferError(err)
|
f.TransferError(err)
|
||||||
|
err = f.ConvertError(err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
f.HandleThrottle()
|
f.HandleThrottle()
|
||||||
|
|||||||
@@ -115,6 +115,7 @@ func (t *transfer) ReadAt(p []byte, off int64) (n int, err error) {
|
|||||||
if t.GetType() == common.TransferDownload {
|
if t.GetType() == common.TransferDownload {
|
||||||
t.TransferError(err)
|
t.TransferError(err)
|
||||||
}
|
}
|
||||||
|
err = t.ConvertError(err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
t.HandleThrottle()
|
t.HandleThrottle()
|
||||||
@@ -139,6 +140,7 @@ func (t *transfer) WriteAt(p []byte, off int64) (n int, err error) {
|
|||||||
}
|
}
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.TransferError(err)
|
t.TransferError(err)
|
||||||
|
err = t.ConvertError(err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
t.HandleThrottle()
|
t.HandleThrottle()
|
||||||
|
|||||||
@@ -145,7 +145,7 @@ func (f *webDavFile) Stat() (os.FileInfo, error) {
|
|||||||
}
|
}
|
||||||
info, err := f.Fs.Stat(f.GetFsPath())
|
info, err := f.Fs.Stat(f.GetFsPath())
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, f.Connection.GetFsError(f.Fs, err)
|
||||||
}
|
}
|
||||||
if vfs.IsCryptOsFs(f.Fs) {
|
if vfs.IsCryptOsFs(f.Fs) {
|
||||||
info = f.Fs.(*vfs.CryptFs).ConvertFileInfo(info)
|
info = f.Fs.(*vfs.CryptFs).ConvertFileInfo(info)
|
||||||
@@ -216,7 +216,7 @@ func (f *webDavFile) Read(p []byte) (n int, err error) {
|
|||||||
f.startOffset = 0
|
f.startOffset = 0
|
||||||
f.Unlock()
|
f.Unlock()
|
||||||
if e != nil {
|
if e != nil {
|
||||||
return 0, e
|
return 0, f.Connection.GetFsError(f.Fs, e)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -227,6 +227,7 @@ func (f *webDavFile) Read(p []byte) (n int, err error) {
|
|||||||
}
|
}
|
||||||
if err != nil && err != io.EOF {
|
if err != nil && err != io.EOF {
|
||||||
f.TransferError(err)
|
f.TransferError(err)
|
||||||
|
err = f.ConvertError(err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
f.HandleThrottle()
|
f.HandleThrottle()
|
||||||
@@ -249,6 +250,7 @@ func (f *webDavFile) Write(p []byte) (n int, err error) {
|
|||||||
}
|
}
|
||||||
if err != nil {
|
if err != nil {
|
||||||
f.TransferError(err)
|
f.TransferError(err)
|
||||||
|
err = f.ConvertError(err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
f.HandleThrottle()
|
f.HandleThrottle()
|
||||||
|
|||||||
Reference in New Issue
Block a user