4040 "ENC" : commandEnc {},
4141 "EPRT" : commandEprt {},
4242 "EPSV" : commandEpsv {},
43- // "FEAT": commandFeat{},
43+ "FEAT" : commandFeat {},
4444 "LIST" : commandList {},
4545 "NLST" : commandNlst {},
4646 "MDTM" : commandMdtm {},
@@ -175,6 +175,9 @@ func init() {
175175}
176176
177177func (cmd commandFeat ) Execute (conn * Conn , param string ) {
178+ if conn .tlsConfig != nil {
179+ featCmds += " AUTH TLS\n PBSZ\n PROT\n "
180+ }
178181 conn .writeMessage (211 , fmt .Sprintf (feats , featCmds ))
179182}
180183
@@ -314,7 +317,7 @@ func (cmd commandEpsv) Execute(conn *Conn, param string) {
314317 return
315318 }
316319
317- socket , err := newPassiveSocket (addr .String ()[:lastIdx ], conn .logger )
320+ socket , err := newPassiveSocket (addr .String ()[:lastIdx ], conn .logger , conn . tlsConfig )
318321 if err != nil {
319322 log .Error (err )
320323 conn .writeMessage (425 , "Data connection failed" )
@@ -595,7 +598,7 @@ func (cmd commandPasv) Execute(conn *Conn, param string) {
595598 conn .writeMessage (425 , "Data connection failed" )
596599 return
597600 }
598- socket , err := newPassiveSocket (parts [0 ], conn .logger )
601+ socket , err := newPassiveSocket (parts [0 ], conn .logger , conn . tlsConfig )
599602 if err != nil {
600603 conn .writeMessage (425 , "Data connection failed" )
601604 return
@@ -853,7 +856,16 @@ func (cmd commandAuth) RequireAuth() bool {
853856}
854857
855858func (cmd commandAuth ) Execute (conn * Conn , param string ) {
856- conn .writeMessage (550 , "Action not taken" )
859+ log .Println (param , conn )
860+ if param == "TLS" && conn .tlsConfig != nil {
861+ conn .writeMessage (234 , "AUTH command OK" )
862+ err := conn .upgradeToTls ()
863+ if err != nil {
864+ conn .logger .Printf ("Error upgrading conection to TLS %v" , err )
865+ }
866+ } else {
867+ conn .writeMessage (550 , "Action not taken" )
868+ }
857869}
858870
859871type commandCcc struct {}
@@ -925,7 +937,11 @@ func (cmd commandPbsz) RequireAuth() bool {
925937}
926938
927939func (cmd commandPbsz ) Execute (conn * Conn , param string ) {
928- conn .writeMessage (550 , "Action not taken" )
940+ if conn .tls && param == "0" {
941+ conn .writeMessage (200 , "OK" )
942+ } else {
943+ conn .writeMessage (550 , "Action not taken" )
944+ }
929945}
930946
931947type commandProt struct {}
@@ -943,7 +959,13 @@ func (cmd commandProt) RequireAuth() bool {
943959}
944960
945961func (cmd commandProt ) Execute (conn * Conn , param string ) {
946- conn .writeMessage (550 , "Action not taken" )
962+ if conn .tls && param == "P" {
963+ conn .writeMessage (200 , "OK" )
964+ } else if conn .tls {
965+ conn .writeMessage (536 , "Only P level is supported" )
966+ } else {
967+ conn .writeMessage (550 , "Action not taken" )
968+ }
947969}
948970
949971type commandConf struct {}
0 commit comments