[Author Prev][Author Next][Thread Prev][Thread Next][Author Index][Thread Index]
[or-cvs] Merge doc patches and a bugfix from Mark Melahn
Update of /home/or/cvsroot/control/java/net/freehaven/tor/control
In directory moria:/tmp/cvs-serv13464/java/net/freehaven/tor/control
Modified Files:
EventHandler.java TorControlConnection1.java
Log Message:
Merge doc patches and a bugfix from Mark Melahn
Index: EventHandler.java
===================================================================
RCS file: /home/or/cvsroot/control/java/net/freehaven/tor/control/EventHandler.java,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -d -r1.4 -r1.5
--- EventHandler.java 11 Jul 2005 19:14:18 -0000 1.4
+++ EventHandler.java 23 Jul 2005 01:17:27 -0000 1.5
@@ -12,34 +12,63 @@
public interface EventHandler {
/**
* Invoked when a circuit's status has changed.
- * See TorControlCommands.CIRC_STATUS_* for possible status codes.
+ * Possible values for <b>status</b> are:
+ * <ul>
+ * <li>"LAUNCHED" : circuit ID assigned to new circuit</li>
+ * <li>"BUILT" : all hops finished, can now accept streams</li>
+ * <li>"EXTENDED" : one more hop has been completed</li>
+ * <li>"FAILED" : circuit closed (was not built)</li>
+ * <li>"CLOSED" : circuit closed (was built)</li>
+ * </ul>
+ *
+ * <b>circID</b> is the alphanumeric identifier of the affected circuit,
+ * and <b>path</b> is a comma-separated list of alphanumeric ServerIDs.
*/
public void circuitStatus(String status, String circID, String path);
/**
* Invoked when a stream's status has changed.
- * See TorControlCommands.STREAM_STATUS_* for possible status codes.
+ * Possible values for <b>status</b> are:
+ * <ul>
+ * <li>"NEW" : New request to connect</li>
+ * <li>"NEWRESOLVE" : New request to resolve an address</li>
+ * <li>"SENTCONNECT" : Sent a connect cell along a circuit</li>
+ * <li>"SENTRESOLVE" : Sent a resolve cell along a circuit</li>
+ * <li>"SUCCEEDED" : Received a reply; stream established</li>
+ * <li>"FAILED" : Stream failed and not retriable.</li>
+ * <li>"CLOSED" : Stream closed</li>
+ * <li>"DETACHED" : Detached from circuit; still retriable.</li>
+ * </ul>
+ *
+ * <b>streamID</b> is the alphanumeric identifier of the affected stream,
+ * and its <b>target</b> is specified as address:port.
*/
public void streamStatus(String status, String streamID, String target);
/**
* Invoked when the status of a connection to an OR has changed.
- * See TorControlCommands.OR_CONN_STATUS_* for possible status codes.
+ * Possible values for <b>status</b> are ["LAUNCHED" | "CONNECTED" | "FAILED" | "CLOSED"].
+ * <b>orName</b> is the alphanumeric identifier of the OR affected.
*/
public void orConnStatus(String status, String orName);
/**
- * Invoked once per second with the number of bytes read an written in
- * the last secone.
+ * Invoked once per second. <b>read</b> and <b>written</b> are
+ * the number of bytes read and written, respectively, in
+ * the last second.
*/
public void bandwidthUsed(long read, long written);
/**
- * Invoked whenever Tor learns about new ORs.
+ * Invoked whenever Tor learns about new ORs. The <b>orList</b> object
+ * contains the alphanumeric ServerIDs associated with the new ORs.
*/
public void newDescriptors(java.util.List orList);
/**
* Invoked when Tor logs a message.
+ * <b>severity</b> is one of ["DEBUG" | "INFO" | "NOTICE" | "WARN" | "ERR"],
+ * and <b>msg</b> is the message string.
*/
public void message(String severity, String msg);
/**
- * Invoked in an unspecified handler.
+ * Invoked when an unspecified message is received.
+ * <type> is the message type, and <msg> is the message string.
*/
public void unrecognized(String type, String msg);
Index: TorControlConnection1.java
===================================================================
RCS file: /home/or/cvsroot/control/java/net/freehaven/tor/control/TorControlConnection1.java,v
retrieving revision 1.6
retrieving revision 1.7
diff -u -d -r1.6 -r1.7
--- TorControlConnection1.java 20 Jul 2005 22:48:34 -0000 1.6
+++ TorControlConnection1.java 23 Jul 2005 01:17:27 -0000 1.7
@@ -13,7 +13,9 @@
import java.util.Map;
import java.util.StringTokenizer;
-/** DOCDOC */
+/** Extends the TorControlConnection class to implement Version 1
+* of the TC protocol, as specified in control-spec.txt.
+*/
public class TorControlConnection1 extends TorControlConnection
implements TorControlCommands
{
@@ -211,8 +213,26 @@
}
}
- /** Change the values of the configuration options stored in
- * 'kvList'. (The format is "key value"). */
+ /** Changes the values of the configuration options stored in
+ * <b>kvList</b>. Each list element in <b>kvList</b> 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 <b>kvList</b> containing the key and no value.
+ */
public void setConf(Collection kvList) throws IOException {
if (kvList.size() == 0)
return;
@@ -229,16 +249,39 @@
sendAndWaitForResponse(b.toString(), null);
}
+ /** Sets <b>w</b> 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 "\<\<"
+ */
public void setDebugging(java.io.PrintWriter w) {
if (w instanceof java.io.PrintWriter)
debugOutput = (java.io.PrintWriter) w;
else
debugOutput = new java.io.PrintWriter(w, true);
}
+
+ /** Sets <b>s</b> 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 "\<\<"
+ */
public void setDebugging(java.io.PrintStream s) {
debugOutput = new java.io.PrintWriter(s, true);
}
-
+
+ /** Requests the values of the configuration variables listed in <b>keys</b>.
+ * 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.
+ */
public List getConf(Collection keys) throws IOException {
StringBuffer sb = new StringBuffer("GETCONF");
for (Iterator it = keys.iterator(); it.hasNext(); ) {
@@ -256,7 +299,15 @@
}
return result;
}
-
+
+ /** Request that the server inform the client about interesting events.
+ * Each element of <b>events</b> is one of the following Strings:
+ * ["CIRC" | "STREAM" | "ORCONN" | "BW" | "DEBUG" |
+ * "INFO" | "NOTICE" | "WARN" | "ERR" | "NEWDESC" | "ADDRMAP"] .
+ *
+ * Any events not listed in the <b>events</b> are turned off; thus, calling
+ * setEvents with an empty <b>events</b> argument turns off all event reporting.
+ */
public void setEvents(List events) throws IOException {
StringBuffer sb = new StringBuffer("SETEVENTS");
for (Iterator it = events.iterator(); it.hasNext(); ) {
@@ -271,21 +322,78 @@
sb.append("\r\n");
sendAndWaitForResponse(sb.toString(), null);
}
-
+
+
+ /** Authenticates 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 <b>auth</b>.
+ *
+ * If the 'HashedControlPassword' option is set, <b>auth</b> 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 <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.
+ */
public void authenticate(byte[] auth) throws IOException {
String cmd = "AUTHENTICATE " + Bytes.hex(auth) + "\r\n";
sendAndWaitForResponse(cmd, null);
}
+ /** Instructs the server to write out its configuration options into its torrc.
+ */
public void saveConf() throws IOException {
sendAndWaitForResponse("SAVECONF\r\n", null);
}
+ /** Sends a signal from the controller to the Tor server.
+ * <b>signal</b> is one of the following Strings:
+ * <ul>
+ * <li>"RELOAD" or "HUP" : Reload config items, refetch directory</li>
+ * <li>"SHUTDOWN" or "INT" : Controlled shutdown: if server is an OP, exit immediately.
+ * If it's an OR, close listeners and exit after 30 seconds</li>
+ * <li>"DUMP" or "USR1" : Dump stats: log information about open connections and circuits</li>
+ * <li>"DEBUG" or "USR2" : Debug: switch all open logs to loglevel debug</li>
+ * <li>"HALT" or "TERM" : Immediate shutdown: clean up and exit now</li>
+ * </ul>
+ */
public void signal(String signal) throws IOException {
- String cmd = "AUTHENTICATE " + signal + "\r\n";
+ String cmd = "SIGNAL" + signal + "\r\n";
sendAndWaitForResponse(cmd, null);
}
-
+ /** 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. Each element of <b>kvLines</b> 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.
+ */
public Map mapAddresses(Collection kvLines) throws IOException {
StringBuffer sb = new StringBuffer("MAPADDRESS");
for (Iterator it = kvLines.iterator(); it.hasNext(); ) {
@@ -305,7 +413,37 @@
}
return result;
}
-
+
+ /** Queries 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:
+ * <ul>
+ * <li>"version" : The version of the server's software, including the name
+ * of the software. (example: "Tor 0.0.9.4")</li>
+ * <li>"desc/id/<OR identity>" or "desc/name/<OR nickname>" : the latest server
+ * descriptor for a given OR, NUL-terminated. If no such OR is known, the
+ * corresponding value is an empty string.</li>
+ * <li>"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.</li>
+ * <li>"addr-mappings/all"</li>
+ * <li>"addr-mappings/config"</li>
+ * <li>"addr-mappings/cache"</li>
+ * <li>"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.</li>
+ * <li>"circuit-status" : A series of lines as for a circuit status event. Each line is of the form:
+ * "CircuitID CircStatus Path"</li>
+ * <li>"stream-status" : A series of lines as for a stream status event. Each is of the form:
+ * "StreamID StreamStatus CircID Target"</li>
+ * <li>"orconn-status" : A series of lines as for an OR connection status event. Each is of the
+ * form: "ServerID ORStatus"</li>
+ * </ul>
+ */
public Map getInfo(Collection keys) throws IOException {
StringBuffer sb = new StringBuffer("GETINFO");
for (Iterator it = keys.iterator(); it.hasNext(); ) {
@@ -330,41 +468,96 @@
}
return m;
}
-
+
+ /** An extendCircuit request takes one of two forms: either the <b>circID</b> is zero, in
+ * which case it is a request for the server to build a new circuit according
+ * to the specified path, or the <b>circID</b> is nonzero, in which case it is a
+ * request for the server to extend an existing circuit with that ID according
+ * to the specified <b>path</b>.
+ *
+ * If successful, returns the Circuit ID of the (maybe newly created) circuit.
+ */
public String extendCircuit(String circID, String path) throws IOException {
ArrayList lst = sendAndWaitForResponse(
"EXTENDCIRCUIT "+circID+" "+path+"\r\n", null);
return ((ReplyLine)lst.get(0)).msg;
}
-
+
+ /** Informs the Tor server that the stream specified by <b>streamID</b> should be
+ * associated with the circuit specified by <b>circID</b>.
+ *
+ * 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 <b>circID</b> 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.
+ */
public void attachStream(String streamID, String circID)
throws IOException {
sendAndWaitForResponse("ATTACHSTREAM "+streamID+" "+circID+"\r\n", null);
}
- /** Tell Tor about the server descriptor in 'desc' */
+ /** Tells Tor about the server descriptor in <b>desc</b>.
+ *
+ * The descriptor, when parsed, must contain a number of well-specified
+ * fields, including fields for its nickname and identity.
+ */
+ // More documentation here on format of desc?
+ // No need for return value? control-spec.txt says reply is merely "250 OK" on success...
public String postDescriptor(String desc) throws IOException {
ArrayList lst = sendAndWaitForResponse("+POSTDESCRIPTOR\r\n", desc);
return ((ReplyLine)lst.get(0)).msg;
}
- /** Tell Tor to change the target of the stream identified by 'streamID'
- * to 'address'.
+ /** Tells Tor to change the exit address of the stream identified by <b>streamID</b>
+ * to <b>address</b>. 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.
*/
public void redirectStream(String streamID, String address) throws IOException {
sendAndWaitForResponse("REDIRECTSTREAM "+streamID+" "+address+"\r\n",
null);
}
- /** Tell Tor to close the stream identified by 'streamID'.
- */
+ /** Tells Tor to close the stream identified by <b>streamID</b>.
+ * <b>reason</b> should be one of the Tor RELAY_END reasons given in tor-spec.txt, as a decimal:
+ * <ul>
+ * <li>1 -- REASON_MISC (catch-all for unlisted reasons)</li>
+ * <li>2 -- REASON_RESOLVEFAILED (couldn't look up hostname)</li>
+ * <li>3 -- REASON_CONNECTREFUSED (remote host refused connection)</li>
+ * <li>4 -- REASON_EXITPOLICY (OR refuses to connect to host or port)</li>
+ * <li>5 -- REASON_DESTROY (Circuit is being destroyed)</li>
+ * <li>6 -- REASON_DONE (Anonymized TCP connection was closed)</li>
+ * <li>7 -- REASON_TIMEOUT (Connection timed out, or OR timed out while connecting)</li>
+ * <li>8 -- (unallocated)</li>
+ * <li>9 -- REASON_HIBERNATING (OR is temporarily hibernating)</li>
+ * <li>10 -- REASON_INTERNAL (Internal error at the OR)</li>
+ * <li>11 -- REASON_RESOURCELIMIT (OR has no resources to fulfill request)</li>
+ * <li>12 -- REASON_CONNRESET (Connection was unexpectedly reset)</li>
+ * <li>13 -- REASON_TORPROTOCOL (Sent when closing connection because of Tor protocol violations)</li>
+ * </ul>
+ *
+ * Tor may hold the stream open for a while to flush any data that is pending.
+ */
public void closeStream(String streamID, byte reason)
throws IOException {
sendAndWaitForResponse("CLOSESTREAM "+streamID+" "+reason+"\r\n",null);
}
- /** Tell Tor to close the circuit identified by 'streamID'.
- */
+ /** Tells Tor to close the circuit identified by <b>circID</b>.
+ * If <b>ifUnused</b> is true, do not close the circuit unless it is unused.
+ */
public void closeCircuit(String circID, boolean ifUnused) throws IOException {
sendAndWaitForResponse("CLOSECIRCUIT "+circID+
(ifUnused?" IFUNUSED":"")+"\r\n", null);