Skip to content

Commit 23fbe72

Browse files
authored
feat: make MODE Z configurable, disabled by default (#604)
1 parent d7a1353 commit 23fbe72

File tree

5 files changed

+20
-9
lines changed

5 files changed

+20
-9
lines changed

driver.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -323,7 +323,7 @@ type Settings struct {
323323
DisableSTAT bool // Disable Server STATUS, STAT on files and directories will still work
324324
DisableSYST bool // Disable SYST
325325
EnableCOMB bool // Enable COMB support
326-
DeflateCompressionLevel int // Deflate compression level (1-9)
326+
DeflateCompressionLevel int // Deflate compression level (0-9). 0 means disabled
327327
DefaultTransferType TransferType // Transfer type to use if the client don't send the TYPE command
328328
// ActiveConnectionsCheck defines the security requirements for active connections
329329
ActiveConnectionsCheck DataConnectionRequirement

handle_misc.go

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -222,11 +222,14 @@ func (c *clientHandler) handleFEAT(_ string) error {
222222
"SIZE",
223223
"MDTM",
224224
"REST STREAM",
225-
"MODE Z",
226225
"EPRT",
227226
"EPSV",
228227
}
229228

229+
if c.server.settings.DeflateCompressionLevel > 0 {
230+
features = append(features, "MODE Z")
231+
}
232+
230233
if !c.server.settings.DisableMLSD {
231234
features = append(features, "MLSD")
232235
}
@@ -301,8 +304,12 @@ func (c *clientHandler) handleMODE(param string) error {
301304
c.transferMode = TransferModeStream
302305
c.writeMessage(StatusOK, "Using stream mode")
303306
case "Z":
304-
c.transferMode = TransferModeDeflate
305-
c.writeMessage(StatusOK, "Using deflate mode")
307+
if c.server.settings.DeflateCompressionLevel > 0 {
308+
c.transferMode = TransferModeDeflate
309+
c.writeMessage(StatusOK, "Using deflate mode")
310+
} else {
311+
c.writeMessage(StatusNotImplementedParam, "Unimplemented MODE type")
312+
}
306313
default:
307314
c.writeMessage(StatusNotImplementedParam, "Unsupported mode")
308315
}

handle_misc_test.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -438,6 +438,10 @@ func TestMode(t *testing.T) {
438438
require.NoError(t, err)
439439
require.Equal(t, StatusOK, returnCode)
440440

441+
returnCode, _, err = raw.SendCommand("MODE Z") // Disabled by default
442+
require.NoError(t, err)
443+
require.Equal(t, StatusNotImplementedParam, returnCode)
444+
441445
returnCode, _, err = raw.SendCommand("MODE X")
442446
require.NoError(t, err)
443447
require.Equal(t, StatusNotImplementedParam, returnCode)

server.go

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -164,10 +164,6 @@ func (server *FtpServer) loadSettings() error {
164164
settings.Banner = "ftpserver - golang FTP server"
165165
}
166166

167-
if settings.DeflateCompressionLevel == 0 {
168-
settings.DeflateCompressionLevel = 5
169-
}
170-
171167
server.settings = settings
172168

173169
return nil

transfer_test.go

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1413,7 +1413,11 @@ func getPortFromEPSVResponse(t *testing.T, resp string) int {
14131413
}
14141414

14151415
func TestTransferModeDeflate(t *testing.T) {
1416-
driver := &TestServerDriver{Debug: true}
1416+
settings := &Settings{
1417+
DeflateCompressionLevel: 5,
1418+
DefaultTransferType: TransferTypeBinary,
1419+
}
1420+
driver := &TestServerDriver{Debug: true, Settings: settings}
14171421
server := NewTestServerWithTestDriver(t, driver)
14181422

14191423
conf := goftp.Config{User: authUser, Password: authPass}

0 commit comments

Comments
 (0)