Class TorControlConnection
- java.lang.Object
-
- net.freehaven.tor.control.TorControlConnection
-
- All Implemented Interfaces:
TorControlCommands
public class TorControlConnection extends java.lang.Object implements TorControlCommands
A connection to a running Tor process as specified in control-spec.txt.
-
-
Nested Class Summary
Nested Classes Modifier and Type Class Description protected classTorControlConnection.ControlParseThread
-
Field Summary
-
Fields inherited from interface net.freehaven.tor.control.TorControlCommands
CIRC_STATUS_BUILT, CIRC_STATUS_CLOSED, CIRC_STATUS_EXTENDED, CIRC_STATUS_FAILED, CIRC_STATUS_LAUNCHED, CIRC_STATUS_NAMES, CMD_ATTACHSTREAM, CMD_AUTH, CMD_CLOSECIRCUIT, CMD_CLOSESTREAM, CMD_CONFVALUE, CMD_DONE, CMD_ERROR, CMD_EVENT, CMD_EXTENDCIRCUIT, CMD_FRAGMENT, CMD_FRAGMENTHEADER, CMD_GETCONF, CMD_GETINFO, CMD_INFOVALUE, CMD_MAPADDRESS, CMD_NAMES, CMD_POSTDESCRIPTOR, CMD_REDIRECTSTREAM, CMD_SAVECONF, CMD_SETCONF, CMD_SETEVENTS, CMD_SIGNAL, ERROR_MSGS, EVENT_BANDWIDTH, EVENT_CIRCSTATUS, EVENT_MSG_DEBUG, EVENT_MSG_ERROR, EVENT_MSG_INFO, EVENT_MSG_NOTICE, EVENT_MSG_WARN, EVENT_NAMES, EVENT_NEWDESCRIPTOR, EVENT_ORCONNSTATUS, EVENT_STREAMSTATUS, HS_ADDRESS, HS_PRIVKEY, OR_CONN_STATUS_CLOSED, OR_CONN_STATUS_CONNECTED, OR_CONN_STATUS_FAILED, OR_CONN_STATUS_LAUNCHED, OR_CONN_STATUS_NAMES, SIGNAL_HUP, SIGNAL_INT, SIGNAL_TERM, SIGNAL_USR1, SIGNAL_USR2, STREAM_STATUS_CLOSED, STREAM_STATUS_DETACHED, STREAM_STATUS_FAILED, STREAM_STATUS_NAMES, STREAM_STATUS_NEW_CONNECT, STREAM_STATUS_NEW_RESOLVE, STREAM_STATUS_SENT_CONNECT, STREAM_STATUS_SENT_RESOLVE, STREAM_STATUS_SUCCEEDED
-
-
Constructor Summary
Constructors Constructor Description TorControlConnection(java.io.InputStream i, java.io.OutputStream o)Create a new TorControlConnection to communicate with Tor over an arbitrary pair of data streams.TorControlConnection(java.io.Reader i, java.io.Writer o)TorControlConnection(java.net.Socket connection)Create a new TorControlConnection to communicate with Tor over a given socket.
-
Method Summary
All Methods Static Methods Instance Methods Concrete Methods Modifier and Type Method Description java.util.Map<java.lang.String,java.lang.String>addOnion(java.lang.String privKey, java.util.Map<java.lang.Integer,java.lang.String> portLines)Tells Tor to set up an onion service using the provided private key.java.util.Map<java.lang.String,java.lang.String>addOnion(java.lang.String privKey, java.util.Map<java.lang.Integer,java.lang.String> portLines, boolean ephemeral, boolean detach)Tells Tor to set up an onion service using the provided private key.java.util.Map<java.lang.String,java.lang.String>addOnion(java.lang.String privKey, java.util.Map<java.lang.Integer,java.lang.String> portLines, java.util.List<java.lang.String> flags)Tells Tor to set up an onion service.java.util.Map<java.lang.String,java.lang.String>addOnion(java.util.Map<java.lang.Integer,java.lang.String> portLines)Tells Tor to generate and set up a new onion service using the best supported algorithm.java.util.Map<java.lang.String,java.lang.String>addOnion(java.util.Map<java.lang.Integer,java.lang.String> portLines, boolean ephemeral, boolean detach)Tells Tor to generate and set up a new onion service using the best supported algorithm.voidattachStream(java.lang.String streamID, java.lang.String circID)Informs the Tor server that the stream specified by streamID should be associated with the circuit specified by circID.voidauthenticate(byte[] auth)Authenticates the controller to the Tor server.protected voidcheckThread()voidcloseCircuit(java.lang.String circID, boolean ifUnused)Tells Tor to close the circuit identified by circID.voidcloseStream(java.lang.String streamID, byte reason)Tells Tor to close the stream identified by streamID.voiddelOnion(java.lang.String hostname)Tells Tor to take down an onion service previously set up with addOnion().java.lang.StringextendCircuit(java.lang.String circID, java.lang.String path)An extendCircuit request takes one of two forms: either the circID is zero, in which case it is a request for the server to build a new circuit according to the specified path, or the circID is nonzero, in which case it is a request for the server to extend an existing circuit with that ID according to the specified path.java.util.List<ConfigEntry>getConf(java.lang.String key)Return the value of the configuration option 'key'java.util.List<ConfigEntry>getConf(java.util.Collection<java.lang.String> keys)Requests the values of the configuration variables listed in keys.java.lang.StringgetInfo(java.lang.String key)Return the value of the information field 'key'java.util.Map<java.lang.String,java.lang.String>getInfo(java.util.Collection<java.lang.String> keys)Queries the Tor server for keyed values that are not stored in the torrc configuration file.protected voidhandleEvent(java.util.ArrayList<net.freehaven.tor.control.TorControlConnection.ReplyLine> events)Helper: decode a CMD_EVENT command and dispatch it to our EventHandler (if any).java.lang.ThreadlaunchThread(boolean daemon)Start a thread to react to Tor's responses in the background.java.lang.StringmapAddress(java.lang.String fromAddr, java.lang.String toAddr)java.util.Map<java.lang.String,java.lang.String>mapAddresses(java.util.Collection<java.lang.String> kvLines)Tells the Tor server that future SOCKS requests for connections to a set of original addresses should be replaced with connections to the specified replacement addresses.java.util.Map<java.lang.String,java.lang.String>mapAddresses(java.util.Map<java.lang.String,java.lang.String> addresses)java.lang.StringpostDescriptor(java.lang.String desc)Tells Tor about the server descriptor in desc.protected static java.lang.Stringquote(java.lang.String s)protected voidreact()helper: implement the main background loop.protected java.util.ArrayList<net.freehaven.tor.control.TorControlConnection.ReplyLine>readReply()voidredirectStream(java.lang.String streamID, java.lang.String address)Tells Tor to change the exit address of the stream identified by streamID to address.voidresetConf(java.util.Collection<java.lang.String> keys)Try to reset the values listed in the collection 'keys' to their default values.voidsaveConf()Instructs the server to write out its configuration options into its torrc.protected java.util.List<net.freehaven.tor.control.TorControlConnection.ReplyLine>sendAndWaitForResponse(java.lang.String s, java.lang.String rest)voidsetConf(java.lang.String key, java.lang.String value)Change the value of the configuration option 'key' to 'val'.voidsetConf(java.util.Collection<java.lang.String> kvList)Changes the values of the configuration options stored in kvList.voidsetConf(java.util.Map<java.lang.String,java.lang.String> kvMap)Change the values of the configuration options stored in kvMap.voidsetDebugging(java.io.PrintStream s)Sets s as the PrintStream for debugging output, which writes out all messages passed between Tor and the controller.voidsetDebugging(java.io.PrintWriter w)Sets w as the PrintWriter for debugging output, which writes out all messages passed between Tor and the controller.voidsetEventHandler(EventHandler handler)Set the EventHandler object that will be notified of any events Tor delivers to this connection.voidsetEvents(java.util.List<java.lang.String> events)Request that the server inform the client about interesting events.voidshutdownTor(java.lang.String signal)Send a signal to the Tor process to shut it down or halt it.voidsignal(java.lang.String signal)Sends a signal from the controller to the Tor server.voidtakeOwnership()Tells Tor to exit when this control connection is closed.protected voidwriteEscaped(java.lang.String s)
-
-
-
Constructor Detail
-
TorControlConnection
public TorControlConnection(java.net.Socket connection) throws java.io.IOExceptionCreate a new TorControlConnection to communicate with Tor over a given socket. After calling this constructor, it is typical to call launchThread and authenticate.- Throws:
java.io.IOException
-
TorControlConnection
public TorControlConnection(java.io.InputStream i, java.io.OutputStream o)Create a new TorControlConnection to communicate with Tor over an arbitrary pair of data streams.
-
TorControlConnection
public TorControlConnection(java.io.Reader i, java.io.Writer o)
-
-
Method Detail
-
writeEscaped
protected final void writeEscaped(java.lang.String s) throws java.io.IOException- Throws:
java.io.IOException
-
quote
protected static java.lang.String quote(java.lang.String s)
-
readReply
protected final java.util.ArrayList<net.freehaven.tor.control.TorControlConnection.ReplyLine> readReply() throws java.io.IOException- Throws:
java.io.IOException
-
sendAndWaitForResponse
protected java.util.List<net.freehaven.tor.control.TorControlConnection.ReplyLine> sendAndWaitForResponse(java.lang.String s, java.lang.String rest) throws java.io.IOException- Throws:
java.io.IOException
-
handleEvent
protected void handleEvent(java.util.ArrayList<net.freehaven.tor.control.TorControlConnection.ReplyLine> events)
Helper: decode a CMD_EVENT command and dispatch it to our EventHandler (if any).
-
setDebugging
public void setDebugging(java.io.PrintWriter w)
Sets w as the PrintWriter for debugging output, which writes out all messages passed between Tor and the controller. Outgoing messages are preceded by "\>\>" and incoming messages are preceded by "\<\<"
-
setDebugging
public void setDebugging(java.io.PrintStream s)
Sets s as the PrintStream for debugging output, which writes out all messages passed between Tor and the controller. Outgoing messages are preceded by "\>\>" and incoming messages are preceded by "\<\<"
-
setEventHandler
public void setEventHandler(EventHandler handler)
Set the EventHandler object that will be notified of any events Tor delivers to this connection. To make Tor send us events, call setEvents().
-
launchThread
public java.lang.Thread launchThread(boolean daemon)
Start a thread to react to Tor's responses in the background. This is necessary to handle asynchronous events and synchronous responses that arrive independantly over the same socket.
-
checkThread
protected void checkThread()
-
react
protected void react() throws java.io.IOExceptionhelper: implement the main background loop.- Throws:
java.io.IOException
-
setConf
public void setConf(java.lang.String key, java.lang.String value) throws java.io.IOExceptionChange the value of the configuration option 'key' to 'val'.- Throws:
java.io.IOException
-
setConf
public void setConf(java.util.Map<java.lang.String,java.lang.String> kvMap) throws java.io.IOExceptionChange the values of the configuration options stored in kvMap.- Throws:
java.io.IOException
-
setConf
public void setConf(java.util.Collection<java.lang.String> kvList) throws java.io.IOExceptionChanges the values of the configuration options stored in kvList. Each list element in kvList is expected to be String of the format "key value".Tor behaves as though it had just read each of the key-value pairs from its configuration file. Keywords with no corresponding values have their configuration values reset to their defaults. setConf is all-or-nothing: if there is an error in any of the configuration settings, Tor sets none of them.
When a configuration option takes multiple values, or when multiple configuration keys form a context-sensitive group (see getConf below), then setting any of the options in a setConf command is taken to reset all of the others. For example, if two ORBindAddress values are configured, and a command arrives containing a single ORBindAddress value, the new command's value replaces the two old values.
To remove all settings for a given option entirely (and go back to its default value), include a String in kvList containing the key and no value.
- Throws:
java.io.IOException
-
resetConf
public void resetConf(java.util.Collection<java.lang.String> keys) throws java.io.IOExceptionTry to reset the values listed in the collection 'keys' to their default values.- Throws:
java.io.IOException
-
getConf
public java.util.List<ConfigEntry> getConf(java.lang.String key) throws java.io.IOException
Return the value of the configuration option 'key'- Throws:
java.io.IOException
-
getConf
public java.util.List<ConfigEntry> getConf(java.util.Collection<java.lang.String> keys) throws java.io.IOException
Requests the values of the configuration variables listed in keys. Results are returned as a list of ConfigEntry objects.If an option appears multiple times in the configuration, all of its key-value pairs are returned in order.
Some options are context-sensitive, and depend on other options with different keywords. These cannot be fetched directly. Currently there is only one such option: clients should use the "HiddenServiceOptions" virtual keyword to get all HiddenServiceDir, HiddenServicePort, HiddenServiceNodes, and HiddenServiceExcludeNodes option settings.
- Throws:
java.io.IOException
-
setEvents
public void setEvents(java.util.List<java.lang.String> events) throws java.io.IOExceptionRequest that the server inform the client about interesting events. Each element of events is one of the following Strings: ["CIRC" | "STREAM" | "ORCONN" | "BW" | "DEBUG" | "INFO" | "NOTICE" | "WARN" | "ERR" | "NEWDESC" | "ADDRMAP"] .Any events not listed in the events are turned off; thus, calling setEvents with an empty events argument turns off all event reporting.
- Throws:
java.io.IOException
-
authenticate
public void authenticate(byte[] auth) throws java.io.IOExceptionAuthenticates the controller to the Tor server.By default, the current Tor implementation trusts all local users, and the controller can authenticate itself by calling authenticate(new byte[0]).
If the 'CookieAuthentication' option is true, Tor writes a "magic cookie" file named "control_auth_cookie" into its data directory. To authenticate, the controller must send the contents of this file in auth.
If the 'HashedControlPassword' option is set, auth must contain the salted hash of a secret password. The salted hash is computed according to the S2K algorithm in RFC 2440 (OpenPGP), and prefixed with the s2k specifier. This is then encoded in hexadecimal, prefixed by the indicator sequence "16:".
You can generate the salt of a password by calling 'tor --hash-password
' or by using the provided PasswordDigest class. To authenticate under this scheme, the controller sends Tor the original secret that was used to generate the password. - Throws:
java.io.IOException
-
saveConf
public void saveConf() throws java.io.IOExceptionInstructs the server to write out its configuration options into its torrc.- Throws:
java.io.IOException
-
signal
public void signal(java.lang.String signal) throws java.io.IOExceptionSends a signal from the controller to the Tor server. signal is one of the following Strings:- "RELOAD" or "HUP" : Reload config items, refetch directory
- "SHUTDOWN" or "INT" : Controlled shutdown: if server is an OP, exit immediately. If it's an OR, close listeners and exit after 30 seconds
- "DUMP" or "USR1" : Dump stats: log information about open connections and circuits
- "DEBUG" or "USR2" : Debug: switch all open logs to loglevel debug
- "HALT" or "TERM" : Immediate shutdown: clean up and exit now
- Throws:
java.io.IOException
-
shutdownTor
public void shutdownTor(java.lang.String signal) throws java.io.IOExceptionSend a signal to the Tor process to shut it down or halt it. Does not wait for a response.- Throws:
java.io.IOException
-
mapAddresses
public java.util.Map<java.lang.String,java.lang.String> mapAddresses(java.util.Collection<java.lang.String> kvLines) throws java.io.IOExceptionTells the Tor server that future SOCKS requests for connections to a set of original addresses should be replaced with connections to the specified replacement addresses. Each element of kvLines is a String of the form "old-address new-address". This function returns the new address mapping.The client may decline to provide a body for the original address, and instead send a special null address ("0.0.0.0" for IPv4, "::0" for IPv6, or "." for hostname), signifying that the server should choose the original address itself, and return that address in the reply. The server should ensure that it returns an element of address space that is unlikely to be in actual use. If there is already an address mapped to the destination address, the server may reuse that mapping.
If the original address is already mapped to a different address, the old mapping is removed. If the original address and the destination address are the same, the server removes any mapping in place for the original address.
Mappings set by the controller last until the Tor process exits: they never expire. If the controller wants the mapping to last only a certain time, then it must explicitly un-map the address when that time has elapsed.
- Throws:
java.io.IOException
-
mapAddresses
public java.util.Map<java.lang.String,java.lang.String> mapAddresses(java.util.Map<java.lang.String,java.lang.String> addresses) throws java.io.IOException- Throws:
java.io.IOException
-
mapAddress
public java.lang.String mapAddress(java.lang.String fromAddr, java.lang.String toAddr) throws java.io.IOException- Throws:
java.io.IOException
-
getInfo
public java.util.Map<java.lang.String,java.lang.String> getInfo(java.util.Collection<java.lang.String> keys) throws java.io.IOExceptionQueries the Tor server for keyed values that are not stored in the torrc configuration file. Returns a map of keys to values.Recognized keys include:
- "version" : The version of the server's software, including the name of the software. (example: "Tor 0.0.9.4")
- "desc/id/
" or "desc/name/ " : the latest server descriptor for a given OR, NUL-terminated. If no such OR is known, the corresponding value is an empty string. - "network-status" : a space-separated list of all known OR identities. This is in the same format as the router-status line in directories; see tor-spec.txt for details.
- "addr-mappings/all"
- "addr-mappings/config"
- "addr-mappings/cache"
- "addr-mappings/control" : a space-separated list of address mappings, each in the form of "from-address=to-address". The 'config' key returns those address mappings set in the configuration; the 'cache' key returns the mappings in the client-side DNS cache; the 'control' key returns the mappings set via the control interface; the 'all' target returns the mappings set through any mechanism.
- "circuit-status" : A series of lines as for a circuit status event. Each line is of the form: "CircuitID CircStatus Path"
- "stream-status" : A series of lines as for a stream status event. Each is of the form: "StreamID StreamStatus CircID Target"
- "orconn-status" : A series of lines as for an OR connection status event. Each is of the form: "ServerID ORStatus"
- Throws:
java.io.IOException
-
getInfo
public java.lang.String getInfo(java.lang.String key) throws java.io.IOExceptionReturn the value of the information field 'key'- Throws:
java.io.IOException
-
extendCircuit
public java.lang.String extendCircuit(java.lang.String circID, java.lang.String path) throws java.io.IOExceptionAn extendCircuit request takes one of two forms: either the circID is zero, in which case it is a request for the server to build a new circuit according to the specified path, or the circID is nonzero, in which case it is a request for the server to extend an existing circuit with that ID according to the specified path.If successful, returns the Circuit ID of the (maybe newly created) circuit.
- Throws:
java.io.IOException
-
attachStream
public void attachStream(java.lang.String streamID, java.lang.String circID) throws java.io.IOExceptionInforms the Tor server that the stream specified by streamID should be associated with the circuit specified by circID.Each stream may be associated with at most one circuit, and multiple streams may share the same circuit. Streams can only be attached to completed circuits (that is, circuits that have sent a circuit status "BUILT" event or are listed as built in a getInfo circuit-status request).
If circID is 0, responsibility for attaching the given stream is returned to Tor.
By default, Tor automatically attaches streams to circuits itself, unless the configuration variable "__LeaveStreamsUnattached" is set to "1". Attempting to attach streams via TC when "__LeaveStreamsUnattached" is false may cause a race between Tor and the controller, as both attempt to attach streams to circuits.
- Throws:
java.io.IOException
-
postDescriptor
public java.lang.String postDescriptor(java.lang.String desc) throws java.io.IOExceptionTells Tor about the server descriptor in desc.The descriptor, when parsed, must contain a number of well-specified fields, including fields for its nickname and identity.
- Throws:
java.io.IOException
-
redirectStream
public void redirectStream(java.lang.String streamID, java.lang.String address) throws java.io.IOExceptionTells Tor to change the exit address of the stream identified by streamID to address. No remapping is performed on the new provided address.To be sure that the modified address will be used, this event must be sent after a new stream event is received, and before attaching this stream to a circuit.
- Throws:
java.io.IOException
-
closeStream
public void closeStream(java.lang.String streamID, byte reason) throws java.io.IOExceptionTells Tor to close the stream identified by streamID. reason should be one of the Tor RELAY_END reasons given in tor-spec.txt, as a decimal:- 1 -- REASON_MISC (catch-all for unlisted reasons)
- 2 -- REASON_RESOLVEFAILED (couldn't look up hostname)
- 3 -- REASON_CONNECTREFUSED (remote host refused connection)
- 4 -- REASON_EXITPOLICY (OR refuses to connect to host or port)
- 5 -- REASON_DESTROY (Circuit is being destroyed)
- 6 -- REASON_DONE (Anonymized TCP connection was closed)
- 7 -- REASON_TIMEOUT (Connection timed out, or OR timed out while connecting)
- 8 -- (unallocated)
- 9 -- REASON_HIBERNATING (OR is temporarily hibernating)
- 10 -- REASON_INTERNAL (Internal error at the OR)
- 11 -- REASON_RESOURCELIMIT (OR has no resources to fulfill request)
- 12 -- REASON_CONNRESET (Connection was unexpectedly reset)
- 13 -- REASON_TORPROTOCOL (Sent when closing connection because of Tor protocol violations)
Tor may hold the stream open for a while to flush any data that is pending.
- Throws:
java.io.IOException
-
closeCircuit
public void closeCircuit(java.lang.String circID, boolean ifUnused) throws java.io.IOExceptionTells Tor to close the circuit identified by circID. If ifUnused is true, do not close the circuit unless it is unused.- Throws:
java.io.IOException
-
takeOwnership
public void takeOwnership() throws java.io.IOExceptionTells Tor to exit when this control connection is closed. This command was added in Tor 0.2.2.28-beta.- Throws:
java.io.IOException
-
addOnion
public java.util.Map<java.lang.String,java.lang.String> addOnion(java.util.Map<java.lang.Integer,java.lang.String> portLines) throws java.io.IOExceptionTells Tor to generate and set up a new onion service using the best supported algorithm. ADD_ONION was added in Tor 0.2.7.1-alpha.- Throws:
java.io.IOException
-
addOnion
public java.util.Map<java.lang.String,java.lang.String> addOnion(java.util.Map<java.lang.Integer,java.lang.String> portLines, boolean ephemeral, boolean detach) throws java.io.IOExceptionTells Tor to generate and set up a new onion service using the best supported algorithm. ADD_ONION was added in Tor 0.2.7.1-alpha.- Throws:
java.io.IOException
-
addOnion
public java.util.Map<java.lang.String,java.lang.String> addOnion(java.lang.String privKey, java.util.Map<java.lang.Integer,java.lang.String> portLines) throws java.io.IOExceptionTells Tor to set up an onion service using the provided private key. ADD_ONION was added in Tor 0.2.7.1-alpha.- Throws:
java.io.IOException
-
addOnion
public java.util.Map<java.lang.String,java.lang.String> addOnion(java.lang.String privKey, java.util.Map<java.lang.Integer,java.lang.String> portLines, boolean ephemeral, boolean detach) throws java.io.IOExceptionTells Tor to set up an onion service using the provided private key. ADD_ONION was added in Tor 0.2.7.1-alpha.- Throws:
java.io.IOException
-
addOnion
public java.util.Map<java.lang.String,java.lang.String> addOnion(java.lang.String privKey, java.util.Map<java.lang.Integer,java.lang.String> portLines, java.util.List<java.lang.String> flags) throws java.io.IOExceptionTells Tor to set up an onion service. ADD_ONION was added in Tor 0.2.7.1-alpha.- Throws:
java.io.IOException
-
delOnion
public void delOnion(java.lang.String hostname) throws java.io.IOExceptionTells Tor to take down an onion service previously set up with addOnion(). The hostname excludes the .onion extension. DEL_ONION was added in Tor 0.2.7.1-alpha.- Throws:
java.io.IOException
-
-