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



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

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



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

def connect_timeout
  @connect_timeout
end

#streamhost_usedObject (readonly)

[StreamHost] the SOCKS connection is using



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

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



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

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|
    reply.query.each_element { |e|
      if e.kind_of?(StreamHost)
        e.jid = reply.from  # Help misconfigured proxys
        res = e
      end
    }
  }

  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


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

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

#closeObject

Close the stream-host connection



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

def close
  @socks.close
end

#flushObject

Flush the SOCKS5 socket



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

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)



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

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



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

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