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 

Reply via email to