Class | Jabber::Bytestreams::SOCKS5BytestreamsInitiator |
In: |
lib/xmpp4r/bytestreams/helper/socks5bytestreams/initiator.rb
|
Parent: | SOCKS5Bytestreams |
SOCKS5Bytestreams implementation for the initiator side
streamhosts | [R] |
# File lib/xmpp4r/bytestreams/helper/socks5bytestreams/initiator.rb, line 8 8: def initialize(stream, session_id, initiator_jid, target_jid) 9: super 10: @streamhosts = [] 11: end
Add a streamhost which will be offered to the target
streamhost: | can be: |
# File lib/xmpp4r/bytestreams/helper/socks5bytestreams/initiator.rb, line 20 20: def add_streamhost(streamhost) 21: if streamhost.kind_of?(StreamHost) 22: @streamhosts << streamhost 23: elsif streamhost.kind_of?(SOCKS5BytestreamsServer) 24: streamhost.each_streamhost(@initiator_jid) { |sh| 25: @streamhosts << sh 26: } 27: elsif streamhost.kind_of?(String) or streamhost.kind_of?(JID) 28: @streamhosts << SOCKS5Bytestreams::query_streamhost(@stream, streamhost, @initiator_jid) 29: else 30: raise "Unknwon streamhost type: #{streamhost.class}" 31: end 32: end
Send the configured streamhosts to the target, wait for an answer and connect to the host the target chose.
# File lib/xmpp4r/bytestreams/helper/socks5bytestreams/initiator.rb, line 38 38: def open 39: iq1 = Iq::new(:set, @target_jid) 40: iq1.from = @initiator_jid 41: bs = iq1.add IqQueryBytestreams.new(@session_id) 42: @streamhosts.each { |se| 43: bs.add(se) 44: } 45: 46: peer_used = nil 47: @stream.send_with_id(iq1) { |response| 48: if response.type == :result and response.query.kind_of?(IqQueryBytestreams) 49: peer_used = response.query.streamhost_used 50: raise "No streamhost-used" unless peer_used 51: raise "Invalid streamhost-used" unless peer_used.jid 52: end 53: true 54: } 55: 56: @streamhost_used = nil 57: @streamhosts.each { |sh| 58: if peer_used.jid == sh.jid 59: @streamhost_used = sh 60: break 61: end 62: } 63: if @streamhost_used.jid == @initiator_jid 64: # This is our own JID, so the target chose SOCKS5BytestreamsServer 65: @socks = @streamhost_used.server.peer_sock(stream_address) 66: raise "Target didn't connect" unless @socks 67: @streamhost_cbs.process(@streamhost_used, :success, nil) 68: else 69: begin 70: @socks = connect_socks(@streamhost_used) 71: rescue Exception => e 72: Jabber::debuglog("SOCKS5 Bytestreams: #{e.class}: #{e}\n#{e.backtrace.join("\n")}") 73: @streamhost_cbs.process(@streamhost_used, :failure, e) 74: raise e 75: end 76: iq2 = Iq::new(:set, @streamhost_used.jid) 77: iq2.add(IqQueryBytestreams.new(@session_id)).activate = @target_jid.to_s 78: @stream.send_with_id(iq2) { |reply| 79: reply.type == :result 80: } 81: end 82: end