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>
}