Le 6/11/13 4:29 PM, Erick Lichtas a écrit : > Hi Everyone, > > I've been using the mina FTP server for quite some time, and would like to > get CCC support added to the server, specifically > https://issues.apache.org/jira/browse/FTPSERVER-411 which was opened a couple > years ago. > > I've take a look at the code attached on the case and have noticed there are > some issues in Mina when trying to remove an SslFilter from the chain while > it is in use, race conditions exist which frequently result in > IllegalStateExceptions. This appears to be a synchronization issues in the > SslFilter. Additionally, it appears the SslFilter is designed to not be > removed once it is added to the chain and that I can simply call stopSsl() > basically disable the filter. I'm currently working with Mina 2.0.7.
I confirm : the SSLFilter can't be removed, it would close the connection. This is quite a problem for StartTLS, for instance... > > Going with this approach, i updated the CCC.execute(..) method to look like > this > > public void execute(final FtpIoSession session, > final FtpServerContext context, final FtpRequest request) > throws IOException, FtpException { > > // reset state variables > session.resetState(); > > if (session.isSecure()) { > synchronized (session) { > session.write(new > DefaultFtpReply(200, "Okay")).awaitUninterruptibly(); > IoFilterChain filterChain = > session.getFilterChain(); > SslFilter filter = > (SslFilter) filterChain.get(SslFilter.class); > > filter.stopSsl(session).awaitUninterruptibly(); > } > } > else { > session.write(new DefaultFtpReply(500, "Not a > secured session")); > } > } > > This seems to work great with certain FTPS clients that support CCC, such as > Commons-NET and SmartFTP, but fails with others, such as CuteFTP and WS_FTP > Pro are failing > > I believe this ties into this COMMONS-NET case > https://issues.apache.org/jira/browse/NET-354, and this ftpserver-users > archive > http://markmail.org/message/elzz43cqz22d4jap#query:+page:1+mid:bak2icz4n26fadlg+state:results<http://markmail.org/message/elzz43cqz22d4jap%23query:+page:1+mid:bak2icz4n26fadlg+state:results> > > They contain some debate on the proper implementation of terminating SSL and > it seems there are clearly 2 different client implementations, some that > properly terminate SSL by sending the CLOSE_NOTIFY, and some that simply > disregard the ssl wrapper and move on. >From the client POV, whatever they do is their own pb. Regardless, the server side should be ready to support any kind of client terminaison. > > So while adding the call to filter.stopSsl(session).awaitUninterruptibly() in > the CCC.execute method works for some clients, it appears CuteFTP and WS_FTP > do not expect the CLOSE_NOTIFY and actually get confused when they receive it. > > I've tweaked Mina's SslFilter to add a toggle for whether or not to send a > CLOSE_NOTIFY and adjusted the code as follows: > > public WriteFuture stopSsl(IoSession session) throws SSLException { > SslHandler handler = getSslSessionHandler(session); > NextFilter nextFilter = (NextFilter) > session.getAttribute(NEXT_FILTER); > WriteFuture future; > synchronized (handler) { > if (SEND_CLOSE_NOTIFY) { > future = > initiateClosure(nextFilter, session); > } > else { > synchronized > (handler) { > > // release resources > > handler.destroy(); > } > } > } > > handler.flushScheduledEvents(); > > return future; > } > > I'm not sure if this is the right approach, but it now seems to be working > for the mentioned FTPS clients that were not working with the CCC command > before. > > My questions are more or less requests for comments and suggestions, whether > or not I'm way off track, and if this is something that can be fully > integrated into Mina and the FTP server. Many thanks for thsoe suggestions ! It's funny because we have had a long discussion last week about how to handle SSL closure, as we are working on the SSL handling for MINA 3. I guess we have to spend some time on this aspect for MINA 2 too... -- Regards, Cordialement, Emmanuel Lécharny www.iktek.com