tormanager 0.3.0 → 0.4.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 3e956978c37191217d4f787f613f4610565014d4
4
- data.tar.gz: cfc30d398e0d4dcdef237dca49f2d7195122cae0
3
+ metadata.gz: f4f5f15e6d06ba9f2ea927a1a09e492cb06fcdb8
4
+ data.tar.gz: fcffe0b51611f91a85c4bd17407de5ee364acd98
5
5
  SHA512:
6
- metadata.gz: eef0f639f64e0111f5208d4b76a37c53f37852618f86a62bfcfad2fb1eb8dfb47e22943763c2b8aae0e8fee339c2867f7c68ff3a6d915c453b1996e140d689a3
7
- data.tar.gz: c7e77748b8c2412d1eb4280219988e596fc6ec33d3c25b334a70cce62a7f2beafb5c55e830949e10ac7ee435c4c47aa9a129c65a6553199f1ba1590c6d3a9cb2
6
+ metadata.gz: f781d354d3d9a0ecc9740568c58fe308ae540b18ad63e6162dc46ea92e2dba5d71a0e9a789a79bf4c074c7b9019699ba69a8d034a122ffb33fe6dbd80a385b18
7
+ data.tar.gz: 09b546d6a5ce6f314b2de9972a283ae8043167e78988521346c67ea6de6333b0e653308fba1611d5a73366b1416b2b35ea9e687feb362087199c1cff5db216fa
data/Gemfile CHANGED
@@ -3,8 +3,6 @@ source 'https://rubygems.org'
3
3
  # Specify your gem's dependencies in tormanager.gemspec
4
4
  gemspec
5
5
 
6
- gem 'tor', :git => 'https://github.com/bendiken/tor-ruby.git', :ref => '08e589d17196a5dc640e7b38cb1acc5b4c5ced05'
7
- #gem 'tor', :git => 'https://github.com/dryruby/tor.rb.git'
8
6
  group :development, :test do
9
7
  gem "rb-fsevent", :require => false if RUBY_PLATFORM =~ /darwin/i
10
8
  gem "guard-rspec"
@@ -0,0 +1,313 @@
1
+ require 'socket' unless defined?(Socket)
2
+
3
+ module Tor
4
+ ##
5
+ # Tor Control Protocol (TC) client.
6
+ # pulled from tor.rb:
7
+ # https://github.com/dryruby/tor.rb/blob/master/lib/tor/control.rb
8
+ # because latest version was not pushed to rubygems and needed to bundle into my gem
9
+ #
10
+ # The Tor control protocol is used by other programs (such as frontend
11
+ # user interfaces) to communicate with a locally running Tor process. It
12
+ # is not part of the Tor onion routing protocol.
13
+ #
14
+ # @example Establishing a controller connection (1)
15
+ # tor = Tor::Controller.new
16
+ #
17
+ # @example Establishing a controller connection (2)
18
+ # tor = Tor::Controller.new(:host => '127.0.0.1', :port => 9051)
19
+ #
20
+ # @example Authenticating the controller connection
21
+ # tor.authenticate
22
+ #
23
+ # @example Obtaining information about the Tor process
24
+ # tor.version #=> "0.2.1.25"
25
+ # tor.config_file #=> #<Pathname:/opt/local/etc/tor/torrc>
26
+ #
27
+ # @see http://gitweb.torproject.org/tor.git?a=blob_plain;hb=HEAD;f=doc/spec/control-spec.txt
28
+ # @see http://www.thesprawl.org/memdump/?entry=8
29
+ # @since 0.1.1
30
+ class Controller
31
+ PROTOCOL_VERSION = 1
32
+
33
+ ##
34
+ # @param [Hash{Symbol => Object}] options
35
+ # @option options [String, #to_s] :host ("127.0.0.1")
36
+ # @option options [Integer, #to_i] :port (9051)
37
+ # @option options [String, #to_s] :cookie (nil)
38
+ # @option options [Integer, #to_i] :version (PROTOCOL_VERSION)
39
+ def self.connect(options = {}, &block)
40
+ if block_given?
41
+ result = block.call(tor = self.new(options))
42
+ tor.quit
43
+ result
44
+ else
45
+ self.new(options)
46
+ end
47
+ end
48
+
49
+ ##
50
+ # @param [Hash{Symbol => Object}] options
51
+ # @option options [String, #to_s] :host ("127.0.0.1")
52
+ # @option options [Integer, #to_i] :port (9051)
53
+ # @option options [String, #to_s] :cookie (nil)
54
+ # @option options [Integer, #to_i] :version (PROTOCOL_VERSION)
55
+ def initialize(options = {}, &block)
56
+ @options = options.dup
57
+ @host = (@options.delete(:host) || '127.0.0.1').to_s
58
+ @port = (@options.delete(:port) || 9051).to_i
59
+ @version = (@options.delete(:version) || PROTOCOL_VERSION).to_i
60
+ connect
61
+ if block_given?
62
+ block.call(self)
63
+ quit
64
+ end
65
+ end
66
+
67
+ attr_reader :host, :port
68
+
69
+ ##
70
+ # Establishes the socket connection to the Tor process.
71
+ #
72
+ # @example
73
+ # tor.close
74
+ # tor.connect
75
+ #
76
+ # @return [void]
77
+ def connect
78
+ close
79
+ @socket = TCPSocket.new(@host, @port)
80
+ @socket.setsockopt(Socket::SOL_SOCKET, Socket::SO_KEEPALIVE, true)
81
+ self
82
+ end
83
+
84
+ ##
85
+ # Returns `true` if the controller connection is active.
86
+ #
87
+ # @example
88
+ # tor.connected? #=> true
89
+ # tor.close
90
+ # tor.connected? #=> false
91
+ #
92
+ # @return [Boolean]
93
+ def connected?
94
+ !!@socket
95
+ end
96
+
97
+ ##
98
+ # Closes the socket connection to the Tor process.
99
+ #
100
+ # @example
101
+ # tor.close
102
+ #
103
+ # @return [void]
104
+ def close
105
+ @socket.close if @socket
106
+ @socket = nil
107
+ self
108
+ end
109
+
110
+ ##
111
+ # Tells the Tor process to hang up on this controller connection.
112
+ #
113
+ # This command can be used before authenticating.
114
+ #
115
+ # @example
116
+ # C: QUIT
117
+ # S: 250 closing connection
118
+ # ^D
119
+ #
120
+ # @example
121
+ # tor.quit
122
+ #
123
+ # @return [void]
124
+ def quit
125
+ send_line('QUIT')
126
+ reply = read_reply
127
+ close
128
+ reply
129
+ end
130
+
131
+ ##
132
+ # Returns information about the authentication method required by the
133
+ # Tor process.
134
+ #
135
+ # This command may be used before authenticating.
136
+ #
137
+ # @example
138
+ # C: PROTOCOLINFO
139
+ # S: 250-PROTOCOLINFO 1
140
+ # S: 250-AUTH METHODS=NULL
141
+ # S: 250-VERSION Tor="0.2.1.25"
142
+ # S: 250 OK
143
+ #
144
+ # @example
145
+ # tor.authentication_method #=> nil
146
+ # tor.authentication_method #=> :hashedpassword
147
+ # tor.authentication_method #=> :cookie
148
+ #
149
+ # @return [Symbol]
150
+ # @since 0.1.2
151
+ def authentication_method
152
+ @authentication_method ||= begin
153
+ method = nil
154
+ send_line('PROTOCOLINFO')
155
+ loop do
156
+ # TODO: support for reading multiple authentication methods
157
+ case reply = read_reply
158
+ when /^250-AUTH METHODS=(\w*)/
159
+ method = $1.strip.downcase.to_sym
160
+ method = method.eql?(:null) ? nil : method
161
+ when /^250-/ then next
162
+ when '250 OK' then break
163
+ end
164
+ end
165
+ method
166
+ end
167
+ end
168
+
169
+ ##
170
+ # Returns `true` if the controller connection has been authenticated.
171
+ #
172
+ # @example
173
+ # tor.authenticated? #=> false
174
+ # tor.authenticate
175
+ # tor.authenticated? #=> true
176
+ #
177
+ # @return [Boolean]
178
+ def authenticated?
179
+ @authenticated || false
180
+ end
181
+
182
+ ##
183
+ # Authenticates the controller connection.
184
+ #
185
+ # @example
186
+ # C: AUTHENTICATE
187
+ # S: 250 OK
188
+ #
189
+ # @example
190
+ # tor.authenticate
191
+ #
192
+ # @return [void]
193
+ # @raise [AuthenticationError] if authentication failed
194
+ def authenticate(cookie = nil)
195
+ cookie ||= @options[:cookie]
196
+ send(:send_line, cookie ? "AUTHENTICATE \"#{cookie}\"" : "AUTHENTICATE")
197
+ case reply = read_reply
198
+ when '250 OK' then @authenticated = true
199
+ else raise AuthenticationError.new(reply)
200
+ end
201
+ self
202
+ end
203
+
204
+ ##
205
+ # Returns the version number of the Tor process.
206
+ #
207
+ # @example
208
+ # C: GETINFO version
209
+ # S: 250-version=0.2.1.25
210
+ # S: 250 OK
211
+ #
212
+ # @example
213
+ # tor.version #=> "0.2.1.25"
214
+ #
215
+ # @return [String]
216
+ def version
217
+ send_command(:getinfo, 'version')
218
+ reply = read_reply.split('=').last
219
+ read_reply # skip "250 OK"
220
+ reply
221
+ end
222
+
223
+ ##
224
+ # Returns the path to the Tor configuration file.
225
+ #
226
+ # @example
227
+ # C: GETINFO config-file
228
+ # S: 250-config-file=/opt/local/etc/tor/torrc
229
+ # S: 250 OK
230
+ #
231
+ # @example
232
+ # tor.config_file #=> #<Pathname:/opt/local/etc/tor/torrc>
233
+ #
234
+ # @return [Pathname]
235
+ def config_file
236
+ send_command(:getinfo, 'config-file')
237
+ reply = read_reply.split('=').last
238
+ read_reply # skip "250 OK"
239
+ Pathname(reply)
240
+ end
241
+
242
+ ##
243
+ # Returns the current (in-memory) Tor configuration.
244
+ # Response is terminated with a "."
245
+ #
246
+ # @example
247
+ # C: GETINFO config-text
248
+ # S: 250+config-text=
249
+ # S: ControlPort 9051
250
+ # S: RunAsDaemon 1
251
+ # S: .
252
+ def config_text
253
+ send_command(:getinfo, 'config-text')
254
+ reply = ""
255
+ read_reply # skip "250+config-text="
256
+ while line = read_reply
257
+ break unless line != "."
258
+ reply.concat(line + "\n")
259
+ end
260
+ read_reply # skip "250 OK"
261
+ return reply
262
+ end
263
+
264
+ ##
265
+ # Send a signal to the server
266
+ #
267
+ # @example
268
+ # tor.signal("newnym")
269
+ #
270
+ # @return [String]
271
+ def signal(name)
272
+ send_command(:signal, name)
273
+ read_reply
274
+ end
275
+
276
+ protected
277
+
278
+ ##
279
+ # Sends a command line over the socket.
280
+ #
281
+ # @param [Symbol, #to_s] command
282
+ # @param [Array<String>] args
283
+ # @return [void]
284
+ def send_command(command, *args)
285
+ authenticate unless authenticated?
286
+ send_line(["#{command.to_s.upcase}", *args].join(' '))
287
+ end
288
+
289
+ ##
290
+ # Sends a text line over the socket.
291
+ #
292
+ # @param [String, #to_s] line
293
+ # @return [void]
294
+ def send_line(line)
295
+ @socket.write(line.to_s + "\r\n")
296
+ @socket.flush
297
+ end
298
+
299
+ ##
300
+ # Reads a reply line from the socket.
301
+ #
302
+ # @return [String]
303
+ def read_reply
304
+ @socket.readline.chomp
305
+ end
306
+
307
+ ##
308
+ # Used to signal an authentication error.
309
+ #
310
+ # @see Tor::Controller#authenticate
311
+ class AuthenticationError < StandardError; end
312
+ end
313
+ end
@@ -1,4 +1,3 @@
1
- require 'tor'
2
1
  require 'rest-client'
3
2
 
4
3
  module TorManager
@@ -1,3 +1,3 @@
1
1
  module TorManager
2
- VERSION = "0.3.0"
2
+ VERSION = "0.4.0"
3
3
  end
data/lib/tormanager.rb CHANGED
@@ -1,7 +1,6 @@
1
1
  require "tormanager/version"
2
2
  require "tormanager/process_helper"
3
+ require "tormanager/control"
3
4
  require "tormanager/tor_process"
4
5
  require "tormanager/proxy"
5
6
  require "tormanager/ip_address_control"
6
- require "tor"
7
-
data/tormanager.gemspec CHANGED
@@ -25,9 +25,9 @@ Gem::Specification.new do |spec|
25
25
  spec.add_development_dependency "rake", "~> 10.0"
26
26
  spec.add_development_dependency "rspec", "~> 3.0"
27
27
  spec.add_development_dependency "rspec-rails", "~> 3.5"
28
+ spec.add_development_dependency "gem-release"
28
29
  spec.add_dependency "rest-client"
29
30
  spec.add_dependency "eye"
30
31
  spec.add_dependency "eyemanager"
31
- spec.add_dependency "gem-release"
32
32
  spec.add_dependency "socksify"
33
33
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: tormanager
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.0
4
+ version: 0.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - joshweir
@@ -67,13 +67,13 @@ dependencies:
67
67
  - !ruby/object:Gem::Version
68
68
  version: '3.5'
69
69
  - !ruby/object:Gem::Dependency
70
- name: rest-client
70
+ name: gem-release
71
71
  requirement: !ruby/object:Gem::Requirement
72
72
  requirements:
73
73
  - - ">="
74
74
  - !ruby/object:Gem::Version
75
75
  version: '0'
76
- type: :runtime
76
+ type: :development
77
77
  prerelease: false
78
78
  version_requirements: !ruby/object:Gem::Requirement
79
79
  requirements:
@@ -81,7 +81,7 @@ dependencies:
81
81
  - !ruby/object:Gem::Version
82
82
  version: '0'
83
83
  - !ruby/object:Gem::Dependency
84
- name: eye
84
+ name: rest-client
85
85
  requirement: !ruby/object:Gem::Requirement
86
86
  requirements:
87
87
  - - ">="
@@ -95,7 +95,7 @@ dependencies:
95
95
  - !ruby/object:Gem::Version
96
96
  version: '0'
97
97
  - !ruby/object:Gem::Dependency
98
- name: eyemanager
98
+ name: eye
99
99
  requirement: !ruby/object:Gem::Requirement
100
100
  requirements:
101
101
  - - ">="
@@ -109,7 +109,7 @@ dependencies:
109
109
  - !ruby/object:Gem::Version
110
110
  version: '0'
111
111
  - !ruby/object:Gem::Dependency
112
- name: gem-release
112
+ name: eyemanager
113
113
  requirement: !ruby/object:Gem::Requirement
114
114
  requirements:
115
115
  - - ">="
@@ -154,6 +154,7 @@ files:
154
154
  - bin/console
155
155
  - bin/setup
156
156
  - lib/tormanager.rb
157
+ - lib/tormanager/control.rb
157
158
  - lib/tormanager/eye/eye.tor.test.rb
158
159
  - lib/tormanager/eye/sugar.rb
159
160
  - lib/tormanager/eye/tor.god.rb