/** * Encodes the authentication packet for supported authentication methods. * * @param request the socks proxy request data * @return the encoded buffer, if null then authentication step is over and handshake process can * jump immediately to the next step without waiting for a server reply. * @throws UnsupportedEncodingException if some string charset convertion fails * @throws GSSException when something fails while using GSSAPI */ private IoBuffer encodeAuthenticationPacket(final SocksProxyRequest request) throws UnsupportedEncodingException, GSSException { byte method = (Byte) getSession().getAttribute(Socks5LogicHandler.SELECTED_AUTH_METHOD); switch (method) { case SocksProxyConstants.NO_AUTH: // In this case authentication is immediately considered as successfull // Next writeRequest() call will send the proxy request getSession().setAttribute(HANDSHAKE_STEP, SocksProxyConstants.SOCKS5_REQUEST_STEP); break; case SocksProxyConstants.GSSAPI_AUTH: return encodeGSSAPIAuthenticationPacket(request); case SocksProxyConstants.BASIC_AUTH: // The basic auth scheme packet is sent byte[] user = request.getUserName().getBytes("ASCII"); byte[] pwd = request.getPassword().getBytes("ASCII"); IoBuffer buf = IoBuffer.allocate(3 + user.length + pwd.length); buf.put(SocksProxyConstants.BASIC_AUTH_SUBNEGOTIATION_VERSION); buf.put((byte) user.length); buf.put(user); buf.put((byte) pwd.length); buf.put(pwd); return buf; } return null; }
/** * Encode a SOCKS4/SOCKS4a request and writes it to the next filter so it can be sent to the proxy * server. * * @param nextFilter the next filter * @param request the request to send. */ protected void writeRequest(final NextFilter nextFilter, final SocksProxyRequest request) { try { boolean isV4ARequest = Arrays.equals(request.getIpAddress(), SocksProxyConstants.FAKE_IP); byte[] userID = request.getUserName().getBytes("ASCII"); byte[] host = isV4ARequest ? request.getHost().getBytes("ASCII") : null; int len = 9 + userID.length; if (isV4ARequest) { len += host.length + 1; } IoBuffer buf = IoBuffer.allocate(len); buf.put(request.getProtocolVersion()); buf.put(request.getCommandCode()); buf.put(request.getPort()); buf.put(request.getIpAddress()); buf.put(userID); buf.put(SocksProxyConstants.TERMINATOR); if (isV4ARequest) { buf.put(host); buf.put(SocksProxyConstants.TERMINATOR); } if (isV4ARequest) { logger.debug(" sending SOCKS4a request"); } else { logger.debug(" sending SOCKS4 request"); } buf.flip(); writeData(nextFilter, buf); } catch (Exception ex) { closeSession("Unable to send Socks request: ", ex); } }