Class: TCPSocket
- Inherits:
-
Object
- Object
- TCPSocket
- Defined in:
- lib/socksify.rb
Class Method Summary collapse
- .socks_ignores ⇒ Object
- .socks_ignores=(ignores) ⇒ Object
- .socks_port ⇒ Object
- .socks_port=(port) ⇒ Object
- .socks_server ⇒ Object
- .socks_server=(host) ⇒ Object
- .socks_version ⇒ Object
- .socks_version=(version) ⇒ Object
Instance Method Summary collapse
- #initialize(host = nil, port = 0, local_host = "0.0.0.0", local_port = 0) ⇒ TCPSocket constructor
- #initialize_tcp ⇒ Object
-
#socks_authenticate ⇒ Object
Authentication.
-
#socks_connect(host, port) ⇒ Object
Connect.
-
#socks_receive_reply ⇒ Object
returns [bind_addr: String, bind_port: Fixnum].
Constructor Details
#initialize(host = nil, port = 0, local_host = "0.0.0.0", local_port = 0) ⇒ TCPSocket
124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 |
# File 'lib/socksify.rb', line 124 def initialize(host=nil, port=0, local_host="0.0.0.0", local_port=0) socks_server = self.class.socks_server socks_port = self.class.socks_port socks_ignores = self.class.socks_ignores if socks_server and socks_port and not socks_ignores.include?(host) Socksify::debug_notice "Connecting to SOCKS server #{socks_server}:#{socks_port}" initialize_tcp socks_server, socks_port socks_authenticate unless @@socks_version =~ /^4/ if host socks_connect(host, port) end else Socksify::debug_notice "Connecting directly to #{host}:#{port}" initialize_tcp host, port, local_host, local_port Socksify::debug_debug "Connected to #{host}:#{port}" end end |
Class Method Details
.socks_ignores ⇒ Object
114 115 116 |
# File 'lib/socksify.rb', line 114 def self.socks_ignores @@socks_ignores ||= [] end |
.socks_ignores=(ignores) ⇒ Object
117 118 119 |
# File 'lib/socksify.rb', line 117 def self.socks_ignores=(ignores) @@socks_ignores = ignores end |
.socks_port ⇒ Object
108 109 110 |
# File 'lib/socksify.rb', line 108 def self.socks_port @@socks_port ||= nil end |
.socks_port=(port) ⇒ Object
111 112 113 |
# File 'lib/socksify.rb', line 111 def self.socks_port=(port) @@socks_port = port end |
.socks_server ⇒ Object
102 103 104 |
# File 'lib/socksify.rb', line 102 def self.socks_server @@socks_server ||= nil end |
.socks_server=(host) ⇒ Object
105 106 107 |
# File 'lib/socksify.rb', line 105 def self.socks_server=(host) @@socks_server = host end |
.socks_version ⇒ Object
96 97 98 |
# File 'lib/socksify.rb', line 96 def self.socks_version (@@socks_version == "4a" or @@socks_version == "4") ? "\004" : "\005" end |
.socks_version=(version) ⇒ Object
99 100 101 |
# File 'lib/socksify.rb', line 99 def self.socks_version=(version) @@socks_version = version.to_s end |
Instance Method Details
#initialize_tcp ⇒ Object
121 |
# File 'lib/socksify.rb', line 121 alias :initialize_tcp :initialize |
#socks_authenticate ⇒ Object
Authentication
146 147 148 149 150 151 152 153 154 155 156 157 |
# File 'lib/socksify.rb', line 146 def socks_authenticate Socksify::debug_debug "Sending no authentication" write "\005\001\000" Socksify::debug_debug "Waiting for authentication reply" auth_reply = recv(2) if auth_reply[0..0] != "\004" and auth_reply[0..0] != "\005" raise SOCKSError.new("SOCKS version #{auth_reply[0..0]} not supported") end if auth_reply[1..1] != "\000" raise SOCKSError.new("SOCKS authentication method #{auth_reply[1..1]} neither requested nor supported") end end |
#socks_connect(host, port) ⇒ Object
Connect
160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 |
# File 'lib/socksify.rb', line 160 def socks_connect(host, port) Socksify::debug_debug "Sending destination address" write TCPSocket.socks_version Socksify::debug_debug TCPSocket.socks_version.unpack "H*" write "\001" write "\000" if @@socks_version == "5" write [port].pack('n') if @@socks_version =~ /^4/ if @@socks_version == "4" host = Resolv::DNS.new.getaddress(host).to_s end Socksify::debug_debug host if host =~ /^(\d+)\.(\d+)\.(\d+)\.(\d+)$/ # to IPv4 address write "\001" if @@socks_version == "5" _ip = [$1.to_i, $2.to_i, $3.to_i, $4.to_i ].pack('CCCC') write _ip elsif host =~ /^[:0-9a-f]+$/ # to IPv6 address raise "TCP/IPv6 over SOCKS is not yet supported (inet_pton missing in Ruby & not supported by Tor" write "\004" else # to hostname if @@socks_version == "5" write "\003" + [host.size].pack('C') + host else write "\000\000\000\001" write "\007\000" Socksify::debug_notice host write host write "\000" end end write [port].pack('n') if @@socks_version == "5" socks_receive_reply Socksify::debug_notice "Connected to #{host}:#{port} over SOCKS" end |
#socks_receive_reply ⇒ Object
returns [bind_addr: String, bind_port: Fixnum]
201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 |
# File 'lib/socksify.rb', line 201 def socks_receive_reply Socksify::debug_debug "Waiting for SOCKS reply" if @@socks_version == "5" connect_reply = recv(4) Socksify::debug_debug connect_reply.unpack "H*" if connect_reply[0..0] != "\005" raise SOCKSError.new("SOCKS version #{connect_reply[0..0]} is not 5") end if connect_reply[1..1] != "\000" raise SOCKSError.for_response_code(connect_reply.bytes.to_a[1]) end Socksify::debug_debug "Waiting for bind_addr" bind_addr_len = case connect_reply[3..3] when "\001" 4 when "\003" recv(1).bytes.first when "\004" 16 else raise SOCKSError.for_response_code(connect_reply.bytes.to_a[3]) end bind_addr_s = recv(bind_addr_len) bind_addr = case connect_reply[3..3] when "\001" bind_addr_s.bytes.to_a.join('.') when "\003" bind_addr_s when "\004" # Untested! i = 0 ip6 = "" bind_addr_s.each_byte do |b| if i > 0 and i % 2 == 0 ip6 += ":" end i += 1 ip6 += b.to_s(16).rjust(2, '0') end end bind_port = recv(bind_addr_len + 2) [bind_addr, bind_port.unpack('n')] else connect_reply = recv(8) unless connect_reply[0] == "\000" and connect_reply[1] == "\x5A" Socksify::debug_debug connect_reply.unpack 'H' raise SOCKSError.new("Failed while connecting througth socks") end end end |