Class Jabber::Bytestreams::SOCKS5BytestreamsInitiator
In: lib/xmpp4r/bytestreams/helper/socks5bytestreams/initiator.rb
Parent: SOCKS5Bytestreams
XMLStanza Message Presence Iq REXML::Element X IqQuery Error StreamHost IqSiFileRange IqSiFile StreamHostUsed IqSi XRosterItem RosterItem IqFeature XMUCUserItem XMUCUserInvite Feature Identity Item XDataField XDataReported XDataTitle XDataInstructions IqVcard Singleton IdGenerator Connection Client Component Comparable JID RuntimeError ErrorException AuthenticationFailure SOCKS5Error Stream SOCKS5Bytestreams SOCKS5BytestreamsTarget SOCKS5BytestreamsInitiator SOCKS5BytestreamsServerStreamHost TCPSocket SOCKS5Socket IqQuery IqQueryBytestreams IqQueryVersion IqQueryRoster IqQueryDiscoItems IqQueryDiscoInfo IBB IBBTarget IBBInitiator Responder SimpleResponder X XRoster XMUCUser XMUC XDelay XData MUCClient SimpleMUCClient Base DigestMD5 Plain FileSource StreamParser SOCKS5BytestreamsPeer SOCKS5BytestreamsServer IBBQueueItem Helper MUCBrowser Helper Helper lib/xmpp4r/authenticationfailure.rb lib/xmpp4r/idgenerator.rb lib/xmpp4r/connection.rb lib/xmpp4r/iq.rb lib/xmpp4r/jid.rb lib/xmpp4r/xmlstanza.rb lib/xmpp4r/errorexception.rb lib/xmpp4r/stream.rb lib/xmpp4r/client.rb lib/xmpp4r/streamparser.rb lib/xmpp4r/x.rb lib/xmpp4r/error.rb lib/xmpp4r/component.rb lib/xmpp4r/query.rb lib/xmpp4r/message.rb lib/xmpp4r/presence.rb lib/xmpp4r/bytestreams/helper/ibb/initiator.rb lib/xmpp4r/bytestreams/iq/si.rb lib/xmpp4r/bytestreams/iq/bytestreams.rb lib/xmpp4r/bytestreams/helper/socks5bytestreams/base.rb lib/xmpp4r/bytestreams/helper/socks5bytestreams/target.rb lib/xmpp4r/bytestreams/helper/socks5bytestreams/server.rb lib/xmpp4r/bytestreams/helper/socks5bytestreams/socks5.rb lib/xmpp4r/bytestreams/helper/socks5bytestreams/initiator.rb lib/xmpp4r/bytestreams/helper/ibb/base.rb lib/xmpp4r/bytestreams/helper/ibb/target.rb Bytestreams lib/xmpp4r/version/iq/version.rb lib/xmpp4r/version/helper/responder.rb lib/xmpp4r/version/helper/simpleresponder.rb Version lib/xmpp4r/roster/helper/roster.rb lib/xmpp4r/roster/iq/roster.rb lib/xmpp4r/roster/x/roster.rb Roster lib/xmpp4r/feature_negotiation/iq/feature.rb FeatureNegotiation lib/xmpp4r/muc/x/muc.rb lib/xmpp4r/muc/helper/mucclient.rb lib/xmpp4r/muc/x/mucuseritem.rb lib/xmpp4r/muc/helper/mucbrowser.rb lib/xmpp4r/muc/x/mucuserinvite.rb lib/xmpp4r/muc/helper/simplemucclient.rb MUC lib/xmpp4r/sasl.rb SASL lib/xmpp4r/delay/x/delay.rb Delay lib/xmpp4r/bytestreams/helper/filetransfer.rb TransferSource FileTransfer lib/xmpp4r/discovery/iq/discoinfo.rb lib/xmpp4r/discovery/iq/discoitems.rb Discovery lib/xmpp4r/dataforms/x/data.rb Dataforms lib/xmpp4r/vcard/helper/vcard.rb lib/xmpp4r/vcard/iq/vcard.rb Vcard Jabber Module: Jabber

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]