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