socksify 1.5.0 → 1.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: a86f51b885a36af4bf34d20dbc8476485a583635
4
+ data.tar.gz: 0b6b59f257862b1f8010288321b1407ea7efdfd0
5
+ SHA512:
6
+ metadata.gz: 282b936cdf5c9d21b9a6fbec35e58e8923f17bbf3a6e073a8d70c78d2abf7421147c9bc79670af9bb90e70245c34b8bff4b9a75ac274b179977f2efa15b8189c
7
+ data.tar.gz: 39051b34bb2ab7b0524d016c3dbb3815f89e3f6048c4b2d75f5af08d85bfc35276dedb20f0687620d8a023d5592911fb525e4d334d16fca701f12379f4d2cb6b
@@ -1,3 +1,4 @@
1
+ #encoding: us-ascii
1
2
  =begin
2
3
  Copyright (C) 2007 Stephan Maka <stephan@spaceboyz.net>
3
4
 
@@ -130,22 +131,27 @@ class TCPSocket
130
131
  @@socks_ignores = ignores
131
132
  end
132
133
 
133
- class SOCKSConnectionPeerAddress
134
- attr_reader :socks_server, :socks_port, :peer_host
134
+ class SOCKSConnectionPeerAddress < String
135
+ attr_reader :socks_server, :socks_port
136
+
135
137
  def initialize(socks_server, socks_port, peer_host)
136
- @socks_server, @socks_port, @peer_host = socks_server, socks_port, peer_host
138
+ @socks_server, @socks_port = socks_server, socks_port
139
+ super peer_host
140
+ end
141
+
142
+ def inspect
143
+ "#{to_s} (via #{@socks_server}:#{@socks_port})"
137
144
  end
138
145
 
139
- def to_s
140
- "#{@peer_host} (via #{@socks_server}:#{@socks_port})"
146
+ def peer_host
147
+ to_s
141
148
  end
142
- alias_method :to_str, :to_s
143
149
  end
144
150
 
145
151
  alias :initialize_tcp :initialize
146
152
 
147
153
  # See http://tools.ietf.org/html/rfc1928
148
- def initialize(host=nil, port=0, local_host="0.0.0.0", local_port=0)
154
+ def initialize(host=nil, port=0, local_host=nil, local_port=nil)
149
155
  if host.is_a?(SOCKSConnectionPeerAddress)
150
156
  socks_peer = host
151
157
  socks_server = socks_peer.socks_server
@@ -178,7 +184,7 @@ class TCPSocket
178
184
  def socks_authenticate
179
185
  if self.class.socks_username || self.class.socks_password
180
186
  Socksify::debug_debug "Sending username/password authentication"
181
- write "\005\001\001\002"
187
+ write "\005\001\002"
182
188
  else
183
189
  Socksify::debug_debug "Sending no authentication"
184
190
  write "\005\001\000"
@@ -46,8 +46,14 @@ module Net
46
46
  end
47
47
 
48
48
  module InstanceMethods
49
- def conn_address
50
- TCPSocket::SOCKSConnectionPeerAddress.new(self.class.socks_server, self.class.socks_port, address())
49
+ if RUBY_VERSION[0..0] >= '2'
50
+ def address
51
+ TCPSocket::SOCKSConnectionPeerAddress.new(self.class.socks_server, self.class.socks_port, @address)
52
+ end
53
+ else
54
+ def conn_address
55
+ TCPSocket::SOCKSConnectionPeerAddress.new(self.class.socks_server, self.class.socks_port, address())
56
+ end
51
57
  end
52
58
  end
53
59
  end
metadata CHANGED
@@ -1,8 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: socksify
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.5.0
5
- prerelease:
4
+ version: 1.6.0
6
5
  platform: ruby
7
6
  authors:
8
7
  - Stephan Maka
@@ -14,7 +13,7 @@ authors:
14
13
  autorequire:
15
14
  bindir: bin
16
15
  cert_chain: []
17
- date: 2012-06-22 00:00:00.000000000 Z
16
+ date: 2014-08-25 00:00:00.000000000 Z
18
17
  dependencies: []
19
18
  description:
20
19
  email: stephan@spaceboyz.net
@@ -22,40 +21,39 @@ executables:
22
21
  - socksify_ruby
23
22
  extensions: []
24
23
  extra_rdoc_files:
25
- - doc/index.css
26
24
  - doc/index.html
25
+ - doc/index.css
27
26
  - COPYING
28
27
  files:
29
28
  - COPYING
30
- - lib/socksify/debug.rb
31
- - lib/socksify/http.rb
32
- - lib/socksify.rb
33
- - lib/socksify.rb.orig
34
29
  - bin/socksify_ruby
35
30
  - doc/index.css
36
31
  - doc/index.html
32
+ - lib/socksify.rb
33
+ - lib/socksify/debug.rb
34
+ - lib/socksify/http.rb
37
35
  homepage: http://socksify.rubyforge.org/
38
36
  licenses: []
37
+ metadata: {}
39
38
  post_install_message:
40
39
  rdoc_options: []
41
40
  require_paths:
42
41
  - lib
43
42
  required_ruby_version: !ruby/object:Gem::Requirement
44
- none: false
45
43
  requirements:
46
- - - ! '>='
44
+ - - ">="
47
45
  - !ruby/object:Gem::Version
48
46
  version: '0'
49
47
  required_rubygems_version: !ruby/object:Gem::Requirement
50
- none: false
51
48
  requirements:
52
- - - ! '>='
49
+ - - ">="
53
50
  - !ruby/object:Gem::Version
54
51
  version: '0'
55
52
  requirements: []
56
53
  rubyforge_project: socksify
57
- rubygems_version: 1.8.23
54
+ rubygems_version: 2.2.2
58
55
  signing_key:
59
- specification_version: 3
56
+ specification_version: 4
60
57
  summary: Redirect all TCPSockets through a SOCKS5 proxy
61
58
  test_files: []
59
+ has_rdoc: false
@@ -1,244 +0,0 @@
1
- =begin
2
- Copyright (C) 2007 Stephan Maka <stephan@spaceboyz.net>
3
-
4
- This program is free software: you can redistribute it and/or modify
5
- it under the terms of the GNU General Public License as published by
6
- the Free Software Foundation, either version 3 of the License, or
7
- (at your option) any later version.
8
-
9
- This program is distributed in the hope that it will be useful,
10
- but WITHOUT ANY WARRANTY; without even the implied warranty of
11
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12
- GNU General Public License for more details.
13
-
14
- You should have received a copy of the GNU General Public License
15
- along with this program. If not, see <http://www.gnu.org/licenses/>.
16
- =end
17
-
18
- require 'socket'
19
- require 'socksify_debug'
20
-
21
- class SOCKSError < RuntimeError
22
- def initialize(msg)
23
- Socksify::debug_error("#{self.class}: #{msg}")
24
- super
25
- end
26
-
27
- class ServerFailure < SOCKSError
28
- def initialize
29
- super("general SOCKS server failure")
30
- end
31
- end
32
- class NotAllowed < SOCKSError
33
- def initialize
34
- super("connection not allowed by ruleset")
35
- end
36
- end
37
- class NetworkUnreachable < SOCKSError
38
- def initialize
39
- super("Network unreachable")
40
- end
41
- end
42
- class HostUnreachable < SOCKSError
43
- def initialize
44
- super("Host unreachable")
45
- end
46
- end
47
- class ConnectionRefused < SOCKSError
48
- def initialize
49
- super("Connection refused")
50
- end
51
- end
52
- class TTLExpired < SOCKSError
53
- def initialize
54
- super("TTL expired")
55
- end
56
- end
57
- class CommandNotSupported < SOCKSError
58
- def initialize
59
- super("Command not supported")
60
- end
61
- end
62
- class AddressTypeNotSupported < SOCKSError
63
- def initialize
64
- super("Address type not supported")
65
- end
66
- end
67
-
68
- def self.for_response_code(code)
69
- case code
70
- when 1
71
- ServerFailure
72
- when 2
73
- NotAllowed
74
- when 3
75
- NetworkUnreachable
76
- when 4
77
- HostUnreachable
78
- when 5
79
- ConnectionRefused
80
- when 6
81
- TTLExpired
82
- when 7
83
- CommandNotSupported
84
- when 8
85
- AddressTypeNotSupported
86
- else
87
- self
88
- end
89
- end
90
- end
91
-
92
- class TCPSocket
93
- def self.socks_server
94
- @@socks_server
95
- end
96
- def self.socks_server=(host)
97
- @@socks_server = host
98
- end
99
- def self.socks_port
100
- @@socks_port
101
- end
102
- def self.socks_port=(port)
103
- @@socks_port = port
104
- end
105
- def self.socks_ignores
106
- @@socks_ignores ||= []
107
- end
108
- def self.socks_ignores=(ignores)
109
- @@socks_ignores = ignores
110
- end
111
-
112
- alias :initialize_tcp :initialize
113
-
114
- # See http://tools.ietf.org/html/rfc1928
115
- def initialize(host=nil, port=0, local_host="0.0.0.0", local_port=0)
116
- socks_server = self.class.socks_server
117
- socks_port = self.class.socks_port
118
- socks_ignores = self.class.socks_ignores
119
-
120
- if socks_server and socks_port and not socks_ignores.include?(host)
121
- Socksify::debug_notice "Connecting to SOCKS server #{socks_server}:#{socks_port}"
122
- initialize_tcp socks_server, socks_port
123
-
124
- socks_authenticate
125
-
126
- if host
127
- socks_connect(host, port)
128
- end
129
- else
130
- Socksify::debug_notice "Connecting directly to #{host}:#{port}"
131
- initialize_tcp host, port, local_host, local_port
132
- Socksify::debug_debug "Connected to #{host}:#{port}"
133
- end
134
- end
135
-
136
- # Authentication
137
- def socks_authenticate
138
- Socksify::debug_debug "Sending no authentication"
139
- write "\005\001\000"
140
- Socksify::debug_debug "Waiting for authentication reply"
141
- auth_reply = recv(2)
142
- if auth_reply[0] != 4 and auth_reply[0] != 5
143
- raise SOCKSError.new("SOCKS version #{auth_reply[0]} not supported")
144
- end
145
- if auth_reply[1] != 0
146
- raise SOCKSError.new("SOCKS authentication method #{auth_reply[1]} neither requested nor supported")
147
- end
148
- end
149
-
150
- # Connect
151
- def socks_connect(host, port)
152
- Socksify::debug_debug "Sending destination address"
153
- write "\005\001\000"
154
- if host =~ /^(\d+)\.(\d+)\.(\d+)\.(\d+)$/ # to IPv4 address
155
- write "\001" + [$1.to_i,
156
- $2.to_i,
157
- $3.to_i,
158
- $4.to_i
159
- ].pack('CCCC')
160
- elsif host =~ /^[:0-9a-f]+$/ # to IPv6 address
161
- raise "TCP/IPv6 over SOCKS is not yet supported (inet_pton missing in Ruby & not supported by Tor"
162
- write "\004"
163
- else # to hostname
164
- write "\003" + [host.size].pack('C') + host
165
- end
166
- write [port].pack('n')
167
-
168
- socks_receive_reply
169
- Socksify::debug_notice "Connected to #{host}:#{port} over SOCKS"
170
- end
171
-
172
- # returns [bind_addr: String, bind_port: Fixnum]
173
- def socks_receive_reply
174
- Socksify::debug_debug "Waiting for SOCKS reply"
175
- connect_reply = recv(4)
176
- if connect_reply[0] != 5
177
- raise SOCKSError.new("SOCKS version #{connect_reply[0]} is not 5")
178
- end
179
- if connect_reply[1] != 0
180
- raise SOCKSError.for_response_code(connect_reply[1])
181
- end
182
- Socksify::debug_debug "Waiting for bind_addr"
183
- bind_addr_len = case connect_reply[3]
184
- when 1
185
- 4
186
- when 3
187
- recv(1)[0]
188
- when 4
189
- 16
190
- else
191
- raise SOCKSError.for_response_code(connect_reply[3])
192
- end
193
- bind_addr_s = recv(bind_addr_len)
194
- bind_addr = case connect_reply[3]
195
- when 1
196
- "#{bind_addr_s[0]}.#{bind_addr_s[1]}.#{bind_addr_s[2]}.#{bind_addr_s[3]}"
197
- when 3
198
- bind_addr_s
199
- when 4 # Untested!
200
- i = 0
201
- ip6 = ""
202
- bind_addr_s.each_byte do |b|
203
- if i > 0 and i % 2 == 0
204
- ip6 += ":"
205
- end
206
- i += 1
207
-
208
- ip6 += b.to_s(16).rjust(2, '0')
209
- end
210
- end
211
- bind_port = recv(bind_addr_len + 2)
212
- [bind_addr, bind_port.unpack('n')]
213
- end
214
- end
215
-
216
- module Socksify
217
- def self.resolve(host)
218
- s = TCPSocket.new
219
-
220
- begin
221
- Socksify::debug_debug "Sending hostname to resolve: #{host}"
222
- s.write "\005"
223
- if host =~ /^(\d+)\.(\d+)\.(\d+)\.(\d+)$/ # to IPv4 address
224
- s.write "\xF1\000\001" + [$1.to_i,
225
- $2.to_i,
226
- $3.to_i,
227
- $4.to_i
228
- ].pack('CCCC')
229
- elsif host =~ /^[:0-9a-f]+$/ # to IPv6 address
230
- raise "TCP/IPv6 over SOCKS is not yet supported (inet_pton missing in Ruby & not supported by Tor"
231
- s.write "\004"
232
- else # to hostname
233
- s.write "\xF0\000\003" + [host.size].pack('C') + host
234
- end
235
- s.write [0].pack('n') # Port
236
-
237
- addr, port = s.socks_receive_reply
238
- Socksify::debug_notice "Resolved #{host} as #{addr} over SOCKS"
239
- addr
240
- ensure
241
- s.close
242
- end
243
- end
244
- end