Class Jabber::Bytestreams::SOCKS5BytestreamsInitiator
In: lib/xmpp4r/bytestreams/helper/socks5bytestreams/initiator.rb
Parent: SOCKS5Bytestreams
Message Presence XMPPStanza Iq XMPPElement X IqQuery Error Singleton IdGenerator Connection Client Component Client Comparable JID RuntimeError ErrorException AuthenticationFailure NoNameXmlnsRegistered SOCKS5Error REXML::Element Stream SOCKS5Bytestreams SOCKS5BytestreamsTarget SOCKS5BytestreamsInitiator XMPPElement StreamHost IqSiFileRange IqSiFile StreamHostUsed IqSi IqFeature XRosterItem RosterItem XMUCUserItem XMUCUserInvite IqPubSub Items Subscription IqPubSubOwner Item Event Feature Identity Item XDataField XDataReported XDataTitle XDataInstructions IqVcard SOCKS5BytestreamsServerStreamHost TCPSocket SOCKS5Socket IqQuery IqQueryBytestreams IqQueryVersion IqQueryRoster IqQueryRPC IqQueryMUCOwner IqQueryDiscoItems IqQueryDiscoInfo IBB IBBTarget IBBInitiator Responder SimpleResponder Iq IqCommand RosterXItem XRoster RosterX X XMUCUser XMUC XDelay XData XMLRPC::ParserWriterChooseMixin Client Server XMLRPC::ParseContentType XMLRPC::BasicServer XParent MUCClient SimpleMUCClient Base DigestMD5 Plain FileSource ServiceHelper NodeHelper CallbackList Callback Semaphore StreamParser SOCKS5BytestreamsPeer SOCKS5BytestreamsServer IBBQueueItem Responder Helper MUCBrowser Helper NodeBrowser Helper lib/xmpp4r/authenticationfailure.rb lib/xmpp4r/xmppstanza.rb lib/xmpp4r/callbacks.rb lib/xmpp4r/idgenerator.rb lib/xmpp4r/connection.rb lib/xmpp4r/iq.rb lib/xmpp4r/jid.rb lib/xmpp4r/errorexception.rb lib/xmpp4r/semaphore.rb lib/xmpp4r/client.rb lib/xmpp4r/stream.rb lib/xmpp4r/x.rb lib/xmpp4r/streamparser.rb lib/xmpp4r/error.rb lib/xmpp4r/component.rb lib/xmpp4r/query.rb lib/xmpp4r/xmppelement.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/server.rb lib/xmpp4r/bytestreams/helper/socks5bytestreams/target.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 XParent lib/xmpp4r/version/iq/version.rb lib/xmpp4r/version/helper/responder.rb lib/xmpp4r/version/helper/simpleresponder.rb Version lib/xmpp4r/command/iq/command.rb lib/xmpp4r/command/helper/responder.rb Command lib/xmpp4r/feature_negotiation/iq/feature.rb FeatureNegotiation lib/xmpp4r/roster/helper/roster.rb lib/xmpp4r/roster/iq/roster.rb lib/xmpp4r/roster/x/roster.rb Roster lib/xmpp4r/rpc/helper/server.rb lib/xmpp4r/rpc/helper/client.rb lib/xmpp4r/rpc/iq/rpc.rb RPC 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/iq/mucowner.rb lib/xmpp4r/muc/helper/simplemucclient.rb MUC lib/xmpp4r/sasl.rb SASL lib/xmpp4r/bytestreams/helper/filetransfer.rb TransferSource FileTransfer lib/xmpp4r/delay/x/delay.rb Delay lib/xmpp4r/pubsub/stanzas/subscription.rb lib/xmpp4r/pubsub/helper/servicehelper.rb lib/xmpp4r/pubsub/stanzas/item.rb lib/xmpp4r/pubsub/helper/nodehelper.rb lib/xmpp4r/pubsub/iq/pubsub.rb lib/xmpp4r/pubsub/stanzas/event.rb lib/xmpp4r/pubsub/helper/nodebrowser.rb lib/xmpp4r/pubsub/stanzas/items.rb PubSub lib/xmpp4r/httpbinding/client.rb HTTPBinding 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 dot/m_81_0.png

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 12
12:       def initialize(stream, session_id, initiator_jid, target_jid)
13:         super
14:         @streamhosts = []
15:       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 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.

[Source]

    # 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.type == :result and 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:           true
58:         }
59: 
60:         @streamhost_used = nil
61:         @streamhosts.each { |sh|
62:           if peer_used.jid == sh.jid
63:             @streamhost_used = sh
64:             break
65:           end
66:         }
67:         if @streamhost_used.jid == @initiator_jid
68:           # This is our own JID, so the target chose SOCKS5BytestreamsServer
69:           @socks = @streamhost_used.server.peer_sock(stream_address)
70:           raise "Target didn't connect" unless @socks
71:           @streamhost_cbs.process(@streamhost_used, :success, nil)
72:         else
73:           begin
74:             @socks = connect_socks(@streamhost_used)
75:           rescue Exception => e
76:             Jabber::debuglog("SOCKS5 Bytestreams: #{e.class}: #{e}\n#{e.backtrace.join("\n")}")
77:             @streamhost_cbs.process(@streamhost_used, :failure, e)
78:             raise e
79:           end
80:           iq2 = Iq::new(:set, @streamhost_used.jid)
81:           iq2.add(IqQueryBytestreams.new(@session_id)).activate = @target_jid.to_s
82:           @stream.send_with_id(iq2) { |reply|
83:             reply.type == :result
84:           }
85:         end
86:       end

[Validate]