Browse Source

r9560@Kushana: nickm | 2006-11-16 22:09:12 -0500
Check in an implementation of "test" connections from Scott Squires:
these connections immediately close upon reaching Tor. They're useful
for apps that want to check whether they're talking to the same Tor as
a given controller. (I'll be tweaking this a bit before I push.)



svn:r8958

Nick Mathewson 19 years ago
parent
commit
d125c61e02
3 changed files with 37 additions and 1 deletions
  1. 20 0
      src/or/connection_edge.c
  2. 15 1
      src/or/control.c
  3. 2 0
      src/or/or.h

+ 20 - 0
src/or/connection_edge.c

@@ -1440,6 +1440,13 @@ connection_ap_handshake_process_socks(edge_connection_t *conn)
     return -1;
   } /* else socks handshake is done, continue processing */
 
+  if (hostname_is_a_test_address(socks->address))
+  {
+    control_event_teststream(conn);
+    connection_mark_unattached_ap(conn, END_STREAM_REASON_TORPROTOCOL);
+    return -1;
+  }
+
   if (socks->command == SOCKS_COMMAND_CONNECT)
     control_event_stream_status(conn, STREAM_EVENT_NEW, 0);
   else
@@ -2450,3 +2457,16 @@ failed:
     return BAD_HOSTNAME;
 }
 
+/** Check if the address is of the form "y.test"
+ */
+int
+hostname_is_a_test_address(char *address)
+{
+  char *s;
+  s = strrchr(address,'.');
+  if (!s)
+    return 0;
+  if (!strcmp(s+1,"test"))
+    return 1;
+  return 0;
+}

+ 15 - 1
src/or/control.c

@@ -86,7 +86,8 @@ const char control_c_id[] =
 #define EVENT_STATUS_CLIENT    0x0010
 #define EVENT_STATUS_SERVER    0x0011
 #define EVENT_STATUS_GENERAL   0x0012
-#define _EVENT_MAX             0x0012
+#define EVENT_TESTSTREAM       0x0013
+#define _EVENT_MAX             0x0013
 /* If _EVENT_MAX ever hits 0x0020, we need to make the mask wider. */
 
 /** Array mapping from message type codes to human-readable message
@@ -1063,6 +1064,8 @@ handle_control_setevents(control_connection_t *conn, uint32_t len,
           event_code = EVENT_STATUS_CLIENT;
         else if (!strcasecmp(ev, "STATUS_SERVER"))
           event_code = EVENT_STATUS_SERVER;
+        else if (!strcasecmp(ev, "TESTSTREAM"))
+          event_code = EVENT_TESTSTREAM;
         else {
           connection_printf_to_buf(conn, "552 Unrecognized event \"%s\"\r\n",
                                    ev);
@@ -3544,6 +3547,17 @@ control_event_server_status(int severity, const char *format, ...)
   return r;
 }
 
+/** Called when a request is made for a hostname ending in .test
+ */
+int
+control_event_teststream(edge_connection_t *conn)
+{
+  send_control1_event(EVENT_TESTSTREAM, ALL_NAMES|ALL_FORMATS,
+                      "650 TESTSTREAM %s\r\n",
+                      conn->socks_request->address);
+  return 0;
+}
+
 /** Choose a random authentication cookie and write it to disk.
  * Anybody who can read the cookie from disk will be considered
  * authorized to use the control connection. */

+ 2 - 0
src/or/or.h

@@ -2034,6 +2034,7 @@ typedef enum hostname_type_t {
   NORMAL_HOSTNAME, ONION_HOSTNAME, EXIT_HOSTNAME, BAD_HOSTNAME
 } hostname_type_t;
 hostname_type_t parse_extended_hostname(char *address);
+int hostname_is_a_test_address(char *address);
 
 /********************************* connection_or.c ***************************/
 
@@ -2141,6 +2142,7 @@ int control_event_client_status(int severity, const char *format, ...)
   CHECK_PRINTF(2,3);
 int control_event_server_status(int severity, const char *format, ...)
   CHECK_PRINTF(2,3);
+int control_event_teststream(edge_connection_t *conn);
 
 int init_cookie_authentication(int enabled);
 int decode_hashed_password(char *buf, const char *hashed);