Browse Source

Fix the first part of bug 681, as suggested by Robert Hogan on or-talk.

svn:r14754
Nick Mathewson 16 years ago
parent
commit
4ea2a4595e
4 changed files with 41 additions and 2 deletions
  1. 2 0
      ChangeLog
  2. 10 0
      doc/spec/control-spec.txt
  3. 23 2
      src/or/control.c
  4. 6 0
      src/or/or.h

+ 2 - 0
ChangeLog

@@ -98,6 +98,8 @@ Changes in version 0.2.1.1-alpha - 2008-??-??
       patch to their OpenSSL, turn it on to save memory on servers.  This
       patch to their OpenSSL, turn it on to save memory on servers.  This
       patch will (with any luck) get included in a mainline distribution
       patch will (with any luck) get included in a mainline distribution
       before too long.
       before too long.
+    - Add a "PURPOSE=" argument to "STREAM NEW" events, as suggested by
+      Robert Hogan. Fixes the first part of bug 681.
 
 
   o Minor features (security):
   o Minor features (security):
     - Reject requests for reverse-dns lookup of names in a private
     - Reject requests for reverse-dns lookup of names in a private

+ 10 - 0
doc/spec/control-spec.txt

@@ -988,6 +988,7 @@ $Id$
       "650" SP "STREAM" SP StreamID SP StreamStatus SP CircID SP Target
       "650" SP "STREAM" SP StreamID SP StreamStatus SP CircID SP Target
           [SP "REASON=" Reason [ SP "REMOTE_REASON=" Reason ]]
           [SP "REASON=" Reason [ SP "REMOTE_REASON=" Reason ]]
           [SP "SOURCE=" Source] [ SP "SOURCE_ADDR=" Address ":" Port ]
           [SP "SOURCE=" Source] [ SP "SOURCE_ADDR=" Address ":" Port ]
+          [SP "PURPOSE=" Purpose]
           CRLF
           CRLF
 
 
       StreamStatus =
       StreamStatus =
@@ -1037,6 +1038,15 @@ $Id$
    that requested the connection, and can be (e.g.) used to look up the
    that requested the connection, and can be (e.g.) used to look up the
    requesting program.
    requesting program.
 
 
+
+      Purpose = "DIR_FETCH" / "UPLOAD_DESC" / "DNS_REQUEST" /
+                 "USER" /  "DIRPORT_TEST"
+
+   The "PURPOSE" field is provided only for NEW and NEWRESOLVE events, and
+   only if extended events are enabled (see 3.19).  Clients MUST accept
+   purposes not listed above.
+
+
 4.1.3. OR Connection status changed
 4.1.3. OR Connection status changed
 
 
   The syntax is:
   The syntax is:

+ 23 - 2
src/or/control.c

@@ -3108,6 +3108,7 @@ control_event_stream_status(edge_connection_t *conn, stream_status_event_t tp,
   circuit_t *circ;
   circuit_t *circ;
   origin_circuit_t *origin_circ = NULL;
   origin_circuit_t *origin_circ = NULL;
   char buf[256];
   char buf[256];
+  const char *purpose = "";
   tor_assert(conn->socks_request);
   tor_assert(conn->socks_request);
 
 
   if (!EVENT_IS_INTERESTING(EVENT_STREAM_STATUS))
   if (!EVENT_IS_INTERESTING(EVENT_STREAM_STATUS))
@@ -3175,15 +3176,35 @@ control_event_stream_status(edge_connection_t *conn, stream_status_event_t tp,
     addrport_buf[0] = '\0';
     addrport_buf[0] = '\0';
   }
   }
 
 
+  if (tp == STREAM_EVENT_NEW_RESOLVE) {
+    purpose = " PURPOSE=DNS_REQUEST";
+  } else if (tp == STREAM_EVENT_NEW) {
+    if (conn->is_dns_request ||
+        (conn->socks_request &&
+         SOCKS_COMMAND_IS_RESOLVE(conn->socks_request->command)))
+      purpose = " PURPOSE=DNS_REQUEST";
+    else if (conn->use_begindir) {
+      connection_t *linked = TO_CONN(conn)->linked_conn;
+      int linked_dir_purpose = -1;
+      if (linked && linked->type == CONN_TYPE_DIR)
+        linked_dir_purpose = linked->purpose;
+      if (DIR_PURPOSE_IS_UPLOAD(linked_dir_purpose))
+        purpose = " PURPOSE=DIR_UPLOAD";
+      else
+        purpose = " PURPOSE=DIR_FETCH";
+    } else
+      purpose = " PURPOSE=USER";
+  }
+
   circ = circuit_get_by_edge_conn(conn);
   circ = circuit_get_by_edge_conn(conn);
   if (circ && CIRCUIT_IS_ORIGIN(circ))
   if (circ && CIRCUIT_IS_ORIGIN(circ))
     origin_circ = TO_ORIGIN_CIRCUIT(circ);
     origin_circ = TO_ORIGIN_CIRCUIT(circ);
   send_control_event_extended(EVENT_STREAM_STATUS, ALL_NAMES,
   send_control_event_extended(EVENT_STREAM_STATUS, ALL_NAMES,
-                        "650 STREAM %lu %s %lu %s@%s%s\r\n",
+                        "650 STREAM %lu %s %lu %s@%s%s%s\r\n",
                         (unsigned long)conn->global_identifier, status,
                         (unsigned long)conn->global_identifier, status,
                         origin_circ?
                         origin_circ?
                            (unsigned long)origin_circ->global_identifier : 0ul,
                            (unsigned long)origin_circ->global_identifier : 0ul,
-                        buf, reason_buf, addrport_buf);
+                        buf, reason_buf, addrport_buf, purpose);
 
 
   /* XXX need to specify its intended exit, etc? */
   /* XXX need to specify its intended exit, etc? */
 
 

+ 6 - 0
src/or/or.h

@@ -369,6 +369,12 @@ typedef enum {
 #define DIR_PURPOSE_FETCH_RENDDESC_V2 18
 #define DIR_PURPOSE_FETCH_RENDDESC_V2 18
 #define _DIR_PURPOSE_MAX 18
 #define _DIR_PURPOSE_MAX 18
 
 
+#define DIR_PURPOSE_IS_UPLOAD(p)                \
+  ((p)==DIR_PURPOSE_UPLOAD_DIR ||               \
+   (p)==DIR_PURPOSE_UPLOAD_RENDDESC ||          \
+   (p)==DIR_PURPOSE_UPLOAD_VOTE ||              \
+   (p)==DIR_PURPOSE_UPLOAD_SIGNATURES)
+
 #define _EXIT_PURPOSE_MIN 1
 #define _EXIT_PURPOSE_MIN 1
 /** This exit stream wants to do an ordinary connect. */
 /** This exit stream wants to do an ordinary connect. */
 #define EXIT_PURPOSE_CONNECT 1
 #define EXIT_PURPOSE_CONNECT 1