mirror of
https://github.com/drakkan/sftpgo.git
synced 2025-12-06 22:30:56 +03:00
remove rsync support
rsync was executed as an external command, which means we have no insight into or control over what it actually does. From a security perspective, this is far from ideal. To be clear, there's nothing inherently wrong with rsync itself. However, if we were to support it properly within SFTPGo, we would need to implement the low-level protocol internally rather than relying on launching an external process. This would ensure it works seamlessly with any storage backend, just as SFTP does, for example. We recommend using one of the many alternatives that rely on the SFTP protocol, such as rclone Signed-off-by: Nicola Murino <nicola.murino@gmail.com>
This commit is contained in:
@@ -19,7 +19,6 @@ import (
|
||||
"io"
|
||||
|
||||
"github.com/drakkan/sftpgo/v2/internal/common"
|
||||
"github.com/drakkan/sftpgo/v2/internal/metric"
|
||||
"github.com/drakkan/sftpgo/v2/internal/vfs"
|
||||
)
|
||||
|
||||
@@ -192,63 +191,3 @@ func (t *transfer) setFinished() error {
|
||||
t.isFinished = true
|
||||
return nil
|
||||
}
|
||||
|
||||
// used for ssh commands.
|
||||
// It reads from src until EOF so it does not treat an EOF from Read as an error to be reported.
|
||||
// EOF from Write is reported as error
|
||||
func (t *transfer) copyFromReaderToWriter(dst io.Writer, src io.Reader) (int64, error) {
|
||||
defer t.Connection.RemoveTransfer(t)
|
||||
|
||||
var written int64
|
||||
var err error
|
||||
|
||||
if t.MaxWriteSize < 0 {
|
||||
return 0, common.ErrQuotaExceeded
|
||||
}
|
||||
isDownload := t.GetType() == common.TransferDownload
|
||||
buf := make([]byte, 32768)
|
||||
for {
|
||||
t.Connection.UpdateLastActivity()
|
||||
nr, er := src.Read(buf)
|
||||
if nr > 0 {
|
||||
nw, ew := dst.Write(buf[0:nr])
|
||||
if nw > 0 {
|
||||
written += int64(nw)
|
||||
if isDownload {
|
||||
t.BytesSent.Store(written)
|
||||
if errCheck := t.CheckRead(); errCheck != nil {
|
||||
err = errCheck
|
||||
break
|
||||
}
|
||||
} else {
|
||||
t.BytesReceived.Store(written)
|
||||
if errCheck := t.CheckWrite(); errCheck != nil {
|
||||
err = errCheck
|
||||
break
|
||||
}
|
||||
}
|
||||
}
|
||||
if ew != nil {
|
||||
err = ew
|
||||
break
|
||||
}
|
||||
if nr != nw {
|
||||
err = io.ErrShortWrite
|
||||
break
|
||||
}
|
||||
}
|
||||
if er != nil {
|
||||
if er != io.EOF {
|
||||
err = er
|
||||
}
|
||||
break
|
||||
}
|
||||
t.HandleThrottle()
|
||||
}
|
||||
t.ErrTransfer = err
|
||||
if written > 0 || err != nil {
|
||||
metric.TransferCompleted(t.BytesSent.Load(), t.BytesReceived.Load(), t.GetType(),
|
||||
t.ErrTransfer, vfs.IsSFTPFs(t.Fs))
|
||||
}
|
||||
return written, err
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user