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



30
31
32
33
34
35
36
37
38
39
# File 'lib/xmpp4r/bytestreams/helper/socks5bytestreams/base.rb', line 30

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



28
29
30
# File 'lib/xmpp4r/bytestreams/helper/socks5bytestreams/base.rb', line 28

def connect_timeout
  @connect_timeout
end

#streamhost_usedObject (readonly)

StreamHost

the SOCKS connection is using



22
23
24
# File 'lib/xmpp4r/bytestreams/helper/socks5bytestreams/base.rb', line 22

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



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

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



51
52
53
# File 'lib/xmpp4r/bytestreams/helper/socks5bytestreams/base.rb', line 51

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

#closeObject

Close the stream-host connection



82
83
84
# File 'lib/xmpp4r/bytestreams/helper/socks5bytestreams/base.rb', line 82

def close
  @socks.close
end

#flushObject

Flush the SOCKS5 socket



65
66
67
# File 'lib/xmpp4r/bytestreams/helper/socks5bytestreams/base.rb', line 65

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)



59
60
61
# File 'lib/xmpp4r/bytestreams/helper/socks5bytestreams/base.rb', line 59

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



73
74
75
76
77
78
# File 'lib/xmpp4r/bytestreams/helper/socks5bytestreams/base.rb', line 73

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