예제 #1
0
  /**
   * 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);
    }
  }