/*************************************************** * * cismet GmbH, Saarbruecken, Germany * * ... and it just works. * ****************************************************/ package de.cismet.security.handler; import org.apache.commons.net.ftp.FTPClient; import org.apache.commons.net.ftp.FTPClientConfig; import java.io.BufferedReader; import java.io.InputStream; import java.io.Reader; import java.io.StringReader; import java.net.Authenticator; import java.net.InetSocketAddress; import java.net.PasswordAuthentication; import java.net.URL; import java.util.HashMap; import de.cismet.commons.security.AccessHandler.ACCESS_HANDLER_TYPES; import de.cismet.commons.security.AccessHandler.ACCESS_METHODS; import de.cismet.commons.security.Tunnel; import de.cismet.commons.security.handler.AbstractAccessHandler; import de.cismet.netutil.Proxy; import static org.apache.commons.net.ftp.FTP.BINARY_FILE_TYPE; /** * DOCUMENT ME! * * @author Gilles Baatz * @version $Revision$, $Date$ */ public class FTPAccessHandler extends AbstractAccessHandler { //~ Static fields/initializers --------------------------------------------- private static final org.apache.log4j.Logger LOG = org.apache.log4j.Logger.getLogger(FTPAccessHandler.class); public static final ACCESS_HANDLER_TYPES ACCESS_HANDLER_TYPE = ACCESS_HANDLER_TYPES.FTP; public static ACCESS_METHODS[] SUPPORTED_ACCESS_METHODS = new ACCESS_METHODS[] { ACCESS_METHODS.GET_REQUEST, }; //~ Instance fields -------------------------------------------------------- private transient Proxy proxy; private Tunnel tunnel = null; //~ Constructors ----------------------------------------------------------- /** * Creates a new FTPAccessHandler object. */ public FTPAccessHandler() { this.proxy = Proxy.fromSystem(); } //~ Methods ---------------------------------------------------------------- @Override public boolean isAccessMethodSupported(final ACCESS_METHODS method) { for (final ACCESS_METHODS curMethod : SUPPORTED_ACCESS_METHODS) { if (curMethod == method) { return true; } } return false; } @Override public ACCESS_HANDLER_TYPES getHandlerType() { return ACCESS_HANDLER_TYPE; } @Override public InputStream doRequest(final URL url, final Reader requestParameter, final ACCESS_METHODS method, final HashMap<String, String> options) throws Exception { final FTPClient ftpClient = getConfiguredFTPClient(); final StringBuilder parameter = new StringBuilder(); final BufferedReader reader = new BufferedReader(requestParameter); String currentLine; while ((currentLine = reader.readLine()) != null) { parameter.append(currentLine); } if ((tunnel != null) && ((method == ACCESS_METHODS.GET_REQUEST) || (method == ACCESS_METHODS.POST_REQUEST) || (method == ACCESS_METHODS.HEAD_REQUEST)) && tunnel.isResponsible(method, url.toString())) { return tunnel.doRequest(url, new StringReader(parameter.toString()), method, options); } final int port = (url.getPort() != -1) ? url.getPort() : url.getDefaultPort(); ftpClient.connect(url.getHost(), port); if (url.getUserInfo() != null) { final String[] user_password = url.getUserInfo().split(":"); String password = ""; if (user_password.length > 1) { password = user_password[1]; } ftpClient.login(user_password[0], password); } else { ftpClient.login("anonymous", ""); } ftpClient.enterLocalPassiveMode(); ftpClient.setFileType(BINARY_FILE_TYPE); return ftpClient.retrieveFileStream(url.getPath()); } @Override public InputStream doRequest(final URL url, final InputStream requestParameter, final HashMap<String, String> options) throws Exception { LOG.fatal("FTPAccessHandler.doRequest: Not supported yet.", new Exception()); // NOI18N return null; } /** * DOCUMENT ME! * * @return DOCUMENT ME! */ protected FTPClient getConfiguredFTPClient() { if (LOG.isDebugEnabled()) { LOG.debug("getConfiguredFTPClient"); // NOI18N } final FTPClient client = new FTPClient(); final FTPClientConfig config = new FTPClientConfig(); if (proxy != null) { // proxy needs authentication if ((proxy.getUsername() != null) && (proxy.getPassword() != null)) { Authenticator.setDefault(new Authenticator() { @Override protected PasswordAuthentication getPasswordAuthentication() { final PasswordAuthentication p = new PasswordAuthentication( proxy.getUsername(), proxy.getPassword().toCharArray()); return p; } }); } final java.net.Proxy proxyfo = new java.net.Proxy( java.net.Proxy.Type.HTTP, new InetSocketAddress(this.proxy.getHost(), this.proxy.getPort())); client.setProxy(proxyfo); } client.configure(config); return client; } /** * DOCUMENT ME! * * @return DOCUMENT ME! */ public Proxy getProxy() { return proxy; } /** * DOCUMENT ME! * * @param proxy DOCUMENT ME! */ public void setProxy(final Proxy proxy) { this.proxy = proxy; } /** * DOCUMENT ME! * * @return DOCUMENT ME! */ public Tunnel getTunnel() { return tunnel; } /** * DOCUMENT ME! * * @param tunnel DOCUMENT ME! */ public void setTunnel(final Tunnel tunnel) { this.tunnel = tunnel; } }