/** * Closes all sessions. */ protected void closeAllSession() { for (long key : sessions.keySet()) { sessions.get(key).close(); } }
@Override public void onCreate(Session session) throws CloseSessionException { logger.info("Create SESSION[{}] for {}", session.getId(), session.getClientAddress()); }
/** * This method will save user in session. * * @param session Current session. * @param user user. */ protected void authenticationSuccess(Session session, User user) { session.setAttribute(USER_KEY, user); }
@Override public void doBind(Session session, CommandMessage commandMessage) throws SocksException, IOException { ServerSocket serverSocket = new ServerSocket(commandMessage.getPort()); int bindPort = serverSocket.getLocalPort(); Socket socket = null; logger.info("Create TCP server bind at {} for session[{}]", serverSocket .getLocalSocketAddress(), session.getId()); session.write(new CommandResponseMessage(VERSION, ServerReply.SUCCEEDED, serverSocket .getInetAddress(), bindPort)); socket = serverSocket.accept(); session.write(new CommandResponseMessage(VERSION, ServerReply.SUCCEEDED, socket .getLocalAddress(), socket.getLocalPort())); Pipe pipe = new SocketPipe(session.getSocket(), socket); pipe.setBufferSize(bufferSize); pipe.start(); // wait for pipe exit. while (pipe.isRunning()) { try { Thread.sleep(idleTime); } catch (InterruptedException e) { pipe.stop(); session.close(); logger.info("Session[{}] closed", session.getId()); } } serverSocket.close(); // throw new NotImplementException("Not implement BIND command"); }
@Override public void doUDPAssociate(Session session, CommandMessage commandMessage) throws SocksException, IOException { UDPRelayServer udpRelayServer = new UDPRelayServer(((InetSocketAddress) session.getClientAddress()).getAddress(), commandMessage.getPort()); InetSocketAddress socketAddress = (InetSocketAddress) udpRelayServer.start(); logger.info("Create UDP relay server at[{}] for {}", socketAddress, commandMessage .getSocketAddress()); session.write(new CommandResponseMessage(VERSION, ServerReply.SUCCEEDED, InetAddress .getLocalHost(), socketAddress.getPort())); while (udpRelayServer.isRunning()) { try { Thread.sleep(idleTime); } catch (InterruptedException e) { session.close(); logger.info("Session[{}] closed", session.getId()); } if (session.isClose()) { udpRelayServer.stop(); logger.debug("UDP relay server for session[{}] is closed", session.getId()); } } }
@Override public void doMethod(Session session) throws SocksException, IOException { checkNotNull(session, "Argument [session] may not be null"); checkNotNull(authenticator, "Please set an authenticator"); UsernamePasswordMessage usernamePasswordMessage = new UsernamePasswordMessage(); session.read(usernamePasswordMessage); logger.debug("SESSION[{}] Receive credentials: {}", session.getId(), usernamePasswordMessage .getUsernamePasswordCredentials()); try { authenticator.doAuthenticate(usernamePasswordMessage.getUsernamePasswordCredentials(), session); } catch (AuthenticationException e) { session.write(new UsernamePasswordResponseMessage(false)); throw e; } session.write(new UsernamePasswordResponseMessage(true)); }
@Override public void onClose(Session session) { logger.info("SESSION[{}] closed", session.getId()); }
/** * This method will throw a {@link AuthenticationException} * * @param session Current session * @throws AuthenticationException {@link AuthenticationException} */ protected void authenticationFailed(Session session) throws AuthenticationException { throw new AuthenticationException( "Authentication failed, client from " + session.getClientAddress()); }
@Override public void doBind(Session session, CommandMessage commandMessage) throws SocksException, IOException { ServerSocket serverSocket = new ServerSocket(commandMessage.getPort()); int bindPort = serverSocket.getLocalPort(); Socket socket = null; logger.info("Create TCP server bind at {} for session[{}]", serverSocket .getLocalSocketAddress(), session.getId()); session.write(new CommandResponseMessage(VERSION, ServerReply.SUCCEEDED, serverSocket .getInetAddress(), bindPort)); socket = serverSocket.accept(); session.write(new CommandResponseMessage(VERSION, ServerReply.SUCCEEDED, socket .getLocalAddress(), socket.getLocalPort())); Pipe pipe = new SocketPipe(session.getSocket(), socket); pipe.setBufferSize(bufferSize); pipe.start(); // wait for pipe exit. while (pipe.isRunning()) { try { Thread.sleep(idleTime); } catch (InterruptedException e) { pipe.stop(); session.close(); logger.info("Session[{}] closed", session.getId()); } } serverSocket.close(); // throw new NotImplementException("Not implement BIND command"); }
@Override public void doUDPAssociate(Session session, CommandMessage commandMessage) throws SocksException, IOException { UDPRelayServer udpRelayServer = new UDPRelayServer(((InetSocketAddress) session.getClientAddress()).getAddress(), commandMessage.getPort()); InetSocketAddress socketAddress = (InetSocketAddress) udpRelayServer.start(); logger.info("Create UDP relay server at[{}] for {}", socketAddress, commandMessage .getSocketAddress()); session.write(new CommandResponseMessage(VERSION, ServerReply.SUCCEEDED, InetAddress .getLocalHost(), socketAddress.getPort())); while (udpRelayServer.isRunning()) { try { Thread.sleep(idleTime); } catch (InterruptedException e) { session.close(); logger.info("Session[{}] closed", session.getId()); } if (session.isClose()) { udpRelayServer.stop(); logger.debug("UDP relay server for session[{}] is closed", session.getId()); } } }
@Override public void doMethod(Session session) throws SocksException, IOException { checkNotNull(session, "Argument [session] may not be null"); checkNotNull(authenticator, "Please set an authenticator"); UsernamePasswordMessage usernamePasswordMessage = new UsernamePasswordMessage(); session.read(usernamePasswordMessage); logger.debug("SESSION[{}] Receive credentials: {}", session.getId(), usernamePasswordMessage .getUsernamePasswordCredentials()); try { authenticator.doAuthenticate(usernamePasswordMessage.getUsernamePasswordCredentials(), session); } catch (AuthenticationException e) { session.write(new UsernamePasswordResponseMessage(false)); throw e; } session.write(new UsernamePasswordResponseMessage(true)); }
@Override public void onClose(Session session) { logger.info("SESSION[{}] closed", session.getId()); }
/** * This method will throw a {@link AuthenticationException} * * @param session Current session * @throws AuthenticationException {@link AuthenticationException} */ protected void authenticationFailed(Session session) throws AuthenticationException { throw new AuthenticationException( "Authentication failed, client from " + session.getClientAddress()); }
reply = ServerReply.GENERAL_SOCKS_SERVER_FAILURE; logger.info("SESSION[{}] connect {} [{}] exception:{}", session.getId(), new InetSocketAddress(remoteServerAddress, remoteServerPort), reply, e.getMessage()); session.write(responseMessage); if (reply != ServerReply.SUCCEEDED) { // 如果返回失败信息,则退出该方法。 session.close(); return; Pipe pipe = new SocketPipe(session.getSocket(), socket); pipe.setName("SESSION[" + session.getId() + "]"); pipe.setBufferSize(bufferSize); if (getSocksProxyServer().getPipeInitializer() != null) { } catch (InterruptedException e) { pipe.stop(); session.close(); logger.info("SESSION[{}] closed", session.getId());
session.read(msg); logger.debug("SESSION[{}] Response client:{}", session.getId(), selectedMethod.getMethodName()); session.write(new MethodSelectionResponseMessage(VERSION, selectedMethod)); session.read(commandMessage); // Read command request. session.write(new CommandResponseMessage(serverReply)); logger.info("SESSION[{}] will close, because {}", session.getId(), serverReply); return;
@Override public void onException(Session session, Exception exception) { logger.error("SESSION[{}] occurred error:{}, message:{}", session.getId(), exception.getClass ().getSimpleName(), exception.getMessage()); exception.printStackTrace(); } }
@Override public void onCreate(Session session) throws CloseSessionException { logger.info("Create SESSION[{}] for {}", session.getId(), session.getClientAddress()); }
/** * Closes all sessions. */ protected void closeAllSession() { for (long key : sessions.keySet()) { sessions.get(key).close(); } }
/** * This method will save user in session. * * @param session Current session. * @param user user. */ protected void authenticationSuccess(Session session, User user) { session.setAttribute(USER_KEY, user); }
reply = ServerReply.GENERAL_SOCKS_SERVER_FAILURE; logger.info("SESSION[{}] connect {} [{}] exception:{}", session.getId(), new InetSocketAddress(remoteServerAddress, remoteServerPort), reply, e.getMessage()); session.write(responseMessage); if (reply != ServerReply.SUCCEEDED) { // 如果返回失败信息,则退出该方法。 session.close(); return; Pipe pipe = new SocketPipe(session.getSocket(), socket); pipe.setName("SESSION[" + session.getId() + "]"); pipe.setBufferSize(bufferSize); if(getSocksProxyServer().getPipeInitializer() != null){ } catch (InterruptedException e) { pipe.stop(); session.close(); logger.info("SESSION[{}] closed", session.getId());