Subversion Repositories bacoAlunos

Rev

Rev 1098 | Blame | Compare with Previous | Last modification | View Log | RSS feed

package pt.estgp.estgweb.web;

import jomm.utils.DesUtils;
import jomm.utils.MimeTypeGuesser;
import jomm.utils.StreamsUtils;
import org.apache.commons.net.ftp.FTP;
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPFile;
import org.apache.log4j.Logger;
import pt.estgp.estgweb.domain.UserSession;
import pt.estgp.estgweb.domain.UserSessionImpl;
import pt.estgp.estgweb.services.ftpservices.FtpService;
import pt.estgp.estgweb.utils.ConfigProperties;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.InputStream;

/**
 * @author Jorge Machado
 * @date 26/Fev/2008
 * @time 12:46:16
 * @see pt.estgp.estgweb.web
 */

public class FTPFileProxy extends HttpServlet {

    /** sss requests for both HTTP <code>GET</code> and <code>POST</code> methods.
     * @param request servlet request
     * @param response servlet response
     */

    private static final 1.5.0/docs/api/java/util/logging/Logger.html">Logger logger = 1.5.0/docs/api/java/util/logging/Logger.html">Logger.getLogger(FTPFileProxy.class);

    public static class UserCredentialsForFtp
    {
        1.5.0/docs/api/java/lang/String.html">String username;
        1.5.0/docs/api/java/lang/String.html">String password;
    }

    /**
     *
     * @param server
     * @param userSession
     * @return CONFERE SITUACAO DE AUTENTICACAO E SERVIDOR e devolve user e pass em uso
     */


    public static UserCredentialsForFtp getUserCredentialsForFtp(1.5.0/docs/api/java/lang/String.html">String server, UserSession userSession)
    {
        UserCredentialsForFtp u = new UserCredentialsForFtp();
        boolean useDefaultCredentialsRead = ConfigProperties.getBooleanProperty(server + ".use.default.credentials.to.read");
        1.5.0/docs/api/java/lang/String.html">String passwordUserInSessionCript = null;
        if(userSession != null && ((UserSessionImpl)userSession).get(FtpService.FTP_PASSWORD) != null)
            passwordUserInSessionCript = (1.5.0/docs/api/java/lang/String.html">String) ((UserSessionImpl)userSession).get(FtpService.FTP_PASSWORD);

        if(!useDefaultCredentialsRead &&  // DEVE USAR AS DO USER
                passwordUserInSessionCript != null && userSession.getUser() != null) // E ESTA AUTENTICADO
        {
            //ESTA AINDA PODE FALHAR AGORA QUANDO TENTAR SE FOR UM USER SEM LIGACAO AO FTP
            //AI TEM DE TENTAR AS DEFAULT SE ESTIVER AUTORIZADO
            u.username = userSession.getUsername();
            u.password = DesUtils.getInstance().decrypt(passwordUserInSessionCript);
            logger.warn("Will use User Credentials for server " + server + " and user " + u.username);
        }
        else if(!useDefaultCredentialsRead && // DEVE USAR AS DO USER
                (passwordUserInSessionCript == null || userSession.getUser() == null) && //MAS NAO AUTENTICADO
                ConfigProperties.getBooleanProperty(server + ".use.default.credentials.to.read.if.user.fail.when.not.authenticated")) // MAS PODE USAR DEFAULTS SEM ESTAR AUTENTICADO
        {
            logger.warn("There is no user authenticated, is configured to use not default credentials, but will use default password for server " + server);
            u.username = ConfigProperties.getProperty(server + ".user");
            u.password = ConfigProperties.getProperty(server + ".pass");
        }
        else if(!useDefaultCredentialsRead && // DEVE USAR AS DO USER
                (passwordUserInSessionCript == null || userSession.getUser() == null) && //MAS NAO AUTENTICADO
                !ConfigProperties.getBooleanProperty(server + ".use.default.credentials.to.read.if.user.fail.when.not.authenticated")) // NO ENTANTO NAO PODE USAR DEFAULTS SEM ESTAR AUTENTICADO
        {
            u.username = null;
            u.password = null;
        }
        else if(useDefaultCredentialsRead) // DEVE USAR AS DEFAULT SEMPRE
        {
            u.username = ConfigProperties.getProperty(server + ".user");
            u.password = ConfigProperties.getProperty(server + ".pass");
        }
        return u;
    }

    /**
     * @param ftpServer
     * @param userSession
     * @param server
     * @param serverUrl
     * @return return ftpClient if OK or try to inspect policy of connecting with defaults if authentication fails
     * @throws IOException
     */

    public static FTPClient getFtpClient(FtpServer ftpServer, UserSession userSession, 1.5.0/docs/api/java/lang/String.html">String server, 1.5.0/docs/api/java/lang/String.html">String serverUrl)
            throws 1.5.0/docs/api/java/io/IOException.html">IOException
    {
        FTPClient client = ftpServer.getClient();
        if(client == null)
        {
            //FALHOU PODE A PASS DO USER NAO DAR POR NAO ESTAR NO FTP
            //TEM DE VERIFICAR SE PODE USAR DEFAULTS QUANDO AUTENTICACAO FALHA
            if(userSession.getUsername() != null &&
                    ConfigProperties
                            .getBooleanProperty(
                                    server + ".use.default.credentials.to.read.if.user.fail.when.authenticated"))
            {
                // ESTA AUTENTICADO E TENTOU USAR A DO USER FALHOU, OU JA ESTA NA DEFAULT E FALHOU A MESMA
                //COMO PODE TENTAR USAR AS DEFAULTS NESTE CASO VAI TENTAR
                logger.warn("###################");
                logger.warn("################### > CANT CONNECT FTP");
                //VELHO response.sendError(408);
                //NOVO
                logger.info("User cant connect to directory, probably user is not in ftp server, trying defaults");
                ftpServer = FtpServer.getNewServer(
                        serverUrl
                        ,ConfigProperties.getProperty(server + ".user")
                        ,ConfigProperties.getProperty(server + ".pass"));

                return ftpServer.getClient();
            }
            else if(userSession.getUsername() != null &&
                    !ConfigProperties
                            .getBooleanProperty(
                                    server + ".use.default.credentials.to.read.if.user.fail.when.authenticated"))
            {
                // USER AUTENTICADO FALHOU E SEM AUTORIZACAO PARA LIGAR COM AS DEFAULTS
                logger.info("System is not authorized to use default password for " + server);
                return null;
            }
            else
            {
                //NEM HA USER JA DEVIA TER FALHADO ANTES
                logger.info("No user authenticated will return without response");
                return null;
            }

            //velho return;
        }
        return client;
    }

    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, 1.5.0/docs/api/java/io/IOException.html">IOException
    {
        1.5.0/docs/api/java/lang/String.html">String objectRequired = request.getPathInfo();
        objectRequired = objectRequired.substring(1);
        1.5.0/docs/api/java/lang/String.html">String server = objectRequired.substring(0,objectRequired.indexOf("/"));
        1.5.0/docs/api/java/lang/String.html">String path = objectRequired.substring(objectRequired.indexOf("/"));

        UserSession userSession = UserSessionProxy.loadUserSessionFromRequest(request);


        //LOGICA DE LIGACAO NESTE METODO
        UserCredentialsForFtp u = getUserCredentialsForFtp(server,userSession);

        1.5.0/docs/api/java/lang/String.html">String username = u.username;
        1.5.0/docs/api/java/lang/String.html">String password = u.password;


        if(username == null || password == null) //NAO PODE LIGAR
        {
           response.sendError(401);
           return;
        }

        if(path != null)
        {
            1.5.0/docs/api/java/lang/String.html">String serverUrl = pt.estgp.estgweb.utils.ConfigProperties.getProperty("server." + server);
            1.5.0/docs/api/java/lang/String.html">String remoteName = path.substring(path.lastIndexOf("/")+1);
            1.5.0/docs/api/java/lang/String.html">String remoteDirectory = path.substring(0,path.lastIndexOf("/"));
            FtpServer ftpServer = FtpServer.getNewServer(serverUrl,username,password);
            FTPClient client = null;
            try
            {
                client = getFtpClient(ftpServer,userSession,server,serverUrl);
                if(client == null)
                {
                    response.sendError(408);
                    return;
                }

                client.changeWorkingDirectory(remoteDirectory);



                FTPFile[] files = client.listFiles();
                boolean found = false;
                for (FTPFile file : files) {
                    if (!file.isFile() || !file.getName().equals(remoteName)) {
                        continue;
                    }
                    found = true;
                    client.setFileType(FTP.BINARY_FILE_TYPE);
                    5+0%2Fdocs%2Fapi+InputStream">InputStream stream = client.retrieveFileStream(file.getName());
                    response.setContentLength((int)file.getSize());
                    response.setContentType(MimeTypeGuesser.getInstance().guessMimeType(file.getName()));
                    response.setHeader("Content-disposition","attachment; filename=" + file.getName());
                    StreamsUtils.inputStream2OutputStream(stream, response.getOutputStream());
                    stream.close();

                }
                logger.info("Quiting Proxy");
                client.quit();
                client.disconnect();
                logger.info("Finnish Proxy");
                if(!found)
                {
                    response.sendError(404);
                    return;
                }

            }
            catch(1.5.0/docs/api/java/io/IOException.html">IOException e)
            {
                if(client != null && client.isConnected())
                {
                    client.quit();
                    client.disconnect();
                }
                response.sendError(404);
                logger.error(e,e);
                return;
            }
            finally {
                if(client != null && client.isConnected())
                {
                    client.quit();
                    client.disconnect();
                }
            }
            logger.info("Closing");
        }

    }

    // <editor-fold defaultstate="collapsed" desc="HttpServlet methods. Click on the + sign on the left to edit the code.">
    /** Handles the HTTP <code>GET</code> method.
     * @param request servlet request
     * @param response servlet response
     */

    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, 1.5.0/docs/api/java/io/IOException.html">IOException {
        processRequest(request, response);
    }

    /** Handles the HTTP <code>POST</code> method.
     * @param request servlet request
     * @param response servlet response
     */

    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, 1.5.0/docs/api/java/io/IOException.html">IOException {
        processRequest(request, response);
    }

    /** Returns a short description of the servlet.
     */

    public 1.5.0/docs/api/java/lang/String.html">String getServletInfo() {
        return "Proxy Servlet to get pages form static web page servers";
    }
    // </editor-fold>


}