@@ -279,13 +279,19 @@ func (s *Server) sessionHandler(session ssh.Session) {
279
279
extraEnv = append (extraEnv , fmt .Sprintf ("DISPLAY=:%d.0" , x11 .ScreenNumber ))
280
280
}
281
281
282
+ s .logger .Warn (ctx , "fileTransferBlocked" , slog .F ("session" , session ))
282
283
if s .fileTransferBlocked (session ) {
283
- // Response format: <status_code><message body>\n
284
- errorMessage := fmt .Sprintf ("\x02 %s\n " , BlockedFileTransferErrorMessage )
285
- _ , _ = session .Write ([]byte (errorMessage ))
284
+ s .logger .Warn (ctx , "fileTransferBlocked" , slog .F ("go " , "yes" ))
285
+
286
+ if session .Subsystem () == "" { // sftp does not expect error, otherwise it fails with "package too long"
287
+ // Response format: <status_code><message body>\n
288
+ errorMessage := fmt .Sprintf ("\x02 %s\n " , BlockedFileTransferErrorMessage )
289
+ _ , _ = session .Write ([]byte (errorMessage ))
290
+ }
286
291
_ = session .Exit (BlockedFileTransferErrorCode )
287
292
return
288
293
}
294
+ s .logger .Warn (ctx , "fileTransferBlocked end" )
289
295
290
296
switch ss := session .Subsystem (); ss {
291
297
case "" :
@@ -338,8 +344,6 @@ func (s *Server) sessionHandler(session ssh.Session) {
338
344
}
339
345
340
346
// fileTransferBlocked method checks if the file transfer commands should be blocked.
341
- // It does not block SFTP sessions, VS Code may still use this protocol.
342
- //
343
347
// Warning: consider this mechanism as "Do not trespass" sign. If a user needs a more sophisticated
344
348
// and battle-proof solution, consider the full endpoint security.
345
349
func (s * Server ) fileTransferBlocked (session ssh.Session ) bool {
@@ -348,6 +352,10 @@ func (s *Server) fileTransferBlocked(session ssh.Session) bool {
348
352
}
349
353
// File transfers are restricted.
350
354
355
+ if session .Subsystem () == "sftp" {
356
+ return true
357
+ }
358
+
351
359
cmd := session .Command ()
352
360
if len (cmd ) == 0 {
353
361
return false // no command?
0 commit comments