Class Jabber::Bytestreams::SOCKS5Bytestreams
In: lib/xmpp4r/bytestreams/helper/socks5bytestreams/base.rb
Parent: Object
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

SOCKS5 Bytestreams (JEP-0065) implementation

Don‘t use directly, use SOCKS5BytestreamsInitiator and SOCKS5BytestreamsTarget

Methods

Attributes

connect_timeout  [RW]  SOCKS connection timeout (for trying multiple streamhosts)

default: nil, use the OS’ default timeout

streamhost_used  [R] 
StreamHost
the SOCKS connection is using

Public Class methods

[Source]

    # File lib/xmpp4r/bytestreams/helper/socks5bytestreams/base.rb, line 30
30:       def initialize(stream, session_id, initiator_jid, target_jid)
31:         @stream = stream
32:         @session_id = session_id
33:         @initiator_jid = (initiator_jid.kind_of?(String) ? JID.new(initiator_jid) : initiator_jid)
34:         @target_jid = (target_jid.kind_of?(String) ? JID.new(target_jid) : target_jid)
35:         @socks = nil
36:         @connect_timeout = nil
37:         @streamhost_used = nil
38:         @streamhost_cbs = CallbackList.new
39:       end

Query a JID for its stream-host information

SOCKS5BytestreamsInitiator#add_streamhost can do this for you. Use this method if you plan to do multiple transfers, so you can cache the result.

stream:[Stream] to operate on
streamhost:[JID] of the proxy
my_jid:[JID] Optional sender JID for Component operation

[Source]

     # File lib/xmpp4r/bytestreams/helper/socks5bytestreams/base.rb, line 95
 95:       def self.query_streamhost(stream, streamhost, my_jid=nil)
 96:         res = nil
 97: 
 98:         iq = Iq::new(:get, streamhost)
 99:         iq.from = my_jid
100:         iq.add(IqQueryBytestreams.new)
101:         stream.send_with_id(iq) { |reply|
102:           if reply.type == :result
103:             reply.query.each_element { |e|
104:               if e.kind_of?(StreamHost)
105:                 e.jid = reply.from  # Help misconfigured proxys
106:                 res = e
107:               end
108:             }
109:           end
110:           true
111:         }
112: 
113:         if res and res.jid and res.host and res.port
114:           res
115:         else
116:           nil
117:         end
118:       end

Public Instance methods

Add a callback that will be called when there is action regarding SOCKS stream-hosts

Usage of this callback is optional and serves informational purposes only.

block takes three arguments:

  • The StreamHost instance that is currently being tried
  • State information (is either :connecting, :authenticating, :success or :failure)
  • The exception value for the state :failure, else nil

[Source]

    # File lib/xmpp4r/bytestreams/helper/socks5bytestreams/base.rb, line 51
51:       def add_streamhost_callback(priority = 0, ref = nil, &block)
52:         @streamhost_cbs.add(priority, ref, block)
53:       end

Close the stream-host connection

[Source]

    # File lib/xmpp4r/bytestreams/helper/socks5bytestreams/base.rb, line 82
82:       def close
83:         @socks.close
84:       end

Flush the SOCKS5 socket

[Source]

    # File lib/xmpp4r/bytestreams/helper/socks5bytestreams/base.rb, line 65
65:       def flush
66:         @socks.flush
67:       end

Receive from the stream-host

length:[Fixnum] Amount of bytes (Will be passed to TCPSocket#read for the underlying SOCKS5 connection)
result:[String] (or [nil] if finished)

[Source]

    # File lib/xmpp4r/bytestreams/helper/socks5bytestreams/base.rb, line 59
59:       def read(length=nil)
60:         @socks.read(length)
61:       end

Send to the stream-host

buf:[String] Data
result:[Fixnum] Amount of bytes sent

[Source]

    # File lib/xmpp4r/bytestreams/helper/socks5bytestreams/base.rb, line 73
73:       def write(buf)
74:         @socks.write(buf)
75:         # FIXME: On FreeBSD this throws Errno::EPERM after it has already written a few
76:         # kilobytes, and when there are multiple sockets. ktrace told, that this originates
77:         # from the syscall, not ruby.
78:       end

Private Instance methods

Try a streamhost

result:[SOCKS5Socket]

[Source]

     # File lib/xmpp4r/bytestreams/helper/socks5bytestreams/base.rb, line 135
135:       def connect_socks(streamhost)
136:         Timeout::timeout(@connect_timeout, Errno::ETIMEDOUT) {
137:           Jabber::debuglog("SOCKS5 Bytestreams: connecting to proxy #{streamhost.jid} (#{streamhost.host}:#{streamhost.port})")
138:           @streamhost_cbs.process(streamhost, :connecting, nil)
139:           socks = SOCKS5Socket.new(streamhost.host, streamhost.port)
140: 
141:           Jabber::debuglog("SOCKS5 Bytestreams: connected, authenticating")
142:           @streamhost_cbs.process(streamhost, :authenticating, nil)
143:           socks.auth
144: 
145:           socks.connect_domain(stream_address, 0)
146: 
147:           Jabber::debuglog("SOCKS5 Bytestreams: connected")
148:           @streamhost_cbs.process(streamhost, :success, nil)
149: 
150:           socks
151:         }
152:       end

The address the stream-host expects from us. According to JEP-0096 this is the SHA1 hash of the concatenation of session_id, initiator_jid and target_jid.

result:[String] SHA1 hash

[Source]

     # File lib/xmpp4r/bytestreams/helper/socks5bytestreams/base.rb, line 128
128:       def stream_address
129:         Digest::SHA1.hexdigest("#{@session_id}#{@initiator_jid}#{@target_jid}")
130:       end

[Validate]