| Class | Jabber::Bytestreams::SOCKS5BytestreamsPeer |
| In: |
lib/xmpp4r/bytestreams/helper/socks5bytestreams/server.rb
|
| Parent: | Object |
This class will be instantiated by SOCKS5BytestreamsServer upon accepting a new connection
| address | [R] | |
| socket | [R] |
Start handshake process
# File lib/xmpp4r/bytestreams/helper/socks5bytestreams/server.rb, line 153
153: def start
154: if !@socket.respond_to? :getbyte
155: class << @socket; alias getbyte getc; end
156: end
157:
158: auth_ver = @socket.getbyte
159: if auth_ver != 5
160: # Unsupported version
161: @socket.close
162: return
163: end
164:
165: auth_nmethods = @socket.getbyte
166: auth_methods = @socket.read(auth_nmethods)
167: unless auth_methods.index("\x00")
168: # Client won't accept no authentication
169: @socket.write("\x05\xff")
170: @socket.close
171: return
172: end
173: @socket.write("\x05\x00")
174: Jabber::debuglog("SOCKS5 BytestreamsServer: peer #{@socket.peeraddr[2]}:#{@socket.peeraddr[1]} authenticated")
175:
176: req = @socket.read(4)
177: if req != "\x05\x01\x00\x03"
178: # Unknown version, command, reserved, address-type
179: @socket.close
180: return
181: end
182: req_addrlen = @socket.getbyte
183: req_addr = @socket.read(req_addrlen)
184: req_port = @socket.read(2)
185: if req_port != "\x00\x00"
186: # Port is not 0
187: @socket.write("\x05\x01")
188: @socket.close
189: return
190: end
191: @socket.write("\x05\x00\x00\x03#{req_addrlen.chr}#{req_addr}\x00\x00")
192: Jabber::debuglog("SOCKS5 BytestreamsServer: peer #{@socket.peeraddr[2]}:#{@socket.peeraddr[1]} connected for #{req_addr}")
193:
194: @address = req_addr
195: end