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] |
Initialize a new peer
socket: | [TCPSocket] |
# File lib/xmpp4r/bytestreams/helper/socks5bytestreams/server.rb, line 130 130: def initialize(socket) 131: @socket = socket 132: Jabber::debuglog("SOCKS5 BytestreamsServer: accepted peer #{@socket.peeraddr[2]}:#{@socket.peeraddr[1]}") 133: end
Start handshake process
# File lib/xmpp4r/bytestreams/helper/socks5bytestreams/server.rb, line 137 137: def start 138: auth_ver = @socket.getc 139: if auth_ver != 5 140: # Unsupported version 141: @socket.close 142: return 143: end 144: 145: auth_nmethods = @socket.getc 146: auth_methods = @socket.read(auth_nmethods) 147: unless auth_methods.index("\x00") 148: # Client won't accept no authentication 149: @socket.write("\x05\xff") 150: @socket.close 151: return 152: end 153: @socket.write("\x05\x00") 154: Jabber::debuglog("SOCKS5 BytestreamsServer: peer #{@socket.peeraddr[2]}:#{@socket.peeraddr[1]} authenticated") 155: 156: req = @socket.read(4) 157: if req != "\x05\x01\x00\x03" 158: # Unknown version, command, reserved, address-type 159: @socket.close 160: return 161: end 162: req_addrlen = @socket.getc 163: req_addr = @socket.read(req_addrlen) 164: req_port = @socket.read(2) 165: if req_port != "\x00\x00" 166: # Port is not 0 167: @socket.write("\x05\x01") 168: @socket.close 169: return 170: end 171: @socket.write("\x05\x00\x00\x03#{req_addrlen.chr}#{req_addr}\x00\x00") 172: Jabber::debuglog("SOCKS5 BytestreamsServer: peer #{@socket.peeraddr[2]}:#{@socket.peeraddr[1]} connected for #{req_addr}") 173: 174: @address = req_addr 175: end