Decode parses SOCKS protocol from the stream.
()
| 74 | |
| 75 | // Decode parses SOCKS protocol from the stream. |
| 76 | func (s *socksReader) Decode() { |
| 77 | if Decoder.Writer == nil { |
| 78 | socksLog.Error("SOCKS Decoder.Writer is nil") |
| 79 | return |
| 80 | } |
| 81 | |
| 82 | var clientBuf, serverBuf bytes.Buffer |
| 83 | |
| 84 | for _, d := range s.conversation.Data { |
| 85 | if d.Direction() == reassembly.TCPDirClientToServer { |
| 86 | clientBuf.Write(d.Raw()) |
| 87 | } else { |
| 88 | serverBuf.Write(d.Raw()) |
| 89 | } |
| 90 | } |
| 91 | |
| 92 | clientData := clientBuf.Bytes() |
| 93 | serverData := serverBuf.Bytes() |
| 94 | |
| 95 | if len(clientData) == 0 { |
| 96 | return |
| 97 | } |
| 98 | |
| 99 | version := clientData[0] |
| 100 | |
| 101 | var msg *types.SOCKS |
| 102 | switch version { |
| 103 | case SOCKS5: |
| 104 | msg = s.parseSOCKS5(clientData, serverData) |
| 105 | case SOCKS4: |
| 106 | msg = s.parseSOCKS4(clientData, serverData) |
| 107 | } |
| 108 | |
| 109 | if msg != nil { |
| 110 | msg.SrcIP = s.conversation.ClientIP |
| 111 | msg.DstIP = s.conversation.ServerIP |
| 112 | msg.SrcPort = int32(s.conversation.ClientPort) |
| 113 | msg.DstPort = int32(s.conversation.ServerPort) |
| 114 | msg.CommunityID = s.conversation.CommunityID |
| 115 | |
| 116 | err := Decoder.Writer.Write(msg) |
| 117 | if err != nil { |
| 118 | socksLog.Error("failed to write SOCKS record", zap.Error(err)) |
| 119 | } else { |
| 120 | atomic.AddInt64(&Decoder.NumRecordsWritten, 1) |
| 121 | } |
| 122 | } |
| 123 | } |
| 124 | |
| 125 | func (s *socksReader) parseSOCKS5(clientData, serverData []byte) *types.SOCKS { |
| 126 | msg := &types.SOCKS{ |
nothing calls this directly
no test coverage detected