I have problems with implementing secure xmpp client based on Apache Mina.It should support some features like HMAC etc.. One point in my task is to provide the ability to use SOCKS5 proxy.Server side is already done, and i have working code without supporting proxy. Here is the constructor i've implemented:
public class SecureConnector extends AbstractProxyIoHandler {
private static final int PORT = PORT;
private static final String HOSTNAME = HOSTNAME;
private NioSocketConnector nioConnector;
private ProxyConnector connector;
private volatile int lastStreamID = 0;
private static Object mutex = new Object();
private List<MessageFilter> filters = new ArrayList<MessageFilter>();
private NotificationListener notificationListener;
public SecureConnector(NotificationListener notificationListener, InetSocketAddress proxyAddress) {
this.notificationListener = notificationListener;
nioConnector = new NioSocketConnector();
SocksProxyRequest pr = new SocksProxyRequest(
SocksProxyConstants.SOCKS_VERSION_5,
SocksProxyConstants.ESTABLISH_TCPIP_STREAM,
new InetSocketAddress(HOSTNAME, PORT), "");
ProxyIoSession ps=new ProxyIoSession(proxyAddress, pr);
connector=new ProxyConnector(nioConnector);
connector.setHandler(this);
connector.getFilterChain().addLast("codec", new
connector.getFilterChain().addFirst("sslfilter", getSSLFilter());
connector.setProxyIoSession(ps);}
@Override
public void proxySessionOpened(IoSession session)
{
WriteFuture writeFuture = session.write(IoBuffer.wrap(new byte[]{0xFF}));
}
public ConnectFuture connect() {
return connector.connect();
}
@Override
public void exceptionCaught(IoSession session, Throwable cause) throws Exception {
cause.printStackTrace();
session.close(true);
}
@Override
public void messageReceived(IoSession session, Object message) throws Exception {
if (message instanceof Message) {
Message msg = (Message) message;
if (msg instanceof Close){
session.close(true);
return;
}
}
Message is class which describes format of message. And here is the using of class:
SecureConnector connector = new SecureConnector(new NotificationListener(service),proxyAddress);
System.out.println("connector created");
ConnectFuture connectFuture = connector.connect();
connectFuture.await(TIMEOUT);
if (!connectFuture.isConnected()) {
throw new IOException("Couldn't connect to server!");
}
System.out.println("before getting session");
final IoSession session = connectFuture.getSession();
IoSessionConfig sessconf = session.getConfig();
sessconf.setUseReadOperation(true);
System.out.println("session configured");
send(session, IoBuffer.wrap(new byte[]{0xFF}));
System.out.println("byte sent");
recieve(session);
System.out.println("Connected to server.");
NotificationListener is service which provides autodownload of new certs after special command from server, but this is not the point of question. So, after using this i have the folowing error:
[NioProcessor-2] ERROR org.apache.mina.proxy.AbstractProxyLogicHandler - Unable to send Socks request: java.lang.NullPointerException at org.apache.mina.proxy.handlers.socks.Socks5LogicHandler.encodeAuthenticationPacket(Socks5LogicHandler.java:185) at org.apache.mina.proxy.handlers.socks.Socks5LogicHandler.writeRequest(Socks5LogicHandler.java:282) at org.apache.mina.proxy.handlers.socks.Socks5LogicHandler.doHandshake(Socks5LogicHandler.java:86) at org.apache.mina.proxy.handlers.socks.Socks5LogicHandler.handleResponse(Socks5LogicHandler.java:433) at org.apache.mina.proxy.handlers.socks.Socks5LogicHandler.messageReceived(Socks5LogicHandler.java:318) at org.apache.mina.proxy.filter.ProxyFilter.messageReceived(ProxyFilter.java:164) at org.apache.mina.core.filterchain.DefaultIoFilterChain.callNextMessageReceived(DefaultIoFilterChain.java:542) at org.apache.mina.core.filterchain.DefaultIoFilterChain.access$1300(DefaultIoFilterChain.java:48) at org.apache.mina.core.filterchain.DefaultIoFilterChain$EntryImpl$1.messageReceived(DefaultIoFilterChain.java:943) at org.apache.mina.core.filterchain.IoFilterAdapter.messageReceived(IoFilterAdapter.java:109) at org.apache.mina.core.filterchain.DefaultIoFilterChain.callNextMessageReceived(DefaultIoFilterChain.java:542) at org.apache.mina.core.filterchain.DefaultIoFilterChain.fireMessageReceived(DefaultIoFilterChain.java:535) at org.apache.mina.core.polling.AbstractPollingIoProcessor.read(AbstractPollingIoProcessor.java:718) at org.apache.mina.core.polling.AbstractPollingIoProcessor.process(AbstractPollingIoProcessor.java:672) at org.apache.mina.core.polling.AbstractPollingIoProcessor.process(AbstractPollingIoProcessor.java:661) at org.apache.mina.core.polling.AbstractPollingIoProcessor.access$600(AbstractPollingIoProcessor.java:68) at org.apache.mina.core.polling.AbstractPollingIoProcessor$Processor.run(AbstractPollingIoProcessor.java:1130) at org.apache.mina.util.NamePreservingRunnable.run(NamePreservingRunnable.java:64) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) at java.lang.Thread.run(Thread.java:745)
This error goes right after opening proxy session. Can anyone help me with this problem? I'd wrote to apache mina support but hadn't receive any answer.