Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion handle_files.go
Original file line number Diff line number Diff line change
Expand Up @@ -521,7 +521,7 @@ func (c *clientHandler) handleALLO(param string) error {

func (c *clientHandler) handleREST(param string) error {
if size, err := strconv.ParseInt(param, 10, 0); err == nil {
if c.currentTransferType == TransferTypeASCII {
if c.currentTransferType == TransferTypeASCII && !c.server.settings.DisableASCIIConversion {
c.writeMessage(StatusSyntaxErrorParameters, "Resuming transfers not allowed in ASCII mode")

return nil
Expand Down
37 changes: 37 additions & 0 deletions handle_files_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -856,6 +856,43 @@ func TestREST(t *testing.T) {
require.True(t, strings.HasPrefix(response, "Couldn't parse size"))
}

func TestRESTInASCIIWithConversionDisabled(t *testing.T) {
driver := &TestServerDriver{
Settings: &Settings{DisableASCIIConversion: true},
}
server := NewTestServerWithTestDriver(t, driver)
conf := goftp.Config{
User: authUser,
Password: authPass,
}

client, err := goftp.DialConfig(conf, server.Addr())
require.NoError(t, err, "Couldn't connect")

defer func() { panicOnError(client.Close()) }()

raw, err := client.OpenRawConn()
require.NoError(t, err, "Couldn't open raw connection")

defer func() { require.NoError(t, raw.Close()) }()

// With DisableASCIIConversion transfers are byte-for-byte even in ASCII
// mode, so REST must be accepted.
returnCode, response, err := raw.SendCommand("TYPE A")
require.NoError(t, err)
require.Equal(t, StatusOK, returnCode, response)

returnCode, response, err = raw.SendCommand("REST 10")
require.NoError(t, err)
require.Equal(t, StatusFileActionPending, returnCode, response)

// Invalid argument is still rejected regardless of conversion setting.
returnCode, response, err = raw.SendCommand("REST a")
require.NoError(t, err)
require.Equal(t, StatusActionNotTaken, returnCode, response)
require.True(t, strings.HasPrefix(response, "Couldn't parse size"))
}

func TestSIZE(t *testing.T) {
server := NewTestServer(t, false)
conf := goftp.Config{
Expand Down