[ 
https://issues.apache.org/jira/browse/DIRMINA-987?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Jonathan Valliere resolved DIRMINA-987.
---------------------------------------
    Resolution: Incomplete

Old, not enough information

> SOCKS5 Proxy handler can not handle unresolved computer names
> -------------------------------------------------------------
>
>                 Key: DIRMINA-987
>                 URL: https://issues.apache.org/jira/browse/DIRMINA-987
>             Project: MINA
>          Issue Type: Bug
>          Components: Handler
>    Affects Versions: 2.0.7
>            Reporter: Michael Reinecke
>            Priority: Minor
>
> We are using Mina 2.0.7 to access an server through an Socks5 proxy. This 
> worked fine as long as we use a direct IP address of the endpoint, but once 
> we use the computer name, a nullpointer exception would occur. I searched 
> through the source code and found the cause.
> If Java can not resolve the computer name, then the handler will switch to 
> the else branch, which tries to access the host value from the request. But 
> to construct the Socks5 Request, you HAVE to set an INetAddress and CAN NOT 
> set the host directly.
> One feature of Socks5 is the ability to resolve the hostname by the proxy 
> which may not be resolvable by others and therefor it is not required to 
> resolve the name on our side. So the fastest way to fix this was to add the 
> code in the '//---' in the else branch.
> I am sure there are smarter ways to handle this problem, like extracting the 
> host name in the SocksProxyRequest constructor and set it to the host 
> variable. But as far as I do not know the complete infrastructure of MINA and 
> the resulting consequences, I used this approach ;).
> Yours,
> Michael Reinecke
> <...>
> SocksProxyRequest  soxx = new SocksProxyRequest(
>                                                                               
>                 SocksProxyConstants.SOCKS_VERSION_5,
>                                                                               
>                 SocksProxyConstants.ESTABLISH_TCPIP_STREAM,
>                                                                               
>                 new InetSocketAddress("endpoint-name", 666),
>                                                                               
>                 "username"); <...>
> package org.apache.mina.proxy.handlers.socks;
> <...>
> public class Socks5LogicHandler extends AbstractSocksLogicHandler { <...>
>     private IoBuffer encodeProxyRequestPacket(final SocksProxyRequest 
> request) throws UnsupportedEncodingException {
>         int len = 6;
>         InetSocketAddress adr = request.getEndpointAddress();
>         byte addressType = 0;
>         byte[] host = null;
>         if (adr != null && !adr.isUnresolved()) {
>             if (adr.getAddress() instanceof Inet6Address) {
>                 len += 16;
>                 addressType = SocksProxyConstants.IPV6_ADDRESS_TYPE;
>             } else if (adr.getAddress() instanceof Inet4Address) {
>                 len += 4;
>                 addressType = SocksProxyConstants.IPV4_ADDRESS_TYPE;
>             }
>         } else {
>             host = request.getHost() != null ? 
> request.getHost().getBytes("ASCII") : null;
>             // --- The proxy will take care of the destination in Socks5
>             if(host == null && adr != null){
>                 host = adr.getHostName().getBytes("ASCII");
>             }
>             // ---
>             if (host != null) {
>                 len += 1 + host.length;
>                 addressType = SocksProxyConstants.DOMAIN_NAME_ADDRESS_TYPE;
>             } else {
>                 throw new IllegalArgumentException("SocksProxyRequest object 
> " + "has no suitable endpoint information");
>             }
>         }
> <...>
>     }



--
This message was sent by Atlassian JIRA
(v7.6.3#76005)

Reply via email to