package org.rzo.netty.ahessian.auth;
import org.jboss.netty.channel.ChannelHandlerContext;
import org.jboss.netty.channel.ChannelPipeline;
import org.jboss.netty.channel.ChannelPipelineCoverage;
import org.jboss.netty.channel.ChannelStateEvent;
import org.jboss.netty.channel.MessageEvent;
import org.jboss.netty.channel.SimpleChannelUpstreamHandler;
import org.jboss.netty.logging.InternalLogger;
import org.jboss.netty.logging.InternalLoggerFactory;
/**
* Server side authentication handler.
* <br>
* This must be the first handler in the pipeline.
*
* <br>
* A typical setup for ServerAuthFilter for TCP/IP socket would be:
*
* <pre>
* {@link ChannelPipeline} pipeline = ...;
*
* EncryptedAuthToken token = new EncryptedAuthToken();
* token.setAlgorithm("SHA-1");
* token.setPassword("test");
* ServerAuthFilter auth = new ServerAuthFilter(token);
* pipeline.addLast("auth", auth);
* </pre>
*
*/
@ChannelPipelineCoverage("one")
public class ServerAuthFilter extends SimpleChannelUpstreamHandler
{
private AuthToken _token = null;
private boolean _authenticated = false;
private static final InternalLogger logger =
InternalLoggerFactory.getInstance(ServerAuthFilter.class);
/**
* Instantiates a new server auth filter.
*
* @param token the token
*/
public ServerAuthFilter(AuthToken token)
{
setToken(token);
}
/**
* Sets the token.
*
* @param token the new token
*/
public void setToken(AuthToken token)
{
_token = token;
}
/* (non-Javadoc)
* @see org.jboss.netty.channel.SimpleChannelUpstreamHandler#messageReceived(org.jboss.netty.channel.ChannelHandlerContext, org.jboss.netty.channel.MessageEvent)
*/
@Override
public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) throws Exception
{
if (!_authenticated)
{
int result = _token.authenticate(ctx, e);
if ( result == AuthToken.FAILED)
{
logger.warn("authentication failed -> close connection");
ctx.getChannel().close();
}
else if (result == AuthToken.PASSED)
{
_authenticated = true;
}
}
else
ctx.sendUpstream(e);
}
@Override
public void channelDisconnected(
ChannelHandlerContext ctx, ChannelStateEvent e) throws Exception
{
_token.disconnected();
ctx.sendUpstream(e);
}
}