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.SocksAuthRequestDecoder.State;
22 import io.netty.util.CharsetUtil;
23 import io.netty.util.internal.UnstableApi;
24
25 import java.util.List;
26
27
28
29
30
31 public class SocksAuthRequestDecoder extends ReplayingDecoder<State> {
32
33 private String username;
34
35 public SocksAuthRequestDecoder() {
36 super(State.CHECK_PROTOCOL_VERSION);
37 }
38
39 @Override
40 protected void decode(ChannelHandlerContext ctx, ByteBuf byteBuf, List<Object> out) throws Exception {
41 switch (state()) {
42 case CHECK_PROTOCOL_VERSION: {
43 if (byteBuf.readByte() != SocksSubnegotiationVersion.AUTH_PASSWORD.byteValue()) {
44 out.add(SocksCommonUtils.UNKNOWN_SOCKS_REQUEST);
45 break;
46 }
47 checkpoint(State.READ_USERNAME);
48 }
49 case READ_USERNAME: {
50 int fieldLength = byteBuf.readByte();
51 username = byteBuf.readString(fieldLength, CharsetUtil.US_ASCII);
52 checkpoint(State.READ_PASSWORD);
53 }
54 case READ_PASSWORD: {
55 int fieldLength = byteBuf.readByte();
56 String password = byteBuf.readString(fieldLength, CharsetUtil.US_ASCII);
57 out.add(new SocksAuthRequest(username, password));
58 break;
59 }
60 default: {
61 throw new Error();
62 }
63 }
64 ctx.pipeline().remove(this);
65 }
66
67 @UnstableApi
68 public enum State {
69 CHECK_PROTOCOL_VERSION,
70 READ_USERNAME,
71 READ_PASSWORD
72 }
73 }