Class: Tor::Controller
- Inherits:
-
Object
- Object
- Tor::Controller
- Defined in:
- lib/tormanager/control.rb
Overview
Tor Control Protocol (TC) client. pulled from tor.rb: github.com/dryruby/tor.rb/blob/master/lib/tor/control.rb because latest version was not pushed to rubygems and needed to bundle into my gem
The Tor control protocol is used by other programs (such as frontend user interfaces) to communicate with a locally running Tor process. It is not part of the Tor onion routing protocol.
Defined Under Namespace
Classes: AuthenticationError
Constant Summary collapse
- PROTOCOL_VERSION =
1
Instance Attribute Summary collapse
- #host ⇒ Object readonly
- #port ⇒ Object readonly
Class Method Summary collapse
Instance Method Summary collapse
-
#authenticate(cookie = nil) ⇒ void
Authenticates the controller connection.
-
#authenticated? ⇒ Boolean
Returns
trueif the controller connection has been authenticated. -
#authentication_method ⇒ Symbol
Returns information about the authentication method required by the Tor process.
-
#close ⇒ void
Closes the socket connection to the Tor process.
-
#config_file ⇒ Pathname
Returns the path to the Tor configuration file.
-
#config_text ⇒ Object
Returns the current (in-memory) Tor configuration.
-
#connect ⇒ void
Establishes the socket connection to the Tor process.
-
#connected? ⇒ Boolean
Returns
trueif the controller connection is active. -
#initialize(options = {}, &block) ⇒ Controller
constructor
A new instance of Controller.
-
#quit ⇒ void
Tells the Tor process to hang up on this controller connection.
-
#signal(name) ⇒ String
Send a signal to the server.
-
#version ⇒ String
Returns the version number of the Tor process.
Constructor Details
#initialize(options = {}, &block) ⇒ Controller
Returns a new instance of Controller.
55 56 57 58 59 60 61 62 63 64 65 |
# File 'lib/tormanager/control.rb', line 55 def initialize( = {}, &block) @options = .dup @host = (@options.delete(:host) || '127.0.0.1').to_s @port = (@options.delete(:port) || 9051).to_i @version = (@options.delete(:version) || PROTOCOL_VERSION).to_i connect if block_given? block.call(self) quit end end |
Instance Attribute Details
#host ⇒ Object (readonly)
67 68 69 |
# File 'lib/tormanager/control.rb', line 67 def host @host end |
#port ⇒ Object (readonly)
67 68 69 |
# File 'lib/tormanager/control.rb', line 67 def port @port end |
Class Method Details
.connect(options = {}, &block) ⇒ Object
39 40 41 42 43 44 45 46 47 |
# File 'lib/tormanager/control.rb', line 39 def self.connect( = {}, &block) if block_given? result = block.call(tor = self.new()) tor.quit result else self.new() end end |
Instance Method Details
#authenticate(cookie = nil) ⇒ void
This method returns an undefined value.
Authenticates the controller connection.
194 195 196 197 198 199 200 201 202 |
# File 'lib/tormanager/control.rb', line 194 def authenticate( = nil) ||= @options[:cookie] send(:send_line, ? "AUTHENTICATE \"#{}\"" : "AUTHENTICATE") case reply = read_reply when '250 OK' then @authenticated = true else raise AuthenticationError.new(reply) end self end |
#authenticated? ⇒ Boolean
Returns true if the controller connection has been authenticated.
178 179 180 |
# File 'lib/tormanager/control.rb', line 178 def authenticated? @authenticated || false end |
#authentication_method ⇒ Symbol
Returns information about the authentication method required by the Tor process.
This command may be used before authenticating.
151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 |
# File 'lib/tormanager/control.rb', line 151 def authentication_method @authentication_method ||= begin method = nil send_line('PROTOCOLINFO') loop do # TODO: support for reading multiple authentication methods case reply = read_reply when /^250-AUTH METHODS=(\w*)/ method = $1.strip.downcase.to_sym method = method.eql?(:null) ? nil : method when /^250-/ then next when '250 OK' then break end end method end end |
#close ⇒ void
This method returns an undefined value.
Closes the socket connection to the Tor process.
104 105 106 107 108 |
# File 'lib/tormanager/control.rb', line 104 def close @socket.close if @socket @socket = nil self end |
#config_file ⇒ Pathname
Returns the path to the Tor configuration file.
235 236 237 238 239 240 |
# File 'lib/tormanager/control.rb', line 235 def config_file send_command(:getinfo, 'config-file') reply = read_reply.split('=').last read_reply # skip "250 OK" Pathname(reply) end |
#config_text ⇒ Object
Returns the current (in-memory) Tor configuration. Response is terminated with a “.”
252 253 254 255 256 257 258 259 260 261 262 |
# File 'lib/tormanager/control.rb', line 252 def config_text send_command(:getinfo, 'config-text') reply = "" read_reply # skip "250+config-text=" while line = read_reply break unless line != "." reply.concat(line + "\n") end read_reply # skip "250 OK" return reply end |
#connect ⇒ void
This method returns an undefined value.
Establishes the socket connection to the Tor process.
77 78 79 80 81 82 |
# File 'lib/tormanager/control.rb', line 77 def connect close @socket = TCPSocket.new(@host, @port) @socket.setsockopt(Socket::SOL_SOCKET, Socket::SO_KEEPALIVE, true) self end |
#connected? ⇒ Boolean
Returns true if the controller connection is active.
93 94 95 |
# File 'lib/tormanager/control.rb', line 93 def connected? !!@socket end |
#quit ⇒ void
This method returns an undefined value.
Tells the Tor process to hang up on this controller connection.
This command can be used before authenticating.
124 125 126 127 128 129 |
# File 'lib/tormanager/control.rb', line 124 def quit send_line('QUIT') reply = read_reply close reply end |
#signal(name) ⇒ String
Send a signal to the server
tor.signal(“newnym”)
271 272 273 274 |
# File 'lib/tormanager/control.rb', line 271 def signal(name) send_command(:signal, name) read_reply end |
#version ⇒ String
Returns the version number of the Tor process.
216 217 218 219 220 221 |
# File 'lib/tormanager/control.rb', line 216 def version send_command(:getinfo, 'version') reply = read_reply.split('=').last read_reply # skip "250 OK" reply end |