下面列出了 io.netty.handler.codec.socksx.v5.DefaultSocks5InitialResponse #io.netty.handler.codec.socksx.v5.Socks5AuthMethod 实例代码,或者点击链接到github查看源代码,也可以在右侧发表评论。
boolean authenticate(ChannelHandlerContext ctx, Object msg) {
if (username == null) {
ctx.pipeline().replace(DECODER, DECODER, new Socks5CommandRequestDecoder());
ctx.write(new DefaultSocks5InitialResponse(Socks5AuthMethod.NO_AUTH));
return true;
}
if (msg instanceof Socks5InitialRequest) {
ctx.pipeline().replace(DECODER, DECODER, new Socks5PasswordAuthRequestDecoder());
ctx.write(new DefaultSocks5InitialResponse(Socks5AuthMethod.PASSWORD));
return false;
}
Socks5PasswordAuthRequest req = (Socks5PasswordAuthRequest) msg;
if (req.username().equals(username) && req.password().equals(password)) {
ctx.pipeline().replace(DECODER, DECODER, new Socks5CommandRequestDecoder());
ctx.write(new DefaultSocks5PasswordAuthResponse(Socks5PasswordAuthStatus.SUCCESS));
return true;
}
ctx.pipeline().replace(DECODER, DECODER, new Socks5PasswordAuthRequestDecoder());
ctx.write(new DefaultSocks5PasswordAuthResponse(Socks5PasswordAuthStatus.FAILURE));
return false;
}
@Override
protected void channelRead0(ChannelHandlerContext ctx, Socks5Message msg) throws Exception {
if (msg instanceof DefaultSocks5InitialRequest) {
ctx.pipeline().addBefore(ctx.name(), Socks5CommandRequestDecoder.class.getName(),
new Socks5CommandRequestDecoder());
ctx.writeAndFlush(new DefaultSocks5InitialResponse(Socks5AuthMethod.NO_AUTH));
} else if (msg instanceof DefaultSocks5CommandRequest) {
final DefaultSocks5CommandRequest req = (DefaultSocks5CommandRequest) msg;
ctx.pipeline().remove(Socks5CommandRequestDecoder.class);
ctx.fireUserEventTriggered(new ProxySuccessEvent(
new InetSocketAddress(req.dstAddr(), req.dstPort()),
new DefaultSocks5CommandResponse(Socks5CommandStatus.SUCCESS,
Socks5AddressType.IPv4)));
} else {
throw new IllegalStateException("unexpected msg: " + msg);
}
}
@Override
protected Future<?> execute() {
List<Socks5AuthMethod> authMethods = new ArrayList<>(2);
authMethods.add(Socks5AuthMethod.NO_AUTH);
if ((username != null) || (password != null)) {
authMethods.add(Socks5AuthMethod.PASSWORD);
}
DefaultSocks5InitialRequest initialRequest = new DefaultSocks5InitialRequest(authMethods);
addFirstOrReplaceHandler(SOCKS_ENCODER_NAME, Socks5ClientEncoder.DEFAULT);
addFirstOrReplaceHandler(SOCKS_DECODER_NAME, new Socks5InitialResponseDecoder());
return writeToChannel(initialRequest);
}
@Override
void read(ConnectionFlow flow, Object msg) {
if (msg instanceof Socks5InitialResponse) {
Socks5AuthMethod selectedAuthMethod = ((Socks5InitialResponse) msg).authMethod();
final boolean authSuccess;
if (selectedAuthMethod == Socks5AuthMethod.NO_AUTH) {
// Immediately proceed to SOCKS CONNECT
flow.first(SOCKS5CONNECTRequestWithChainedProxy);
authSuccess = true;
}
else if (selectedAuthMethod == Socks5AuthMethod.PASSWORD) {
// Insert a password negotiation step:
flow.first(SOCKS5SendPasswordCredentials);
authSuccess = true;
}
else {
// Server returned Socks5AuthMethod.UNACCEPTED or a method we do not support
authSuccess = false;
}
if (authSuccess) {
flow.advance();
return;
}
}
flow.fail();
}
private Socks5AuthMethod socksAuthMethod() {
Socks5AuthMethod authMethod;
if (username == null && password == null) {
authMethod = Socks5AuthMethod.NO_AUTH;
} else {
authMethod = Socks5AuthMethod.PASSWORD;
}
return authMethod;
}
@Override
protected void channelRead0(ChannelHandlerContext ctx, SocksMessage socksMessage)
throws Exception {
switch (socksMessage.version()) {
case SOCKS4a:
Socks4CommandRequest socksV4CmdRequest = (Socks4CommandRequest) socksMessage;
if (socksV4CmdRequest.type() == Socks4CommandType.CONNECT) {
onSocksSuccess(ctx, socksV4CmdRequest);
} else {
ctx.close();
}
break;
case SOCKS5:
if (socksMessage instanceof Socks5InitialRequest) {
ctx.pipeline().addFirst(addChannelHandler(new Socks5CommandRequestDecoder()));
ctx.writeAndFlush(new DefaultSocks5InitialResponse(Socks5AuthMethod.NO_AUTH));
} else if (socksMessage instanceof Socks5PasswordAuthRequest) {
ctx.pipeline().addFirst(addChannelHandler(new Socks5CommandRequestDecoder()));
ctx.writeAndFlush(new DefaultSocks5PasswordAuthResponse(Socks5PasswordAuthStatus.SUCCESS));
} else if (socksMessage instanceof Socks5CommandRequest) {
Socks5CommandRequest socks5CmdRequest = (Socks5CommandRequest) socksMessage;
if (socks5CmdRequest.type() == Socks5CommandType.CONNECT) {
onSocksSuccess(ctx, socks5CmdRequest);
} else {
ctx.close();
}
} else {
ctx.close();
}
break;
case UNKNOWN:
ctx.close();
break;
}
}
@Override
public void channelRead0(ChannelHandlerContext ctx, SocksMessage socksRequest) throws Exception {
switch (socksRequest.version()) {
case SOCKS4a:
Socks4CommandRequest socksV4CmdRequest = (Socks4CommandRequest) socksRequest;
if (socksV4CmdRequest.type() == Socks4CommandType.CONNECT) {
ctx.pipeline().addLast(new SocksServerConnectHandler());
ctx.pipeline().remove(this);
ctx.fireChannelRead(socksRequest);
} else {
ctx.close();
}
break;
case SOCKS5:
if (socksRequest instanceof Socks5InitialRequest) {
// auth support example
//ctx.pipeline().addFirst(new Socks5PasswordAuthRequestDecoder());
//ctx.write(new DefaultSocks5AuthMethodResponse(Socks5AuthMethod.PASSWORD));
ctx.pipeline().addFirst(new Socks5CommandRequestDecoder());
ctx.write(new DefaultSocks5InitialResponse(Socks5AuthMethod.NO_AUTH));
} else if (socksRequest instanceof Socks5PasswordAuthRequest) {
ctx.pipeline().addFirst(new Socks5CommandRequestDecoder());
ctx.write(new DefaultSocks5PasswordAuthResponse(Socks5PasswordAuthStatus.SUCCESS));
} else if (socksRequest instanceof Socks5CommandRequest) {
Socks5CommandRequest socks5CmdRequest = (Socks5CommandRequest) socksRequest;
if (socks5CmdRequest.type() == Socks5CommandType.CONNECT) {
ctx.pipeline().addLast(new SocksServerConnectHandler());
ctx.pipeline().remove(this);
ctx.fireChannelRead(socksRequest);
} else {
ctx.close();
}
} else {
ctx.close();
}
break;
case UNKNOWN:
ctx.close();
break;
}
}
@Override
public String authScheme() {
return socksAuthMethod() == Socks5AuthMethod.PASSWORD? AUTH_PASSWORD : AUTH_NONE;
}
@Override
protected Object newInitialMessage(ChannelHandlerContext ctx) throws Exception {
return socksAuthMethod() == Socks5AuthMethod.PASSWORD? INIT_REQUEST_PASSWORD : INIT_REQUEST_NO_AUTH;
}