Class Jabber::Bytestreams::SOCKS5Bytestreams
In: lib/xmpp4r/bytestreams/helper/socks5bytestreams/base.rb
Parent: Object
Message Presence XMPPStanza Iq XMPPElement ErrorResponse X IqQuery JabberError ComponentAuthenticationFailure ArgumentError SOCKS5Error ServerError NoNameXmlnsRegistered ClientAuthenticationFailure Connection Client Component Client Singleton IdGenerator Comparable JID StandardError REXML::Element Stream IqQuery IqQueryVersion IqQueryRoster IqQueryBytestreams IqQueryRPC IqQueryMUCOwner IqQueryMUCAdmin IqQueryDiscoItems IqQueryDiscoInfo Responder SimpleResponder XRosterItem RosterXItem XMPPElement RosterItem IqFeature StreamHost IqSiFile IqSiFileRange IqSi StreamHostUsed C Body HTML UserItem XMUCUserInvite Tune Configuration Items Item IqPubSub Publish Event IqPubSubOwner Subscription Unsubscribe Feature Item Identity XDataField XDataReported XDataTitle XDataInstructions IqVcard XRoster RosterX X XMUC XMUCUser XDelay XData Iq IqCommand SOCKS5Bytestreams SOCKS5BytestreamsTarget SOCKS5BytestreamsInitiator SOCKS5BytestreamsServerStreamHost TCPSocket SOCKS5Socket IBB IBBTarget IBBInitiator XMLRPC::ParserWriterChooseMixin Client Server XMLRPC::ParseContentType XMLRPC::BasicServer MUCClient SimpleMUCClient MUC::UserItem XMUCUserItem IqQueryMUCAdminItem XParent Base Anonymous DigestMD5 Plain PubSub::ServiceHelper Helper SubscriptionConfig NodeConfig OwnerNodeConfig EventItems EventItem ServiceHelper NodeHelper FileSource Base Bot CallbackList Callback StreamParser Semaphore Helper Responder SOCKS5BytestreamsPeer SOCKS5BytestreamsServer IBBQueueItem Helper MUCBrowser NodeBrowser Responder Helper Helper lib/xmpp4r/message.rb lib/xmpp4r/connection.rb lib/xmpp4r/xmppstanza.rb lib/xmpp4r/iq.rb lib/xmpp4r/callbacks.rb lib/xmpp4r/idgenerator.rb lib/xmpp4r/stream.rb lib/xmpp4r/client.rb lib/xmpp4r/jid.rb lib/xmpp4r/x.rb lib/xmpp4r/streamparser.rb lib/xmpp4r/semaphore.rb lib/xmpp4r/errors.rb lib/xmpp4r/component.rb lib/xmpp4r/presence.rb lib/xmpp4r/xmppelement.rb lib/xmpp4r/query.rb XParent lib/xmpp4r/version/helper/responder.rb lib/xmpp4r/version/helper/simpleresponder.rb lib/xmpp4r/version/iq/version.rb Version lib/xmpp4r/roster/x/roster.rb lib/xmpp4r/roster/helper/roster.rb lib/xmpp4r/roster/iq/roster.rb Roster lib/xmpp4r/feature_negotiation/iq/feature.rb FeatureNegotiation lib/xmpp4r/command/iq/command.rb lib/xmpp4r/command/helper/responder.rb Command lib/xmpp4r/bytestreams/iq/si.rb lib/xmpp4r/bytestreams/helper/ibb/initiator.rb lib/xmpp4r/bytestreams/helper/socks5bytestreams/base.rb lib/xmpp4r/bytestreams/iq/bytestreams.rb lib/xmpp4r/bytestreams/helper/socks5bytestreams/initiator.rb lib/xmpp4r/bytestreams/helper/socks5bytestreams/target.rb lib/xmpp4r/bytestreams/helper/socks5bytestreams/socks5.rb lib/xmpp4r/bytestreams/helper/ibb/target.rb lib/xmpp4r/bytestreams/helper/socks5bytestreams/server.rb lib/xmpp4r/bytestreams/helper/ibb/base.rb Bytestreams lib/xmpp4r/caps/helper/helper.rb lib/xmpp4r/caps/c.rb Caps lib/xmpp4r/xhtml/html.rb XHTML lib/xmpp4r/rpc/helper/server.rb lib/xmpp4r/rpc/helper/client.rb lib/xmpp4r/rpc/iq/rpc.rb RPC lib/xmpp4r/muc/iq/mucadminitem.rb lib/xmpp4r/muc/x/muc.rb lib/xmpp4r/muc/item.rb lib/xmpp4r/muc/helper/simplemucclient.rb lib/xmpp4r/muc/iq/mucadmin.rb lib/xmpp4r/muc/helper/mucbrowser.rb lib/xmpp4r/muc/x/mucuseritem.rb lib/xmpp4r/muc/x/mucuserinvite.rb lib/xmpp4r/muc/iq/mucowner.rb lib/xmpp4r/muc/helper/mucclient.rb MUC lib/xmpp4r/delay/x/delay.rb Delay lib/xmpp4r/sasl.rb SASL lib/xmpp4r/tune/helper/helper.rb lib/xmpp4r/tune/tune.rb UserTune lib/xmpp4r/pubsub/children/item.rb lib/xmpp4r/pubsub/children/configuration.rb lib/xmpp4r/pubsub/children/subscription.rb lib/xmpp4r/pubsub/helper/servicehelper.rb lib/xmpp4r/pubsub/children/unsubscribe.rb lib/xmpp4r/pubsub/children/publish.rb lib/xmpp4r/pubsub/children/event.rb lib/xmpp4r/pubsub/iq/pubsub.rb lib/xmpp4r/pubsub/helper/nodebrowser.rb lib/xmpp4r/pubsub/helper/nodehelper.rb lib/xmpp4r/pubsub/children/items.rb lib/xmpp4r/pubsub/children/subscription_config.rb lib/xmpp4r/pubsub/children/node_config.rb PubSub lib/xmpp4r/httpbinding/client.rb HTTPBinding lib/xmpp4r/discovery/iq/discoinfo.rb lib/xmpp4r/discovery/helper/responder.rb lib/xmpp4r/discovery/iq/discoitems.rb Discovery lib/xmpp4r/dataforms/x/data.rb Dataforms lib/xmpp4r/bytestreams/helper/filetransfer.rb TransferSource FileTransfer lib/xmpp4r/vcard/helper/vcard.rb lib/xmpp4r/vcard/iq/vcard.rb Vcard lib/xmpp4r/framework/base.rb lib/xmpp4r/framework/bot.rb Framework Jabber dot/m_99_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:           reply.query.each_element { |e|
103:             if e.kind_of?(StreamHost)
104:               e.jid = reply.from  # Help misconfigured proxys
105:               res = e
106:             end
107:           }
108:         }
109: 
110:         if res and res.jid and res.host and res.port
111:           res
112:         else
113:           nil
114:         end
115:       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 132
132:       def connect_socks(streamhost)
133:         Timeout::timeout(@connect_timeout, Errno::ETIMEDOUT) {
134:           Jabber::debuglog("SOCKS5 Bytestreams: connecting to proxy #{streamhost.jid} (#{streamhost.host}:#{streamhost.port})")
135:           @streamhost_cbs.process(streamhost, :connecting, nil)
136:           socks = SOCKS5Socket.new(streamhost.host, streamhost.port)
137: 
138:           Jabber::debuglog("SOCKS5 Bytestreams: connected, authenticating")
139:           @streamhost_cbs.process(streamhost, :authenticating, nil)
140:           socks.auth
141: 
142:           socks.connect_domain(stream_address, 0)
143: 
144:           Jabber::debuglog("SOCKS5 Bytestreams: connected")
145:           @streamhost_cbs.process(streamhost, :success, nil)
146: 
147:           socks
148:         }
149:       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 125
125:       def stream_address
126:         Digest::SHA1.hexdigest("#{@session_id}#{@initiator_jid}#{@target_jid}")
127:       end

[Validate]