socksify-a 1.1.3 → 1.1.4
Sign up to get free protection for your applications and to get access to all the features.
- data/lib/socksify.rb +20 -12
- metadata +2 -2
data/lib/socksify.rb
CHANGED
@@ -16,6 +16,7 @@
|
|
16
16
|
=end
|
17
17
|
|
18
18
|
require 'socket'
|
19
|
+
require 'resolv'
|
19
20
|
require 'socksify_debug'
|
20
21
|
|
21
22
|
class SOCKSError < RuntimeError
|
@@ -90,13 +91,13 @@ class SOCKSError < RuntimeError
|
|
90
91
|
end
|
91
92
|
|
92
93
|
class TCPSocket
|
93
|
-
@@socks_version ||= 5
|
94
|
+
@@socks_version ||= "5"
|
94
95
|
|
95
96
|
def self.socks_version
|
96
|
-
@@socks_version == 4 ? "\004" : "\005"
|
97
|
+
(@@socks_version == "4a" or @@socks_version == "4") ? "\004" : "\005"
|
97
98
|
end
|
98
99
|
def self.socks_version=(version)
|
99
|
-
@@socks_version = version
|
100
|
+
@@socks_version = version.to_s
|
100
101
|
end
|
101
102
|
def self.socks_server
|
102
103
|
@@socks_server ||= nil
|
@@ -129,7 +130,7 @@ class TCPSocket
|
|
129
130
|
Socksify::debug_notice "Connecting to SOCKS server #{socks_server}:#{socks_port}"
|
130
131
|
initialize_tcp socks_server, socks_port
|
131
132
|
|
132
|
-
socks_authenticate unless @@socks_version
|
133
|
+
socks_authenticate unless @@socks_version =~ /^4/
|
133
134
|
|
134
135
|
if host
|
135
136
|
socks_connect(host, port)
|
@@ -159,12 +160,17 @@ class TCPSocket
|
|
159
160
|
def socks_connect(host, port)
|
160
161
|
Socksify::debug_debug "Sending destination address"
|
161
162
|
write TCPSocket.socks_version
|
163
|
+
Socksify::debug_debug TCPSocket.socks_version.unpack "H*"
|
162
164
|
write "\001"
|
163
|
-
write "\000" if @@socks_version == 5
|
164
|
-
write [port].pack('n') if @@socks_version
|
165
|
+
write "\000" if @@socks_version == "5"
|
166
|
+
write [port].pack('n') if @@socks_version =~ /^4/
|
165
167
|
|
168
|
+
if @@socks_version == "4"
|
169
|
+
host = Resolv::DNS.new.getaddress(host).to_s
|
170
|
+
end
|
171
|
+
Socksify::debug_debug host
|
166
172
|
if host =~ /^(\d+)\.(\d+)\.(\d+)\.(\d+)$/ # to IPv4 address
|
167
|
-
write "\001" if @@socks_version == 5
|
173
|
+
write "\001" if @@socks_version == "5"
|
168
174
|
_ip = [$1.to_i,
|
169
175
|
$2.to_i,
|
170
176
|
$3.to_i,
|
@@ -175,16 +181,17 @@ class TCPSocket
|
|
175
181
|
raise "TCP/IPv6 over SOCKS is not yet supported (inet_pton missing in Ruby & not supported by Tor"
|
176
182
|
write "\004"
|
177
183
|
else # to hostname
|
178
|
-
if @@socks_version == 5
|
184
|
+
if @@socks_version == "5"
|
179
185
|
write "\003" + [host.size].pack('C') + host
|
180
186
|
else
|
181
187
|
write "\000\000\000\001"
|
182
|
-
write "\
|
188
|
+
write "\007\000"
|
189
|
+
Socksify::debug_notice host
|
183
190
|
write host
|
184
191
|
write "\000"
|
185
192
|
end
|
186
193
|
end
|
187
|
-
write [port].pack('n') if @@socks_version == 5
|
194
|
+
write [port].pack('n') if @@socks_version == "5"
|
188
195
|
|
189
196
|
socks_receive_reply
|
190
197
|
Socksify::debug_notice "Connected to #{host}:#{port} over SOCKS"
|
@@ -193,10 +200,11 @@ class TCPSocket
|
|
193
200
|
# returns [bind_addr: String, bind_port: Fixnum]
|
194
201
|
def socks_receive_reply
|
195
202
|
Socksify::debug_debug "Waiting for SOCKS reply"
|
196
|
-
if @@socks_version == 5
|
203
|
+
if @@socks_version == "5"
|
197
204
|
connect_reply = recv(4)
|
205
|
+
Socksify::debug_debug connect_reply.unpack "H*"
|
198
206
|
if connect_reply[0..0] != "\005"
|
199
|
-
raise SOCKSError.new("SOCKS version #{connect_reply[0..0]} is not
|
207
|
+
raise SOCKSError.new("SOCKS version #{connect_reply[0..0]} is not 5")
|
200
208
|
end
|
201
209
|
if connect_reply[1..1] != "\000"
|
202
210
|
raise SOCKSError.for_response_code(connect_reply.bytes.to_a[1])
|