Class Jabber::Bytestreams::SOCKS5BytestreamsInitiator
In: lib/xmpp4r/bytestreams/helper/socks5bytestreams/initiator.rb
Parent: SOCKS5Bytestreams

SOCKS5Bytestreams implementation for the initiator side

Methods

add_streamhost   new   open  

Attributes

streamhosts  [R] 

Public Class methods

[Source]

    # 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

Public Instance methods

Add a streamhost which will be offered to the target

streamhost:can be:
  • [StreamHost] if already got all information (host/port)
  • [SOCKS5BytestreamsServer] if this is the local streamhost
  • [String] or [JID] if information should be automatically resolved by SOCKS5Bytestreams::query_streamhost

[Source]

    # 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.

[Source]

    # 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

[Validate]