Class: Jabber::Bytestreams::SOCKS5Socket

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

Overview

A SOCKS5 client implementation

==Usage:

  • Initialize with proxy's address and port
  • Authenticate
  • Connect to target host

Instance Method Summary collapse

Constructor Details

#initialize(socks_host, socks_port) ⇒ SOCKS5Socket

Connect to SOCKS5 proxy



20
21
22
# File 'lib/xmpp4r/bytestreams/helper/socks5bytestreams/socks5.rb', line 20

def initialize(socks_host, socks_port)
  super(socks_host, socks_port)
end

Instance Method Details

#authObject

Authenticate for SOCKS5 proxy

Currently supports only 'no authentication required'



28
29
30
31
32
33
34
35
36
37
# File 'lib/xmpp4r/bytestreams/helper/socks5bytestreams/socks5.rb', line 28

def auth
  write("\x05\x01\x00")
  buf = read(2)
  if buf.nil? or buf != "\x05\x00"
    close
    raise SOCKS5Error.new("Invalid SOCKS5 authentication: #{buf.inspect}")
  end

  self
end

#connect_domain(domain, port) ⇒ Object

Issue a CONNECT request to a host name which is to be resolved by the proxy.

domain

[String] Host name

port

[Fixnum] Port number



44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
# File 'lib/xmpp4r/bytestreams/helper/socks5bytestreams/socks5.rb', line 44

def connect_domain(domain, port)
  write("\x05\x01\x00\x03#{domain.size.chr}#{domain}#{[port].pack("n")}")
  buf = read(4)
  if buf.nil? or buf[0..1] != "\005\000"
    close
    raise SOCKS5Error.new("Invalid SOCKS5 connect: #{buf.inspect}")
  end

  case buf.respond_to?(:bytes) ? buf.bytes.to_a[3] : buf[3]
    when 1 then read(6)  # IPv4 addr
    when 3 then read(3 + domain.size) # Domain
    when 4 then read(18) # IPv6 addr
    else
      close
      raise SOCKS5Error.new("Invalid SOCKS5 address type #{buf[3].to_s}")
  end

  self
end