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 import org.jboss.netty.util.CharsetUtil;
23
24
25
26
27
28 public class SocksAuthRequestDecoder extends ReplayingDecoder<SocksAuthRequestDecoder.State> {
29
30 private SocksMessage.SubnegotiationVersion version;
31 private int fieldLength;
32 private String username;
33 private String password;
34 private SocksRequest msg = SocksCommonUtils.UNKNOWN_SOCKS_REQUEST;
35
36 public SocksAuthRequestDecoder() {
37 super(State.CHECK_PROTOCOL_VERSION);
38 }
39
40 @Override
41 protected Object decode(ChannelHandlerContext ctx, Channel channel,
42 ChannelBuffer buffer, State state) throws Exception {
43 switch (state) {
44 case CHECK_PROTOCOL_VERSION: {
45 version = SocksMessage.SubnegotiationVersion.fromByte(buffer.readByte());
46 if (version != SocksMessage.SubnegotiationVersion.AUTH_PASSWORD) {
47 break;
48 }
49 checkpoint(State.READ_USERNAME);
50 }
51 case READ_USERNAME: {
52 fieldLength = buffer.readByte();
53 username = buffer.readBytes(fieldLength).toString(CharsetUtil.US_ASCII);
54 checkpoint(State.READ_PASSWORD);
55 }
56 case READ_PASSWORD: {
57 fieldLength = buffer.readByte();
58 password = buffer.readBytes(fieldLength).toString(CharsetUtil.US_ASCII);
59 msg = new SocksAuthRequest(username, password);
60 }
61 }
62 ctx.getPipeline().remove(this);
63 return msg;
64 }
65
66 enum State {
67 CHECK_PROTOCOL_VERSION,
68 READ_USERNAME,
69 READ_PASSWORD
70 }
71 }