Class: Jabber::Bytestreams::SOCKS5Bytestreams

Inherits:
Object
  • Object
show all
Defined in:
lib/xmpp4r/bytestreams/helper/socks5bytestreams/base.rb

Overview

SOCKS5 Bytestreams (JEP-0065) implementation

Don’t use directly, use SOCKS5BytestreamsInitiator and SOCKS5BytestreamsTarget

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(stream, session_id, initiator_jid, target_jid) ⇒ SOCKS5Bytestreams

Returns a new instance of SOCKS5Bytestreams.



26
27
28
29
30
31
32
33
34
35
# File 'lib/xmpp4r/bytestreams/helper/socks5bytestreams/base.rb', line 26

def initialize(stream, session_id, initiator_jid, target_jid)
  @stream = stream
  @session_id = session_id
  @initiator_jid = (initiator_jid.kind_of?(String) ? JID.new(initiator_jid) : initiator_jid)
  @target_jid = (target_jid.kind_of?(String) ? JID.new(target_jid) : target_jid)
  @socks = nil
  @connect_timeout = nil
  @streamhost_used = nil
  @streamhost_cbs = CallbackList.new
end

Instance Attribute Details

#connect_timeoutObject

SOCKS connection timeout (for trying multiple streamhosts)

default: nil, use the OS’ default timeout



24
25
26
# File 'lib/xmpp4r/bytestreams/helper/socks5bytestreams/base.rb', line 24

def connect_timeout
  @connect_timeout
end

#streamhost_usedObject (readonly)

StreamHost

the SOCKS connection is using



18
19
20
# File 'lib/xmpp4r/bytestreams/helper/socks5bytestreams/base.rb', line 18

def streamhost_used
  @streamhost_used
end

Class Method Details

.query_streamhost(stream, streamhost, my_jid = nil) ⇒ Object

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



91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
# File 'lib/xmpp4r/bytestreams/helper/socks5bytestreams/base.rb', line 91

def self.query_streamhost(stream, streamhost, my_jid=nil)
  res = nil

  iq = Iq::new(:get, streamhost)
  iq.from = my_jid
  iq.add(IqQueryBytestreams.new)
  stream.send_with_id(iq) { |reply|
    if reply.type == :result
      reply.query.each_element { |e|
        if e.kind_of?(StreamHost)
          e.jid = reply.from  # Help misconfigured proxys
          res = e
        end
      }
    end
    true
  }

  if res and res.jid and res.host and res.port
    res
  else
    nil
  end
end

Instance Method Details

#add_streamhost_callback(priority = 0, ref = nil, &block) ⇒ Object

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



47
48
49
# File 'lib/xmpp4r/bytestreams/helper/socks5bytestreams/base.rb', line 47

def add_streamhost_callback(priority = 0, ref = nil, &block)
  @streamhost_cbs.add(priority, ref, block)
end

#closeObject

Close the stream-host connection



78
79
80
# File 'lib/xmpp4r/bytestreams/helper/socks5bytestreams/base.rb', line 78

def close
  @socks.close
end

#flushObject

Flush the SOCKS5 socket



61
62
63
# File 'lib/xmpp4r/bytestreams/helper/socks5bytestreams/base.rb', line 61

def flush
  @socks.flush
end

#read(length = nil) ⇒ Object

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)



55
56
57
# File 'lib/xmpp4r/bytestreams/helper/socks5bytestreams/base.rb', line 55

def read(length=nil)
  @socks.read(length)
end

#write(buf) ⇒ Object

Send to the stream-host

buf
String

Data

result
Fixnum

Amount of bytes sent



69
70
71
72
73
74
# File 'lib/xmpp4r/bytestreams/helper/socks5bytestreams/base.rb', line 69

def write(buf)
  @socks.write(buf)
  # FIXME: On FreeBSD this throws Errno::EPERM after it has already written a few
  # kilobytes, and when there are multiple sockets. ktrace told, that this originates
  # from the syscall, not ruby.
end