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
This commit is contained in:
Nick Mathewson 2006-11-17 03:34:44 +00:00
parent 942597bc4e
commit d125c61e02
3 changed files with 37 additions and 1 deletions

View File

@ -1440,6 +1440,13 @@ connection_ap_handshake_process_socks(edge_connection_t *conn)
return -1; return -1;
} /* else socks handshake is done, continue processing */ } /* 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) if (socks->command == SOCKS_COMMAND_CONNECT)
control_event_stream_status(conn, STREAM_EVENT_NEW, 0); control_event_stream_status(conn, STREAM_EVENT_NEW, 0);
else else
@ -2450,3 +2457,16 @@ failed:
return BAD_HOSTNAME; 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;
}

View File

@ -86,7 +86,8 @@ const char control_c_id[] =
#define EVENT_STATUS_CLIENT 0x0010 #define EVENT_STATUS_CLIENT 0x0010
#define EVENT_STATUS_SERVER 0x0011 #define EVENT_STATUS_SERVER 0x0011
#define EVENT_STATUS_GENERAL 0x0012 #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. */ /* If _EVENT_MAX ever hits 0x0020, we need to make the mask wider. */
/** Array mapping from message type codes to human-readable message /** 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; event_code = EVENT_STATUS_CLIENT;
else if (!strcasecmp(ev, "STATUS_SERVER")) else if (!strcasecmp(ev, "STATUS_SERVER"))
event_code = EVENT_STATUS_SERVER; event_code = EVENT_STATUS_SERVER;
else if (!strcasecmp(ev, "TESTSTREAM"))
event_code = EVENT_TESTSTREAM;
else { else {
connection_printf_to_buf(conn, "552 Unrecognized event \"%s\"\r\n", connection_printf_to_buf(conn, "552 Unrecognized event \"%s\"\r\n",
ev); ev);
@ -3544,6 +3547,17 @@ control_event_server_status(int severity, const char *format, ...)
return r; 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. /** Choose a random authentication cookie and write it to disk.
* Anybody who can read the cookie from disk will be considered * Anybody who can read the cookie from disk will be considered
* authorized to use the control connection. */ * authorized to use the control connection. */

View File

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