tor 0.1.0 → 0.1.5

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 7be2c2b80fea90e1b3e9567624a442d4b3d1a92946f72d6b465280ad4b5d0ec8
4
+ data.tar.gz: 96358536b8479ea4fba83fb236dabb6b743074c058a48a6fbfe435bf00ab5bbc
5
+ SHA512:
6
+ metadata.gz: b961dc19ac6f692cbade5226a895782c311cf6463fd228595ee4044085de9340f6948e852c981649c63abfd0abd01665d3fd7cabf2970815be6f87541b8158ee
7
+ data.tar.gz: cbecd4beddfd8d543d79233ea2f116609204550f0366a091aacac9573eae593e08c2d5c663020b56713ea6fc46b6dbb2ca39aa6b4e0e1686bb30d6ae7c7b2a7c
data/AUTHORS CHANGED
@@ -1 +1,2 @@
1
1
  * Arto Bendiken <arto.bendiken@gmail.com>
2
+ * Łukasz Wieczorek <wieczorek1990@gmail.com>
File without changes
data/README ADDED
@@ -0,0 +1 @@
1
+ ./README.md
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.1.0
1
+ 0.1.5
data/lib/tor.rb CHANGED
@@ -1,3 +1,5 @@
1
+ require 'pathname'
2
+
1
3
  if RUBY_VERSION < '1.8.7'
2
4
  # @see http://rubygems.org/gems/backports
3
5
  begin
@@ -15,8 +17,32 @@ end
15
17
  ##
16
18
  # @see https://www.torproject.org/
17
19
  module Tor
18
- autoload :DNSEL, 'tor/dnsel'
19
- autoload :VERSION, 'tor/version'
20
+ require_relative 'tor/config'
21
+ require_relative 'tor/control'
22
+ require_relative 'tor/dnsel'
23
+ require_relative 'tor/version'
24
+
25
+ ##
26
+ # Returns `true` if the Tor process is running locally, `false` otherwise.
27
+ #
28
+ # This works by attempting to establish a Tor Control Protocol (TC)
29
+ # connection to the standard control port 9051 on `localhost`. If Tor
30
+ # hasn't been configured with the `ControlPort 9051` option, this will
31
+ # return `false`.
32
+ #
33
+ # @example
34
+ # Tor.running? #=> false
35
+ #
36
+ # @return [Boolean]
37
+ # @since 0.1.2
38
+ def self.running?
39
+ begin
40
+ Tor::Controller.new.quit
41
+ true
42
+ rescue Errno::ECONNREFUSED
43
+ false
44
+ end
45
+ end
20
46
 
21
47
  ##
22
48
  # Returns `true` if Tor is available, `false` otherwise.
@@ -39,6 +65,8 @@ module Tor
39
65
  def self.version
40
66
  if available? && `#{program_path} --version` =~ /Tor v(\d+)\.(\d+)\.(\d+)\.(\d+)/
41
67
  [$1, $2, $3, $4].join('.')
68
+ elsif available? && `#{program_path} --version` =~ /Tor version (\d+)\.(\d+)\.(\d+)\.(\d+)/
69
+ [$1, $2, $3, $4].join('.')
42
70
  end
43
71
  end
44
72
 
data/lib/tor/config.rb ADDED
@@ -0,0 +1,103 @@
1
+ module Tor
2
+ ##
3
+ # Tor configuration.
4
+ #
5
+ # @example Parsing a Tor configuration file (1)
6
+ # torrc = Tor::Config.load("/etc/tor/torrc")
7
+ #
8
+ # @example Parsing a Tor configuration file (2)
9
+ # Tor::Config.open("/etc/tor/torrc") do |torrc|
10
+ # puts "Tor SOCKS port: #{torrc['SocksPort']}"
11
+ # puts "Tor control port: #{torrc['ControlPort']}"
12
+ # puts "Tor exit policy:"
13
+ # torrc.each('ExitPolicy') do |key, value|
14
+ # puts " #{value}"
15
+ # end
16
+ # end
17
+ #
18
+ # @see https://www.torproject.org/tor-manual.html.en
19
+ # @since 0.1.2
20
+ class Config
21
+ CONFDIR = '/etc/tor' unless defined?(CONFDIR)
22
+
23
+ ##
24
+ # Opens a Tor configuration file.
25
+ #
26
+ # @param [String, #to_s] filename
27
+ # @param [Hash{Symbol => Object}] options
28
+ # @yield [config]
29
+ # @yieldparam [Config] config
30
+ # @return [Config]
31
+ def self.open(filename, options = {}, &block)
32
+ if block_given?
33
+ block.call(self.load(filename, options))
34
+ else
35
+ self.load(filename, options)
36
+ end
37
+ end
38
+
39
+ ##
40
+ # Loads the configuration options from a Tor configuration file.
41
+ #
42
+ # @param [String, #to_s] filename
43
+ # @param [Hash{Symbol => Object}] options
44
+ # @return [Config]
45
+ def self.load(filename, options = {})
46
+ self.new(options) do |config|
47
+ File.open(filename.to_s, 'rb') do |file|
48
+ file.each_line do |line|
49
+ case line = line.strip.chomp.strip
50
+ when '' then next # skip empty lines
51
+ when /^#/ then next # skip comments
52
+ else line = line.split('#').first.strip
53
+ end
54
+ # TODO: support for unquoting and unescaping values
55
+ config << line.split(/\s+/, 2)
56
+ end
57
+ end
58
+ end
59
+ end
60
+
61
+ ##
62
+ # @param [Hash{Symbol => Object}] options
63
+ # @yield [config]
64
+ # @yieldparam [Config] config
65
+ def initialize(options = {}, &block)
66
+ @lines, @options = [], options.dup
67
+ block.call(self) if block_given?
68
+ end
69
+
70
+ ##
71
+ # Appends a new configuration option.
72
+ #
73
+ # @param [Array(String, String)]
74
+ # @return [Config]
75
+ def <<(kv)
76
+ @lines << kv
77
+ self
78
+ end
79
+
80
+ ##
81
+ # Looks up the last value of a particular configuration option.
82
+ #
83
+ # @param [String, Regexp] key
84
+ # @return [String]
85
+ def [](key)
86
+ values = each(key).map(&:last)
87
+ values.empty? ? nil : values.last
88
+ end
89
+
90
+ ##
91
+ # Enumerates configuration options.
92
+ #
93
+ # @param [String, Regexp] key
94
+ # @yield [key, value]
95
+ # @yieldparam [String] key
96
+ # @yieldparam [String] value
97
+ # @return [Enumerator]
98
+ def each(key = nil, &block)
99
+ return enum_for(:each, key) unless block_given?
100
+ key ? @lines.find_all { |k, v| key === k }.each(&block) : @lines.each(&block)
101
+ end
102
+ end
103
+ end
@@ -0,0 +1,310 @@
1
+ require 'socket' unless defined?(Socket)
2
+
3
+ module Tor
4
+ ##
5
+ # Tor Control Protocol (TC) client.
6
+ #
7
+ # The Tor control protocol is used by other programs (such as frontend
8
+ # user interfaces) to communicate with a locally running Tor process. It
9
+ # is not part of the Tor onion routing protocol.
10
+ #
11
+ # @example Establishing a controller connection (1)
12
+ # tor = Tor::Controller.new
13
+ #
14
+ # @example Establishing a controller connection (2)
15
+ # tor = Tor::Controller.new(:host => '127.0.0.1', :port => 9051)
16
+ #
17
+ # @example Authenticating the controller connection
18
+ # tor.authenticate
19
+ #
20
+ # @example Obtaining information about the Tor process
21
+ # tor.version #=> "0.2.1.25"
22
+ # tor.config_file #=> #<Pathname:/opt/local/etc/tor/torrc>
23
+ #
24
+ # @see http://gitweb.torproject.org/tor.git?a=blob_plain;hb=HEAD;f=doc/spec/control-spec.txt
25
+ # @see http://www.thesprawl.org/memdump/?entry=8
26
+ # @since 0.1.1
27
+ class Controller
28
+ PROTOCOL_VERSION = 1
29
+
30
+ ##
31
+ # @param [Hash{Symbol => Object}] options
32
+ # @option options [String, #to_s] :host ("127.0.0.1")
33
+ # @option options [Integer, #to_i] :port (9051)
34
+ # @option options [String, #to_s] :cookie (nil)
35
+ # @option options [Integer, #to_i] :version (PROTOCOL_VERSION)
36
+ def self.connect(options = {}, &block)
37
+ if block_given?
38
+ result = block.call(tor = self.new(options))
39
+ tor.quit
40
+ result
41
+ else
42
+ self.new(options)
43
+ end
44
+ end
45
+
46
+ ##
47
+ # @param [Hash{Symbol => Object}] options
48
+ # @option options [String, #to_s] :host ("127.0.0.1")
49
+ # @option options [Integer, #to_i] :port (9051)
50
+ # @option options [String, #to_s] :cookie (nil)
51
+ # @option options [Integer, #to_i] :version (PROTOCOL_VERSION)
52
+ def initialize(options = {}, &block)
53
+ @options = options.dup
54
+ @host = (@options.delete(:host) || '127.0.0.1').to_s
55
+ @port = (@options.delete(:port) || 9051).to_i
56
+ @version = (@options.delete(:version) || PROTOCOL_VERSION).to_i
57
+ connect
58
+ if block_given?
59
+ block.call(self)
60
+ quit
61
+ end
62
+ end
63
+
64
+ attr_reader :host, :port
65
+
66
+ ##
67
+ # Establishes the socket connection to the Tor process.
68
+ #
69
+ # @example
70
+ # tor.close
71
+ # tor.connect
72
+ #
73
+ # @return [void]
74
+ def connect
75
+ close
76
+ @socket = TCPSocket.new(@host, @port)
77
+ @socket.setsockopt(Socket::SOL_SOCKET, Socket::SO_KEEPALIVE, true)
78
+ self
79
+ end
80
+
81
+ ##
82
+ # Returns `true` if the controller connection is active.
83
+ #
84
+ # @example
85
+ # tor.connected? #=> true
86
+ # tor.close
87
+ # tor.connected? #=> false
88
+ #
89
+ # @return [Boolean]
90
+ def connected?
91
+ !!@socket
92
+ end
93
+
94
+ ##
95
+ # Closes the socket connection to the Tor process.
96
+ #
97
+ # @example
98
+ # tor.close
99
+ #
100
+ # @return [void]
101
+ def close
102
+ @socket.close if @socket
103
+ @socket = nil
104
+ self
105
+ end
106
+
107
+ ##
108
+ # Tells the Tor process to hang up on this controller connection.
109
+ #
110
+ # This command can be used before authenticating.
111
+ #
112
+ # @example
113
+ # C: QUIT
114
+ # S: 250 closing connection
115
+ # ^D
116
+ #
117
+ # @example
118
+ # tor.quit
119
+ #
120
+ # @return [void]
121
+ def quit
122
+ send_line('QUIT')
123
+ reply = read_reply
124
+ close
125
+ reply
126
+ end
127
+
128
+ ##
129
+ # Returns information about the authentication method required by the
130
+ # Tor process.
131
+ #
132
+ # This command may be used before authenticating.
133
+ #
134
+ # @example
135
+ # C: PROTOCOLINFO
136
+ # S: 250-PROTOCOLINFO 1
137
+ # S: 250-AUTH METHODS=NULL
138
+ # S: 250-VERSION Tor="0.2.1.25"
139
+ # S: 250 OK
140
+ #
141
+ # @example
142
+ # tor.authentication_method #=> nil
143
+ # tor.authentication_method #=> :hashedpassword
144
+ # tor.authentication_method #=> :cookie
145
+ #
146
+ # @return [Symbol]
147
+ # @since 0.1.2
148
+ def authentication_method
149
+ @authentication_method ||= begin
150
+ method = nil
151
+ send_line('PROTOCOLINFO')
152
+ loop do
153
+ # TODO: support for reading multiple authentication methods
154
+ case reply = read_reply
155
+ when /^250-AUTH METHODS=(\w*)/
156
+ method = $1.strip.downcase.to_sym
157
+ method = method.eql?(:null) ? nil : method
158
+ when /^250-/ then next
159
+ when '250 OK' then break
160
+ end
161
+ end
162
+ method
163
+ end
164
+ end
165
+
166
+ ##
167
+ # Returns `true` if the controller connection has been authenticated.
168
+ #
169
+ # @example
170
+ # tor.authenticated? #=> false
171
+ # tor.authenticate
172
+ # tor.authenticated? #=> true
173
+ #
174
+ # @return [Boolean]
175
+ def authenticated?
176
+ @authenticated || false
177
+ end
178
+
179
+ ##
180
+ # Authenticates the controller connection.
181
+ #
182
+ # @example
183
+ # C: AUTHENTICATE
184
+ # S: 250 OK
185
+ #
186
+ # @example
187
+ # tor.authenticate
188
+ #
189
+ # @return [void]
190
+ # @raise [AuthenticationError] if authentication failed
191
+ def authenticate(cookie = nil)
192
+ cookie ||= @options[:cookie]
193
+ send(:send_line, cookie ? "AUTHENTICATE #{cookie}" : "AUTHENTICATE")
194
+ case reply = read_reply
195
+ when '250 OK' then @authenticated = true
196
+ else raise AuthenticationError.new(reply)
197
+ end
198
+ self
199
+ end
200
+
201
+ ##
202
+ # Returns the version number of the Tor process.
203
+ #
204
+ # @example
205
+ # C: GETINFO version
206
+ # S: 250-version=0.2.1.25
207
+ # S: 250 OK
208
+ #
209
+ # @example
210
+ # tor.version #=> "0.2.1.25"
211
+ #
212
+ # @return [String]
213
+ def version
214
+ send_command(:getinfo, 'version')
215
+ reply = read_reply.split('=').last
216
+ read_reply # skip "250 OK"
217
+ reply
218
+ end
219
+
220
+ ##
221
+ # Returns the path to the Tor configuration file.
222
+ #
223
+ # @example
224
+ # C: GETINFO config-file
225
+ # S: 250-config-file=/opt/local/etc/tor/torrc
226
+ # S: 250 OK
227
+ #
228
+ # @example
229
+ # tor.config_file #=> #<Pathname:/opt/local/etc/tor/torrc>
230
+ #
231
+ # @return [Pathname]
232
+ def config_file
233
+ send_command(:getinfo, 'config-file')
234
+ reply = read_reply.split('=').last
235
+ read_reply # skip "250 OK"
236
+ Pathname(reply)
237
+ end
238
+
239
+ ##
240
+ # Returns the current (in-memory) Tor configuration.
241
+ # Response is terminated with a "."
242
+ #
243
+ # @example
244
+ # C: GETINFO config-text
245
+ # S: 250+config-text=
246
+ # S: ControlPort 9051
247
+ # S: RunAsDaemon 1
248
+ # S: .
249
+ def config_text
250
+ send_command(:getinfo, 'config-text')
251
+ reply = ""
252
+ read_reply # skip "250+config-text="
253
+ while line = read_reply
254
+ break unless line != "."
255
+ reply.concat(line + "\n")
256
+ end
257
+ read_reply # skip "250 OK"
258
+ return reply
259
+ end
260
+
261
+ ##
262
+ # Send a signal to the server
263
+ #
264
+ # @example
265
+ # tor.signal("newnym")
266
+ #
267
+ # @return [String]
268
+ def signal(name)
269
+ send_command(:signal, name)
270
+ read_reply
271
+ end
272
+
273
+ protected
274
+
275
+ ##
276
+ # Sends a command line over the socket.
277
+ #
278
+ # @param [Symbol, #to_s] command
279
+ # @param [Array<String>] args
280
+ # @return [void]
281
+ def send_command(command, *args)
282
+ authenticate unless authenticated?
283
+ send_line(["#{command.to_s.upcase}", *args].join(' '))
284
+ end
285
+
286
+ ##
287
+ # Sends a text line over the socket.
288
+ #
289
+ # @param [String, #to_s] line
290
+ # @return [void]
291
+ def send_line(line)
292
+ @socket.write(line.to_s + "\r\n")
293
+ @socket.flush
294
+ end
295
+
296
+ ##
297
+ # Reads a reply line from the socket.
298
+ #
299
+ # @return [String]
300
+ def read_reply
301
+ @socket.readline.chomp
302
+ end
303
+
304
+ ##
305
+ # Used to signal an authentication error.
306
+ #
307
+ # @see Tor::Controller#authenticate
308
+ class AuthenticationError < StandardError; end
309
+ end
310
+ end
data/lib/tor/dnsel.rb CHANGED
@@ -1,66 +1,26 @@
1
1
  require 'resolv' unless defined?(Resolv)
2
2
 
3
3
  module Tor
4
- ##
5
- # Tor DNS Exit List (DNSEL) client.
6
- #
7
- # Unless the target IP address and port are explicitly specified, the
8
- # query will be performed using a target IP address of "8.8.8.8" and a
9
- # target port of 53. These correspond to the DNS protocol port on one of
10
- # the [Google Public DNS](http://code.google.com/speed/public-dns/)
11
- # servers, and they are guaranteed to be reachable from Tor's default exit
12
- # policy.
13
- #
14
- # @example Checking source IP addresses
15
- # Tor::DNSEL.include?("208.75.57.100") #=> true
16
- # Tor::DNSEL.include?("1.2.3.4") #=> false
17
- #
18
- # @example Checking source hostnames
19
- # Tor::DNSEL.include?("ennui.lostinthenoise.net") #=> true
20
- # Tor::DNSEL.include?("myhost.example.org") #=> false
21
- #
22
- # @example Specifying an explicit target port
23
- # Tor::DNSEL.include?("208.75.57.100", :port => 80) #=> true
24
- # Tor::DNSEL.include?("208.75.57.100", :port => 25) #=> false
25
- #
26
- # @example Specifying an explicit target IP address and port
27
- # Tor::DNSEL.include?(source_addr, :addr => target_addr, :port => target_port)
28
- # Tor::DNSEL.include?("208.75.57.100", :addr => myip, :port => myport)
29
- #
30
- # @example Using from a Rack application
31
- # Tor::DNSEL.include?(env['REMOTE_ADDR'] || env['REMOTE_HOST'], {
32
- # :addr => env['SERVER_NAME'],
33
- # :port => env['SERVER_PORT'],
34
- # })
35
- #
36
- # @see https://www.torproject.org/tordnsel/
37
- # @see https://trac.torproject.org/projects/tor/wiki/TheOnionRouter/TorDNSExitList
38
- # @see http://gitweb.torproject.org/tor.git?a=blob_plain;hb=HEAD;f=doc/contrib/torel-design.txt
39
4
  module DNSEL
40
5
  RESOLVER = Resolv::DefaultResolver unless defined?(RESOLVER)
41
- TARGET_ADDR = '8.8.8.8'.freeze unless defined?(TARGET_ADDR) # Google Public DNS
42
- TARGET_PORT = 53 unless defined?(TARGET_PORT) # DNS
43
- DNS_SUFFIX = 'ip-port.exitlist.torproject.org'.freeze
6
+ DNS_SUFFIX = 'dnsel.torproject.org'.freeze
44
7
 
45
8
  ##
46
- # Returns `true` if the Tor DNSEL includes `host`, `false` otherwise.
9
+ # Returns `true` if `host` is a Tor Exit Node, `false` otherwise.
47
10
  #
48
11
  # If the DNS server is unreachable or the DNS query times out, returns
49
12
  # `nil` to indicate that we don't have a definitive answer one way or
50
13
  # another.
51
14
  #
52
15
  # @example
53
- # Tor::DNSEL.include?("208.75.57.100") #=> true
16
+ # Tor::DNSEL.include?("185.220.101.21") #=> true
54
17
  # Tor::DNSEL.include?("1.2.3.4") #=> false
55
18
  #
56
19
  # @param [String, #to_s] host
57
- # @param [Hash{Symbol => Object}] options
58
- # @option options [String, #to_s] :addr ("8.8.8.8")
59
- # @option options [Integer, #to_i] :port (53)
60
20
  # @return [Boolean]
61
- def self.include?(host, options = {})
21
+ def self.include?(host)
62
22
  begin
63
- query(host, options) == '127.0.0.2'
23
+ query(host) == '127.0.0.2'
64
24
  rescue Resolv::ResolvError # NXDOMAIN
65
25
  false
66
26
  rescue Resolv::ResolvTimeout
@@ -77,35 +37,27 @@ module Tor
77
37
  # exit node and raising a `Resolv::ResolvError` if it isn't.
78
38
  #
79
39
  # @example
80
- # Tor::DNSEL.query("208.75.57.100") #=> "127.0.0.2"
40
+ # Tor::DNSEL.query("185.220.101.21") #=> "127.0.0.2"
81
41
  # Tor::DNSEL.query("1.2.3.4") #=> Resolv::ResolvError
82
42
  #
83
43
  # @param [String, #to_s] host
84
- # @param [Hash{Symbol => Object}] options
85
- # @option options [String, #to_s] :addr ("8.8.8.8")
86
- # @option options [Integer, #to_i] :port (53)
87
44
  # @return [String]
88
45
  # @raise [Resolv::ResolvError] for an NXDOMAIN response
89
- def self.query(host, options = {})
90
- getaddress(dnsname(host, options))
46
+ def self.query(host)
47
+ getaddress(dnsname(host))
91
48
  end
92
49
 
93
50
  ##
94
51
  # Returns the DNS name used for Tor DNSEL queries of `host`.
95
52
  #
96
53
  # @example
97
- # Tor::DNSEL.dnsname("1.2.3.4") #=> "4.3.2.1.53.8.8.8.8.ip-port.exitlist.torproject.org"
54
+ # Tor::DNSEL.dnsname("1.2.3.4") #=> "4.3.2.1.dnsel.torproject.org"
98
55
  #
99
56
  # @param [String, #to_s] host
100
- # @param [Hash{Symbol => Object}] options
101
- # @option options [String, #to_s] :addr ("8.8.8.8")
102
- # @option options [Integer, #to_i] :port (53)
103
57
  # @return [String]
104
- def self.dnsname(host, options = {})
58
+ def self.dnsname(host)
105
59
  source_addr = getaddress(host, true)
106
- target_addr = getaddress(options[:addr] || TARGET_ADDR, true)
107
- target_port = options[:port] || TARGET_PORT
108
- [source_addr, target_port, target_addr, DNS_SUFFIX].join('.')
60
+ "#{source_addr}.#{DNS_SUFFIX}"
109
61
  end
110
62
  class << self; alias_method :hostname, :dnsname; end
111
63
 
data/lib/tor/version.rb CHANGED
@@ -2,7 +2,7 @@ module Tor
2
2
  module VERSION
3
3
  MAJOR = 0
4
4
  MINOR = 1
5
- TINY = 0
5
+ TINY = 4
6
6
  EXTRA = nil
7
7
 
8
8
  STRING = [MAJOR, MINOR, TINY, EXTRA].compact.join('.')
metadata CHANGED
@@ -1,98 +1,87 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: tor
3
- version: !ruby/object:Gem::Version
4
- prerelease: false
5
- segments:
6
- - 0
7
- - 1
8
- - 0
9
- version: 0.1.0
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.5
10
5
  platform: ruby
11
- authors:
6
+ authors:
12
7
  - Arto Bendiken
13
8
  autorequire:
14
9
  bindir: bin
15
10
  cert_chain: []
16
-
17
- date: 2010-08-01 00:00:00 +02:00
18
- default_executable:
19
- dependencies:
20
- - !ruby/object:Gem::Dependency
11
+ date: 2021-03-22 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
21
14
  name: yard
22
- prerelease: false
23
- requirement: &id001 !ruby/object:Gem::Requirement
24
- requirements:
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
25
17
  - - ">="
26
- - !ruby/object:Gem::Version
27
- segments:
28
- - 0
29
- - 5
30
- - 8
31
- version: 0.5.8
18
+ - !ruby/object:Gem::Version
19
+ version: 0.6.0
20
+ - - "~>"
21
+ - !ruby/object:Gem::Version
22
+ version: '0.6'
32
23
  type: :development
33
- version_requirements: *id001
34
- - !ruby/object:Gem::Dependency
35
- name: rspec
36
24
  prerelease: false
37
- requirement: &id002 !ruby/object:Gem::Requirement
38
- requirements:
25
+ version_requirements: !ruby/object:Gem::Requirement
26
+ requirements:
39
27
  - - ">="
40
- - !ruby/object:Gem::Version
41
- segments:
42
- - 1
43
- - 3
44
- - 0
45
- version: 1.3.0
28
+ - !ruby/object:Gem::Version
29
+ version: 0.6.0
30
+ - - "~>"
31
+ - !ruby/object:Gem::Version
32
+ version: '0.6'
33
+ - !ruby/object:Gem::Dependency
34
+ name: rspec
35
+ requirement: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - "~>"
38
+ - !ruby/object:Gem::Version
39
+ version: '3'
46
40
  type: :development
47
- version_requirements: *id002
48
- description: Tor.rb is a pure-Ruby library for interacting with the Tor anonymity network.
41
+ prerelease: false
42
+ version_requirements: !ruby/object:Gem::Requirement
43
+ requirements:
44
+ - - "~>"
45
+ - !ruby/object:Gem::Version
46
+ version: '3'
47
+ description: Tor.rb is a Ruby library for interacting with the Tor anonymity network.
49
48
  email: or-talk@seul.org
50
49
  executables: []
51
-
52
50
  extensions: []
53
-
54
51
  extra_rdoc_files: []
55
-
56
- files:
52
+ files:
57
53
  - AUTHORS
58
- - CONTRIBUTORS
54
+ - CREDITS
59
55
  - README
60
56
  - UNLICENSE
61
57
  - VERSION
58
+ - lib/tor.rb
59
+ - lib/tor/config.rb
60
+ - lib/tor/control.rb
62
61
  - lib/tor/dnsel.rb
63
62
  - lib/tor/version.rb
64
- - lib/tor.rb
65
- has_rdoc: false
66
- homepage: http://github.com/bendiken/tor-ruby
67
- licenses:
68
- - Public Domain
63
+ homepage: http://cypherpunk.rubyforge.org/tor/
64
+ licenses:
65
+ - Unlicense
66
+ metadata: {}
69
67
  post_install_message:
70
68
  rdoc_options: []
71
-
72
- require_paths:
69
+ require_paths:
73
70
  - lib
74
- required_ruby_version: !ruby/object:Gem::Requirement
75
- requirements:
71
+ required_ruby_version: !ruby/object:Gem::Requirement
72
+ requirements:
76
73
  - - ">="
77
- - !ruby/object:Gem::Version
78
- segments:
79
- - 1
80
- - 8
81
- - 1
74
+ - !ruby/object:Gem::Version
82
75
  version: 1.8.1
83
- required_rubygems_version: !ruby/object:Gem::Requirement
84
- requirements:
76
+ required_rubygems_version: !ruby/object:Gem::Requirement
77
+ requirements:
85
78
  - - ">="
86
- - !ruby/object:Gem::Version
87
- segments:
88
- - 0
89
- version: "0"
90
- requirements:
79
+ - !ruby/object:Gem::Version
80
+ version: '0'
81
+ requirements:
91
82
  - Tor (>= 0.2.1.25)
92
- rubyforge_project: cypherpunk
93
- rubygems_version: 1.3.6
83
+ rubygems_version: 3.0.3
94
84
  signing_key:
95
- specification_version: 3
85
+ specification_version: 4
96
86
  summary: Onion routing for Ruby.
97
87
  test_files: []
98
-
data/README DELETED
@@ -1,77 +0,0 @@
1
- Tor.rb: Onion Routing for Ruby
2
- ==============================
3
-
4
- This is a Ruby library for interacting with the [Tor][] anonymity network.
5
-
6
- * <http://github.com/bendiken/tor-ruby>
7
-
8
- Features
9
- --------
10
-
11
- * Supports checking whether Tor is installed in the user's current `PATH`,
12
- and if it is, returning the version number.
13
- * Supports querying the [Tor DNS Exit List (DNSEL)][TorDNSEL] to determine
14
- whether a particular host is a Tor exit node or not.
15
-
16
- Examples
17
- --------
18
-
19
- require 'rubygems'
20
- require 'tor'
21
-
22
- ### Checking whether Tor is installed and which version it is
23
-
24
- Tor.available? #=> true
25
- Tor.version #=> "0.2.1.25"
26
-
27
- ### Checking whether a particular host is a Tor exit node
28
-
29
- Tor::DNSEL.include?("208.75.57.100") #=> true
30
- Tor::DNSEL.include?("1.2.3.4") #=> false
31
-
32
- Documentation
33
- -------------
34
-
35
- * <http://cypherpunk.rubyforge.org/tor/>
36
-
37
- Dependencies
38
- ------------
39
-
40
- * [Ruby](http://ruby-lang.org/) (>= 1.8.7) or (>= 1.8.1 with [Backports][])
41
-
42
- Installation
43
- ------------
44
-
45
- The recommended installation method is via [RubyGems](http://rubygems.org/).
46
- To install the latest official release of Tor.rb, do:
47
-
48
- % [sudo] gem install tor # Ruby 1.8.7+ or 1.9.x
49
- % [sudo] gem install backports tor # Ruby 1.8.1+
50
-
51
- Download
52
- --------
53
-
54
- To get a local working copy of the development repository, do:
55
-
56
- % git clone git://github.com/bendiken/tor-ruby.git
57
-
58
- Alternatively, you can download the latest development version as a tarball
59
- as follows:
60
-
61
- % wget http://github.com/bendiken/tor-ruby/tarball/master
62
-
63
- Author
64
- ------
65
-
66
- * [Arto Bendiken](mailto:arto.bendiken@gmail.com) - <http://ar.to/>
67
-
68
- License
69
- -------
70
-
71
- Tor.rb is free and unencumbered public domain software. For more
72
- information, see <http://unlicense.org/> or the accompanying UNLICENSE file.
73
-
74
- [Tor]: https://www.torproject.org/
75
- [TorDNSEL]: https://www.torproject.org/tordnsel/
76
- [OR]: http://en.wikipedia.org/wiki/Onion_routing
77
- [Backports]: http://rubygems.org/gems/backports