| 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