1 5 package com.coldcore.coloradoftp.command.impl.ftp; 6 7 import com.coldcore.coloradoftp.command.Reply; 8 import com.coldcore.coloradoftp.command.impl.AbstractCommand; 9 import com.coldcore.coloradoftp.connection.DataPortListener; 10 import com.coldcore.coloradoftp.connection.DataPortListenerSet; 11 import com.coldcore.coloradoftp.factory.ObjectFactory; 12 import com.coldcore.coloradoftp.factory.ObjectName; 13 import com.coldcore.coloradoftp.session.DataOpenerType; 14 import com.coldcore.coloradoftp.session.Session; 15 import com.coldcore.coloradoftp.session.SessionAttributeName; 16 import org.apache.log4j.Logger; 17 18 import java.util.Set ; 19 20 public class PasvCommand extends AbstractCommand { 21 22 private static Logger log = Logger.getLogger(PasvCommand.class); 23 protected String ip; 24 25 26 29 public String getIp() { 30 return ip; 31 } 32 33 34 37 public void setIp(String ip) { 38 this.ip = ip; 39 } 40 41 42 public Reply execute() { 43 Reply reply = getReply(); 44 if (!testLogin()) return reply; 45 46 Session session = getConnection().getSession(); 47 session.removeAttribute(SessionAttributeName.DATA_OPENER_TYPE); 48 49 DataPortListenerSet listeners = (DataPortListenerSet) ObjectFactory.getObject(ObjectName.DATA_PORT_LISTENER_SET); 50 if (listeners.boundNumber() == 0 || ip == null || ip.length() == 0) { 51 log.warn("No IP address, cannot accept data connections"); 52 reply.setCode("425"); 53 reply.setText("Can't open data connection."); 54 return reply; 55 } 56 57 int port = 0; 58 Set<DataPortListener> set = listeners.list(); 59 for (DataPortListener listener : set) { 60 if (listener.addConnection(controlConnection)) { 61 port = listener.getPort(); 62 break; 63 } 64 } 65 66 if (port == 0) { 67 log.warn("No free data port listeners left"); 68 reply.setCode("425"); 69 reply.setText("Failed to enter passive mode, try again."); 70 return reply; 71 } 72 73 log.debug("Data connection will be accepted on "+ip+":"+port); 74 int i = port/256; 75 String pstr = i+","+(port-i*256); 76 String ipcs = ip.replaceAll("\\.", ","); 77 78 session.setAttribute(SessionAttributeName.DATA_OPENER_TYPE, DataOpenerType.PASV); 80 81 reply.setCode("227"); 82 reply.setText("Entering Passive Mode ("+ipcs+","+pstr+")."); 83 return reply; 84 } 85 } 86 | Popular Tags |