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