1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 package io.netty.handler.codec.socks;
17
18 import io.netty.buffer.ByteBuf;
19 import io.netty.channel.ChannelHandlerContext;
20 import io.netty.handler.codec.ReplayingDecoder;
21 import io.netty.handler.codec.socks.SocksAuthResponseDecoder.State;
22
23 import java.util.List;
24
25
26
27
28
29 public class SocksAuthResponseDecoder extends ReplayingDecoder<State> {
30 private static final String name = "SOCKS_AUTH_RESPONSE_DECODER";
31
32
33
34
35 @Deprecated
36 public static String getName() {
37 return name;
38 }
39
40 public SocksAuthResponseDecoder() {
41 super(State.CHECK_PROTOCOL_VERSION);
42 }
43
44 @Override
45 protected void decode(ChannelHandlerContext channelHandlerContext, ByteBuf byteBuf, List<Object> out)
46 throws Exception {
47 switch (state()) {
48 case CHECK_PROTOCOL_VERSION: {
49 if (byteBuf.readByte() != SocksSubnegotiationVersion.AUTH_PASSWORD.byteValue()) {
50 out.add(SocksCommonUtils.UNKNOWN_SOCKS_RESPONSE);
51 break;
52 }
53 checkpoint(State.READ_AUTH_RESPONSE);
54 }
55 case READ_AUTH_RESPONSE: {
56 SocksAuthStatus authStatus = SocksAuthStatus.valueOf(byteBuf.readByte());
57 out.add(new SocksAuthResponse(authStatus));
58 break;
59 }
60 default: {
61 throw new Error();
62 }
63 }
64 channelHandlerContext.pipeline().remove(this);
65 }
66
67 enum State {
68 CHECK_PROTOCOL_VERSION,
69 READ_AUTH_RESPONSE
70 }
71 }