Class | Jabber::Bytestreams::SOCKS5Bytestreams |
In: |
lib/xmpp4r/bytestreams/helper/socks5bytestreams/base.rb
|
Parent: | Object |
SOCKS5 Bytestreams (JEP-0065) implementation
Don‘t use directly, use SOCKS5BytestreamsInitiator and SOCKS5BytestreamsTarget
connect_timeout | [RW] |
SOCKS connection timeout (for trying multiple streamhosts)
default: nil, use the OS’ default timeout |
streamhost_used | [R] |
|
# File lib/xmpp4r/bytestreams/helper/socks5bytestreams/base.rb, line 30 30: def initialize(stream, session_id, initiator_jid, target_jid) 31: @stream = stream 32: @session_id = session_id 33: @initiator_jid = (initiator_jid.kind_of?(String) ? JID.new(initiator_jid) : initiator_jid) 34: @target_jid = (target_jid.kind_of?(String) ? JID.new(target_jid) : target_jid) 35: @socks = nil 36: @connect_timeout = nil 37: @streamhost_used = nil 38: @streamhost_cbs = CallbackList.new 39: end
Query a JID for its stream-host information
SOCKS5BytestreamsInitiator#add_streamhost can do this for you. Use this method if you plan to do multiple transfers, so you can cache the result.
stream: | [Stream] to operate on |
streamhost: | [JID] of the proxy |
my_jid: | [JID] Optional sender JID for Component operation |
# File lib/xmpp4r/bytestreams/helper/socks5bytestreams/base.rb, line 95 95: def self.query_streamhost(stream, streamhost, my_jid=nil) 96: res = nil 97: 98: iq = Iq::new(:get, streamhost) 99: iq.from = my_jid 100: iq.add(IqQueryBytestreams.new) 101: stream.send_with_id(iq) { |reply| 102: if reply.type == :result 103: reply.query.each_element { |e| 104: if e.kind_of?(StreamHost) 105: e.jid = reply.from # Help misconfigured proxys 106: res = e 107: end 108: } 109: end 110: true 111: } 112: 113: if res and res.jid and res.host and res.port 114: res 115: else 116: nil 117: end 118: end
Add a callback that will be called when there is action regarding SOCKS stream-hosts
Usage of this callback is optional and serves informational purposes only.
block takes three arguments:
# File lib/xmpp4r/bytestreams/helper/socks5bytestreams/base.rb, line 51 51: def add_streamhost_callback(priority = 0, ref = nil, &block) 52: @streamhost_cbs.add(priority, ref, block) 53: end
Close the stream-host connection
# File lib/xmpp4r/bytestreams/helper/socks5bytestreams/base.rb, line 82 82: def close 83: @socks.close 84: end
Flush the SOCKS5 socket
# File lib/xmpp4r/bytestreams/helper/socks5bytestreams/base.rb, line 65 65: def flush 66: @socks.flush 67: end
Receive from the stream-host
length: | [Fixnum] Amount of bytes (Will be passed to TCPSocket#read for the underlying SOCKS5 connection) |
result: | [String] (or [nil] if finished) |
# File lib/xmpp4r/bytestreams/helper/socks5bytestreams/base.rb, line 59 59: def read(length=nil) 60: @socks.read(length) 61: end
Send to the stream-host
buf: | [String] Data |
result: | [Fixnum] Amount of bytes sent |
# File lib/xmpp4r/bytestreams/helper/socks5bytestreams/base.rb, line 73 73: def write(buf) 74: @socks.write(buf) 75: # FIXME: On FreeBSD this throws Errno::EPERM after it has already written a few 76: # kilobytes, and when there are multiple sockets. ktrace told, that this originates 77: # from the syscall, not ruby. 78: end
Try a streamhost
result: | [SOCKS5Socket] |
# File lib/xmpp4r/bytestreams/helper/socks5bytestreams/base.rb, line 135 135: def connect_socks(streamhost) 136: Timeout::timeout(@connect_timeout, Errno::ETIMEDOUT) { 137: Jabber::debuglog("SOCKS5 Bytestreams: connecting to proxy #{streamhost.jid} (#{streamhost.host}:#{streamhost.port})") 138: @streamhost_cbs.process(streamhost, :connecting, nil) 139: socks = SOCKS5Socket.new(streamhost.host, streamhost.port) 140: 141: Jabber::debuglog("SOCKS5 Bytestreams: connected, authenticating") 142: @streamhost_cbs.process(streamhost, :authenticating, nil) 143: socks.auth 144: 145: socks.connect_domain(stream_address, 0) 146: 147: Jabber::debuglog("SOCKS5 Bytestreams: connected") 148: @streamhost_cbs.process(streamhost, :success, nil) 149: 150: socks 151: } 152: end
The address the stream-host expects from us. According to JEP-0096 this is the SHA1 hash of the concatenation of session_id, initiator_jid and target_jid.
result: | [String] SHA1 hash |
# File lib/xmpp4r/bytestreams/helper/socks5bytestreams/base.rb, line 128 128: def stream_address 129: Digest::SHA1.hexdigest("#{@session_id}#{@initiator_jid}#{@target_jid}") 130: end