Subversion Repositories bacoAlunos

Rev

Rev 1098 | Only display areas with differences | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 1098 Rev 1306
1
package pt.estgp.estgweb.web;
1
package pt.estgp.estgweb.web;
2
 
2
 
3
import jomm.utils.DesUtils;
3
import jomm.utils.DesUtils;
4
import jomm.utils.MimeTypeGuesser;
4
import jomm.utils.MimeTypeGuesser;
5
import jomm.utils.StreamsUtils;
5
import jomm.utils.StreamsUtils;
6
import org.apache.commons.net.ftp.FTP;
6
import org.apache.commons.net.ftp.FTP;
7
import org.apache.commons.net.ftp.FTPClient;
7
import org.apache.commons.net.ftp.FTPClient;
8
import org.apache.commons.net.ftp.FTPFile;
8
import org.apache.commons.net.ftp.FTPFile;
9
import org.apache.log4j.Logger;
9
import org.apache.log4j.Logger;
10
import pt.estgp.estgweb.domain.UserSession;
10
import pt.estgp.estgweb.domain.UserSession;
11
import pt.estgp.estgweb.domain.UserSessionImpl;
11
import pt.estgp.estgweb.domain.UserSessionImpl;
12
import pt.estgp.estgweb.services.ftpservices.FtpService;
12
import pt.estgp.estgweb.services.ftpservices.FtpService;
13
import pt.estgp.estgweb.utils.ConfigProperties;
13
import pt.estgp.estgweb.utils.ConfigProperties;
14
 
14
 
15
import javax.servlet.ServletException;
15
import javax.servlet.ServletException;
16
import javax.servlet.http.HttpServlet;
16
import javax.servlet.http.HttpServlet;
17
import javax.servlet.http.HttpServletRequest;
17
import javax.servlet.http.HttpServletRequest;
18
import javax.servlet.http.HttpServletResponse;
18
import javax.servlet.http.HttpServletResponse;
19
import java.io.IOException;
19
import java.io.IOException;
20
import java.io.InputStream;
20
import java.io.InputStream;
21
 
21
 
22
/**
22
/**
23
 * @author Jorge Machado
23
 * @author Jorge Machado
24
 * @date 26/Fev/2008
24
 * @date 26/Fev/2008
25
 * @time 12:46:16
25
 * @time 12:46:16
26
 * @see pt.estgp.estgweb.web
26
 * @see pt.estgp.estgweb.web
27
 */
27
 */
28
public class FTPFileProxy extends HttpServlet {
28
public class FTPFileProxy extends HttpServlet {
29
 
29
 
30
    /** sss requests for both HTTP <code>GET</code> and <code>POST</code> methods.
30
    /** sss requests for both HTTP <code>GET</code> and <code>POST</code> methods.
31
     * @param request servlet request
31
     * @param request servlet request
32
     * @param response servlet response
32
     * @param response servlet response
33
     */
33
     */
34
    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);
34
    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);
35
 
35
 
36
    public static class UserCredentialsForFtp
36
    public static class UserCredentialsForFtp
37
    {
37
    {
38
        1.5.0/docs/api/java/lang/String.html">String username;
38
        1.5.0/docs/api/java/lang/String.html">String username;
39
        1.5.0/docs/api/java/lang/String.html">String password;
39
        1.5.0/docs/api/java/lang/String.html">String password;
40
    }
40
    }
41
 
41
 
42
    /**
42
    /**
43
     *
43
     *
44
     * @param server
44
     * @param server
45
     * @param userSession
45
     * @param userSession
46
     * @return CONFERE SITUACAO DE AUTENTICACAO E SERVIDOR e devolve user e pass em uso
46
     * @return CONFERE SITUACAO DE AUTENTICACAO E SERVIDOR e devolve user e pass em uso
47
     */
47
     */
48
 
48
 
49
    public static UserCredentialsForFtp getUserCredentialsForFtp(1.5.0/docs/api/java/lang/String.html">String server, UserSession userSession)
49
    public static UserCredentialsForFtp getUserCredentialsForFtp(1.5.0/docs/api/java/lang/String.html">String server, UserSession userSession)
50
    {
50
    {
51
        UserCredentialsForFtp u = new UserCredentialsForFtp();
51
        UserCredentialsForFtp u = new UserCredentialsForFtp();
52
        boolean useDefaultCredentialsRead = ConfigProperties.getBooleanProperty(server + ".use.default.credentials.to.read");
52
        boolean useDefaultCredentialsRead = ConfigProperties.getBooleanProperty(server + ".use.default.credentials.to.read");
53
        1.5.0/docs/api/java/lang/String.html">String passwordUserInSessionCript = null;
53
        1.5.0/docs/api/java/lang/String.html">String passwordUserInSessionCript = null;
54
        if(userSession != null && ((UserSessionImpl)userSession).get(FtpService.FTP_PASSWORD) != null)
54
        if(userSession != null && ((UserSessionImpl)userSession).get(FtpService.FTP_PASSWORD) != null)
55
            passwordUserInSessionCript = (1.5.0/docs/api/java/lang/String.html">String) ((UserSessionImpl)userSession).get(FtpService.FTP_PASSWORD);
55
            passwordUserInSessionCript = (1.5.0/docs/api/java/lang/String.html">String) ((UserSessionImpl)userSession).get(FtpService.FTP_PASSWORD);
56
 
56
 
57
        if(!useDefaultCredentialsRead &&  // DEVE USAR AS DO USER
57
        if(!useDefaultCredentialsRead &&  // DEVE USAR AS DO USER
58
                passwordUserInSessionCript != null && userSession.getUser() != null) // E ESTA AUTENTICADO
58
                passwordUserInSessionCript != null && userSession.getUser() != null) // E ESTA AUTENTICADO
59
        {
59
        {
60
            //ESTA AINDA PODE FALHAR AGORA QUANDO TENTAR SE FOR UM USER SEM LIGACAO AO FTP
60
            //ESTA AINDA PODE FALHAR AGORA QUANDO TENTAR SE FOR UM USER SEM LIGACAO AO FTP
61
            //AI TEM DE TENTAR AS DEFAULT SE ESTIVER AUTORIZADO
61
            //AI TEM DE TENTAR AS DEFAULT SE ESTIVER AUTORIZADO
62
            u.username = userSession.getUsername();
62
            u.username = userSession.getUsername();
63
            u.password = DesUtils.getInstance().decrypt(passwordUserInSessionCript);
63
            u.password = DesUtils.getInstance().decrypt(passwordUserInSessionCript);
64
            logger.warn("Will use User Credentials for server " + server + " and user " + u.username);
64
            logger.warn("Will use User Credentials for server " + server + " and user " + u.username);
65
        }
65
        }
66
        else if(!useDefaultCredentialsRead && // DEVE USAR AS DO USER
66
        else if(!useDefaultCredentialsRead && // DEVE USAR AS DO USER
67
                (passwordUserInSessionCript == null || userSession.getUser() == null) && //MAS NAO AUTENTICADO
67
                (passwordUserInSessionCript == null || userSession.getUser() == null) && //MAS NAO AUTENTICADO
68
                ConfigProperties.getBooleanProperty(server + ".use.default.credentials.to.read.if.user.fail.when.not.authenticated")) // MAS PODE USAR DEFAULTS SEM ESTAR AUTENTICADO
68
                ConfigProperties.getBooleanProperty(server + ".use.default.credentials.to.read.if.user.fail.when.not.authenticated")) // MAS PODE USAR DEFAULTS SEM ESTAR AUTENTICADO
69
        {
69
        {
70
            logger.warn("There is no user authenticated, is configured to use not default credentials, but will use default password for server " + server);
70
            logger.warn("There is no user authenticated, is configured to use not default credentials, but will use default password for server " + server);
71
            u.username = ConfigProperties.getProperty(server + ".user");
71
            u.username = ConfigProperties.getProperty(server + ".user");
72
            u.password = ConfigProperties.getProperty(server + ".pass");
72
            u.password = ConfigProperties.getProperty(server + ".pass");
73
        }
73
        }
74
        else if(!useDefaultCredentialsRead && // DEVE USAR AS DO USER
74
        else if(!useDefaultCredentialsRead && // DEVE USAR AS DO USER
75
                (passwordUserInSessionCript == null || userSession.getUser() == null) && //MAS NAO AUTENTICADO
75
                (passwordUserInSessionCript == null || userSession.getUser() == null) && //MAS NAO AUTENTICADO
76
                !ConfigProperties.getBooleanProperty(server + ".use.default.credentials.to.read.if.user.fail.when.not.authenticated")) // NO ENTANTO NAO PODE USAR DEFAULTS SEM ESTAR AUTENTICADO
76
                !ConfigProperties.getBooleanProperty(server + ".use.default.credentials.to.read.if.user.fail.when.not.authenticated")) // NO ENTANTO NAO PODE USAR DEFAULTS SEM ESTAR AUTENTICADO
77
        {
77
        {
78
            u.username = null;
78
            u.username = null;
79
            u.password = null;
79
            u.password = null;
80
        }
80
        }
81
        else if(useDefaultCredentialsRead) // DEVE USAR AS DEFAULT SEMPRE
81
        else if(useDefaultCredentialsRead) // DEVE USAR AS DEFAULT SEMPRE
82
        {
82
        {
83
            u.username = ConfigProperties.getProperty(server + ".user");
83
            u.username = ConfigProperties.getProperty(server + ".user");
84
            u.password = ConfigProperties.getProperty(server + ".pass");
84
            u.password = ConfigProperties.getProperty(server + ".pass");
85
        }
85
        }
86
        return u;
86
        return u;
87
    }
87
    }
88
 
88
 
89
    /**
89
    /**
90
     * @param ftpServer
90
     * @param ftpServer
91
     * @param userSession
91
     * @param userSession
92
     * @param server
92
     * @param server
93
     * @param serverUrl
93
     * @param serverUrl
94
     * @return return ftpClient if OK or try to inspect policy of connecting with defaults if authentication fails
94
     * @return return ftpClient if OK or try to inspect policy of connecting with defaults if authentication fails
95
     * @throws IOException
95
     * @throws IOException
96
     */
96
     */
97
    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)
97
    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)
98
            throws 1.5.0/docs/api/java/io/IOException.html">IOException
98
            throws 1.5.0/docs/api/java/io/IOException.html">IOException
99
    {
99
    {
100
        FTPClient client = ftpServer.getClient();
100
        FTPClient client = ftpServer.getClient();
101
        if(client == null)
101
        if(client == null)
102
        {
102
        {
103
            //FALHOU PODE A PASS DO USER NAO DAR POR NAO ESTAR NO FTP
103
            //FALHOU PODE A PASS DO USER NAO DAR POR NAO ESTAR NO FTP
104
            //TEM DE VERIFICAR SE PODE USAR DEFAULTS QUANDO AUTENTICACAO FALHA
104
            //TEM DE VERIFICAR SE PODE USAR DEFAULTS QUANDO AUTENTICACAO FALHA
105
            if(userSession.getUsername() != null &&
105
            if(userSession.getUsername() != null &&
106
                    ConfigProperties
106
                    ConfigProperties
107
                            .getBooleanProperty(
107
                            .getBooleanProperty(
108
                                    server + ".use.default.credentials.to.read.if.user.fail.when.authenticated"))
108
                                    server + ".use.default.credentials.to.read.if.user.fail.when.authenticated"))
109
            {
109
            {
110
                // ESTA AUTENTICADO E TENTOU USAR A DO USER FALHOU, OU JA ESTA NA DEFAULT E FALHOU A MESMA
110
                // ESTA AUTENTICADO E TENTOU USAR A DO USER FALHOU, OU JA ESTA NA DEFAULT E FALHOU A MESMA
111
                //COMO PODE TENTAR USAR AS DEFAULTS NESTE CASO VAI TENTAR
111
                //COMO PODE TENTAR USAR AS DEFAULTS NESTE CASO VAI TENTAR
112
                logger.warn("###################");
112
                logger.warn("###################");
113
                logger.warn("################### > CANT CONNECT FTP");
113
                logger.warn("################### > CANT CONNECT FTP");
114
                //VELHO response.sendError(408);
114
                //VELHO response.sendError(408);
115
                //NOVO
115
                //NOVO
116
                logger.info("User cant connect to directory, probably user is not in ftp server, trying defaults");
116
                logger.info("User cant connect to directory, probably user is not in ftp server, trying defaults");
117
                ftpServer = FtpServer.getNewServer(
117
                ftpServer = FtpServer.getNewServer(
118
                        serverUrl
118
                        serverUrl
119
                        ,ConfigProperties.getProperty(server + ".user")
119
                        ,ConfigProperties.getProperty(server + ".user")
120
                        ,ConfigProperties.getProperty(server + ".pass"));
120
                        ,ConfigProperties.getProperty(server + ".pass"));
121
 
121
 
122
                return ftpServer.getClient();
122
                return ftpServer.getClient();
123
            }
123
            }
124
            else if(userSession.getUsername() != null &&
124
            else if(userSession.getUsername() != null &&
125
                    !ConfigProperties
125
                    !ConfigProperties
126
                            .getBooleanProperty(
126
                            .getBooleanProperty(
127
                                    server + ".use.default.credentials.to.read.if.user.fail.when.authenticated"))
127
                                    server + ".use.default.credentials.to.read.if.user.fail.when.authenticated"))
128
            {
128
            {
129
                // USER AUTENTICADO FALHOU E SEM AUTORIZACAO PARA LIGAR COM AS DEFAULTS
129
                // USER AUTENTICADO FALHOU E SEM AUTORIZACAO PARA LIGAR COM AS DEFAULTS
130
                logger.info("System is not authorized to use default password for " + server);
130
                logger.info("System is not authorized to use default password for " + server);
131
                return null;
131
                return null;
132
            }
132
            }
133
            else
133
            else
134
            {
134
            {
135
                //NEM HA USER JA DEVIA TER FALHADO ANTES
135
                //NEM HA USER JA DEVIA TER FALHADO ANTES
136
                logger.info("No user authenticated will return without response");
136
                logger.info("No user authenticated will return without response");
137
                return null;
137
                return null;
138
            }
138
            }
139
 
139
 
140
            //velho return;
140
            //velho return;
141
        }
141
        }
142
        return client;
142
        return client;
143
    }
143
    }
144
 
144
 
145
    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
145
    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
146
            throws ServletException, 1.5.0/docs/api/java/io/IOException.html">IOException
146
            throws ServletException, 1.5.0/docs/api/java/io/IOException.html">IOException
147
    {
147
    {
148
        1.5.0/docs/api/java/lang/String.html">String objectRequired = request.getPathInfo();
148
        1.5.0/docs/api/java/lang/String.html">String objectRequired = request.getPathInfo();
149
        objectRequired = objectRequired.substring(1);
149
        objectRequired = objectRequired.substring(1);
150
        1.5.0/docs/api/java/lang/String.html">String server = objectRequired.substring(0,objectRequired.indexOf("/"));
150
        1.5.0/docs/api/java/lang/String.html">String server = objectRequired.substring(0,objectRequired.indexOf("/"));
151
        1.5.0/docs/api/java/lang/String.html">String path = objectRequired.substring(objectRequired.indexOf("/"));
151
        1.5.0/docs/api/java/lang/String.html">String path = objectRequired.substring(objectRequired.indexOf("/"));
152
 
152
 
153
        UserSession userSession = UserSessionProxy.loadUserSessionFromRequest(request);
153
        UserSession userSession = UserSessionProxy.loadUserSessionFromRequest(request);
154
 
154
 
155
 
155
 
156
        //LOGICA DE LIGACAO NESTE METODO
156
        //LOGICA DE LIGACAO NESTE METODO
157
        UserCredentialsForFtp u = getUserCredentialsForFtp(server,userSession);
157
        UserCredentialsForFtp u = getUserCredentialsForFtp(server,userSession);
158
 
158
 
159
        1.5.0/docs/api/java/lang/String.html">String username = u.username;
159
        1.5.0/docs/api/java/lang/String.html">String username = u.username;
160
        1.5.0/docs/api/java/lang/String.html">String password = u.password;
160
        1.5.0/docs/api/java/lang/String.html">String password = u.password;
161
 
161
 
162
 
162
 
163
        if(username == null || password == null) //NAO PODE LIGAR
163
        if(username == null || password == null) //NAO PODE LIGAR
164
        {
164
        {
165
           response.sendError(401);
165
           response.sendError(401);
166
           return;
166
           return;
167
        }
167
        }
168
 
168
 
169
        if(path != null)
169
        if(path != null)
170
        {
170
        {
171
            1.5.0/docs/api/java/lang/String.html">String serverUrl = pt.estgp.estgweb.utils.ConfigProperties.getProperty("server." + server);
171
            1.5.0/docs/api/java/lang/String.html">String serverUrl = pt.estgp.estgweb.utils.ConfigProperties.getProperty("server." + server);
172
            1.5.0/docs/api/java/lang/String.html">String remoteName = path.substring(path.lastIndexOf("/")+1);
172
            1.5.0/docs/api/java/lang/String.html">String remoteName = path.substring(path.lastIndexOf("/")+1);
173
            1.5.0/docs/api/java/lang/String.html">String remoteDirectory = path.substring(0,path.lastIndexOf("/"));
173
            1.5.0/docs/api/java/lang/String.html">String remoteDirectory = path.substring(0,path.lastIndexOf("/"));
174
            FtpServer ftpServer = FtpServer.getNewServer(serverUrl,username,password);
174
            FtpServer ftpServer = FtpServer.getNewServer(serverUrl,username,password);
175
            FTPClient client = null;
175
            FTPClient client = null;
176
            try
176
            try
177
            {
177
            {
178
                client = getFtpClient(ftpServer,userSession,server,serverUrl);
178
                client = getFtpClient(ftpServer,userSession,server,serverUrl);
179
                if(client == null)
179
                if(client == null)
180
                {
180
                {
181
                    response.sendError(408);
181
                    response.sendError(408);
182
                    return;
182
                    return;
183
                }
183
                }
184
 
184
 
185
                client.changeWorkingDirectory(remoteDirectory);
185
                client.changeWorkingDirectory(remoteDirectory);
186
 
186
 
187
 
187
 
188
 
188
 
189
                FTPFile[] files = client.listFiles();
189
                FTPFile[] files = client.listFiles();
190
                boolean found = false;
190
                boolean found = false;
191
                for (FTPFile file : files) {
191
                for (FTPFile file : files) {
192
                    if (!file.isFile() || !file.getName().equals(remoteName)) {
192
                    if (!file.isFile() || !file.getName().equals(remoteName)) {
193
                        continue;
193
                        continue;
194
                    }
194
                    }
195
                    found = true;
195
                    found = true;
196
                    client.setFileType(FTP.BINARY_FILE_TYPE);
196
                    client.setFileType(FTP.BINARY_FILE_TYPE);
197
                    5+0%2Fdocs%2Fapi+InputStream">InputStream stream = client.retrieveFileStream(file.getName());
197
                    5+0%2Fdocs%2Fapi+InputStream">InputStream stream = client.retrieveFileStream(file.getName());
198
                    response.setContentLength((int)file.getSize());
198
                    response.setContentLength((int)file.getSize());
199
                    response.setContentType(MimeTypeGuesser.getInstance().guessMimeType(file.getName()));
199
                    response.setContentType(MimeTypeGuesser.getInstance().guessMimeType(file.getName()));
200
                    response.setHeader("Content-disposition","attachment; filename=" + file.getName());
200
                    response.setHeader("Content-disposition","attachment; filename=" + file.getName());
201
                    StreamsUtils.inputStream2OutputStream(stream, response.getOutputStream());
201
                    StreamsUtils.inputStream2OutputStream(stream, response.getOutputStream());
202
                    stream.close();
202
                    stream.close();
203
 
203
 
204
                }
204
                }
205
                logger.info("Quiting Proxy");
205
                logger.info("Quiting Proxy");
206
                client.quit();
206
                client.quit();
207
                client.disconnect();
207
                client.disconnect();
208
                logger.info("Finnish Proxy");
208
                logger.info("Finnish Proxy");
209
                if(!found)
209
                if(!found)
210
                {
210
                {
211
                    response.sendError(404);
211
                    response.sendError(404);
212
                    return;
212
                    return;
213
                }
213
                }
214
 
214
 
215
            }
215
            }
216
            catch(1.5.0/docs/api/java/io/IOException.html">IOException e)
216
            catch(1.5.0/docs/api/java/io/IOException.html">IOException e)
217
            {
217
            {
218
                if(client != null && client.isConnected())
218
                if(client != null && client.isConnected())
219
                {
219
                {
220
                    client.quit();
220
                    client.quit();
221
                    client.disconnect();
221
                    client.disconnect();
222
                }
222
                }
223
                response.sendError(404);
223
                response.sendError(404);
224
                logger.error(e,e);
224
                logger.error(e,e);
225
                return;
225
                return;
226
            }
226
            }
227
            finally {
227
            finally {
228
                if(client != null && client.isConnected())
228
                if(client != null && client.isConnected())
229
                {
229
                {
230
                    client.quit();
230
                    client.quit();
231
                    client.disconnect();
231
                    client.disconnect();
232
                }
232
                }
233
            }
233
            }
234
            logger.info("Closing");
234
            logger.info("Closing");
235
        }
235
        }
236
 
236
 
237
    }
237
    }
238
 
238
 
239
    // <editor-fold defaultstate="collapsed" desc="HttpServlet methods. Click on the + sign on the left to edit the code.">
239
    // <editor-fold defaultstate="collapsed" desc="HttpServlet methods. Click on the + sign on the left to edit the code.">
240
    /** Handles the HTTP <code>GET</code> method.
240
    /** Handles the HTTP <code>GET</code> method.
241
     * @param request servlet request
241
     * @param request servlet request
242
     * @param response servlet response
242
     * @param response servlet response
243
     */
243
     */
244
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
244
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
245
            throws ServletException, 1.5.0/docs/api/java/io/IOException.html">IOException {
245
            throws ServletException, 1.5.0/docs/api/java/io/IOException.html">IOException {
246
        processRequest(request, response);
246
        processRequest(request, response);
247
    }
247
    }
248
 
248
 
249
    /** Handles the HTTP <code>POST</code> method.
249
    /** Handles the HTTP <code>POST</code> method.
250
     * @param request servlet request
250
     * @param request servlet request
251
     * @param response servlet response
251
     * @param response servlet response
252
     */
252
     */
253
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
253
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
254
            throws ServletException, 1.5.0/docs/api/java/io/IOException.html">IOException {
254
            throws ServletException, 1.5.0/docs/api/java/io/IOException.html">IOException {
255
        processRequest(request, response);
255
        processRequest(request, response);
256
    }
256
    }
257
 
257
 
258
    /** Returns a short description of the servlet.
258
    /** Returns a short description of the servlet.
259
     */
259
     */
260
    public 1.5.0/docs/api/java/lang/String.html">String getServletInfo() {
260
    public 1.5.0/docs/api/java/lang/String.html">String getServletInfo() {
261
        return "Proxy Servlet to get pages form static web page servers";
261
        return "Proxy Servlet to get pages form static web page servers";
262
    }
262
    }
263
    // </editor-fold>
263
    // </editor-fold>
264
 
264
 
265
 
265
 
266
}
266
}
267
 
267