Class Jabber::Bytestreams::SOCKS5BytestreamsInitiator
In: lib/xmpp4r/bytestreams/helper/socks5bytestreams/initiator.rb
Parent: SOCKS5Bytestreams
Message Presence XMPPStanza Iq Singleton IdGenerator XMPPElement X IqQuery Error Connection Client Component Client Comparable JID RuntimeError AuthenticationFailure ErrorException NoNameXmlnsRegistered SOCKS5Error REXML::Element Stream SOCKS5Bytestreams SOCKS5BytestreamsTarget SOCKS5BytestreamsInitiator XMPPElement StreamHost IqSiFileRange IqSiFile StreamHostUsed IqSi XRosterItem RosterItem IqFeature XMUCUserItem XMUCUserInvite IqPubSub Items Subscription IqPubSubOwner Item Event Feature Item Identity XDataField XDataReported XDataTitle XDataInstructions IqVcard SOCKS5BytestreamsServerStreamHost TCPSocket SOCKS5Socket IqQuery IqQueryBytestreams IqQueryVersion IqQueryRoster IqQueryMUCOwner IqQueryRPC IqQueryDiscoItems IqQueryDiscoInfo IBB IBBTarget IBBInitiator Responder SimpleResponder Iq IqCommand RosterXItem XRoster RosterX X XMUCUser XMUC XDelay XData XParent MUCClient SimpleMUCClient XMLRPC::ParserWriterChooseMixin Client Server XMLRPC::ParseContentType XMLRPC::BasicServer Base DigestMD5 Plain ServiceHelper NodeHelper FileSource CallbackList Callback Semaphore StreamParser SOCKS5BytestreamsPeer SOCKS5BytestreamsServer IBBQueueItem Responder Helper MUCBrowser NodeBrowser Helper 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/client.rb lib/xmpp4r/stream.rb lib/xmpp4r/semaphore.rb lib/xmpp4r/streamparser.rb lib/xmpp4r/x.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/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/iq/mucowner.rb lib/xmpp4r/muc/helper/simplemucclient.rb MUC lib/xmpp4r/rpc/helper/server.rb lib/xmpp4r/rpc/helper/client.rb lib/xmpp4r/rpc/iq/rpc.rb RPC lib/xmpp4r/sasl.rb SASL 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/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 dot/m_80_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]