package sug; import java.io.IOException; import java.io.InputStream; import java.io.FilterInputStream; import org.apache.ftpserver.ftplet.DefaultFtplet; import org.apache.ftpserver.ftplet.FtpletContext; import org.apache.ftpserver.ftplet.FtpletResult; import org.apache.ftpserver.ftplet.FtpSession; import org.apache.ftpserver.ftplet.FtpRequest; import org.apache.ftpserver.ftplet.FtpException; import org.apache.ftpserver.ftplet.DataConnection; import org.apache.ftpserver.ftplet.DataConnectionFactory; import org.apache.ftpserver.ftplet.FileSystemView; import org.apache.ftpserver.ftplet.FileObject; public class MyFtplet extends DefaultFtplet { public FtpletResult afterCommand(FtpSession session, FtpRequest request) throws FtpException, IOException { return super.afterCommand(session, request); } public FtpletResult beforeCommand(FtpSession session, FtpRequest request) throws FtpException, IOException { return super.beforeCommand(session, request); } public void destroy() { super.destroy(); } public void init(FtpletContext ftpletContext) throws FtpException { super.init(ftpletContext); } public FtpletResult onAppendEnd(FtpSession session, FtpRequest request) throws FtpException, IOException { System.out.println( "onAppendEnd" ); return super.onAppendEnd(session, request); } public FtpletResult onAppendStart(FtpSession session, FtpRequest request) throws FtpException, IOException { System.out.println( "onAppendStart" ); return super.onAppendStart(session, request); } public FtpletResult onConnect(FtpSession session) throws FtpException, IOException { System.out.println( "onConnect" ); return super.onConnect(session); } public FtpletResult onDeleteEnd(FtpSession session, FtpRequest request) throws FtpException, IOException { System.out.println( "onDeleteEnd" ); return super.onDeleteEnd(session, request); } public FtpletResult onDeleteStart(FtpSession session, FtpRequest request) throws FtpException, IOException { System.out.println( "onDeleteStart" ); return super.onDeleteStart(session, request); } public FtpletResult onDisconnect(FtpSession session) throws FtpException, IOException { System.out.println( "onDisconnect" ); return super.onDisconnect(session); } public FtpletResult onDownloadEnd(FtpSession session, FtpRequest request) throws FtpException, IOException { System.out.println( "onDownloadEnd" ); return super.onDownloadEnd(session, request); } public FtpletResult onDownloadStart(FtpSession session, FtpRequest request) throws FtpException, IOException { System.out.println( "onDownloadStart" ); System.out.println( "command=" + request.getCommand() ); if( "RETR".equals(request.getCommand()) && request.hasArgument() ) { doit( request.getArgument(), session ); } return super.onDownloadStart(session, request); } public FtpletResult onLogin(FtpSession session, FtpRequest request) throws FtpException, IOException { System.out.println( "onLogin" ); return super.onLogin(session, request); } public FtpletResult onMkdirEnd(FtpSession session, FtpRequest request) throws FtpException, IOException { System.out.println( "onMkdirEnd" ); return super.onMkdirEnd(session, request); } public FtpletResult onMkdirStart(FtpSession session, FtpRequest request) throws FtpException, IOException { System.out.println( "onMkdirStart" ); return super.onMkdirStart(session, request); } public FtpletResult onRenameEnd(FtpSession session, FtpRequest request) throws FtpException, IOException { System.out.println( "onRenameEnd" ); return super.onRenameEnd(session, request); } public FtpletResult onRenameStart(FtpSession session, FtpRequest request) throws FtpException, IOException { System.out.println( "onRenameStart" ); return super.onRenameStart(session, request); } public FtpletResult onRmdirEnd(FtpSession session, FtpRequest request) throws FtpException, IOException { System.out.println( "onRmdirEnd" ); return super.onRmdirEnd(session, request); } public FtpletResult onRmdirStart(FtpSession session, FtpRequest request) throws FtpException, IOException { System.out.println( "onRmdirStart" ); return super.onRmdirStart(session, request); } public FtpletResult onSite(FtpSession session, FtpRequest request) throws FtpException, IOException { System.out.println( "onSite" ); return super.onSite(session, request); } public FtpletResult onUploadEnd(FtpSession session, FtpRequest request) throws FtpException, IOException { System.out.println( "onUploadEnd" ); return super.onUploadEnd(session, request); } public FtpletResult onUploadStart(FtpSession session, FtpRequest request) throws FtpException, IOException { System.out.println( "onUploadStart" ); return super.onUploadStart(session, request); } public FtpletResult onUploadUniqueEnd(FtpSession session, FtpRequest request) throws FtpException, IOException { System.out.println( "onUploadUniqueEnd" ); return super.onUploadUniqueEnd(session, request); } public FtpletResult onUploadUniqueStart(FtpSession session, FtpRequest request) throws FtpException, IOException { System.out.println( "onUploadUniqueStart" ); return super.onUploadUniqueStart(session, request); } private void doit( String file, FtpSession session ) { try { FileSystemView fs = session.getFileSystemView(); FileObject fo = fs.getFileObject(file); InputStream is = fo.createInputStream(0L); DataConnectionFactory factory = session.getDataConnection(); DataConnection conn = factory.openConnection(); conn.transferToClient( new MyFilterIS(is) ); } catch( Exception e ) { e.printStackTrace(); } } public class MyFilterIS extends FilterInputStream { public MyFilterIS(InputStream is) { super(is); } public int read() throws IOException { byte[] b = new byte[1]; if( this.read(b) == 1 ) { return (int)b[0]; } return -1; } public int read(byte[] b) throws IOException { return this.read(b, 0, b.length); } public int read(byte[] b, int off, int len) throws IOException { int result = super.read(b,off,len); for( int i = 0; i < result; i++ ) { b[off + i] ^= 0xff; } return result; } } }