diff options
author | Nick Mathewson <nickm@torproject.org> | 2006-11-17 03:34:44 +0000 |
---|---|---|
committer | Nick Mathewson <nickm@torproject.org> | 2006-11-17 03:34:44 +0000 |
commit | d125c61e02743d5420567f954a176baeaa4f76a9 (patch) | |
tree | 3f321dbec376927a2091c042e6a47ec00bf5efb4 /src/or | |
parent | 942597bc4eede8dda1c4462100027095d1013229 (diff) | |
download | tor-d125c61e02743d5420567f954a176baeaa4f76a9.tar.gz tor-d125c61e02743d5420567f954a176baeaa4f76a9.zip |
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
Diffstat (limited to 'src/or')
-rw-r--r-- | src/or/connection_edge.c | 20 | ||||
-rw-r--r-- | src/or/control.c | 16 | ||||
-rw-r--r-- | src/or/or.h | 2 |
3 files changed, 37 insertions, 1 deletions
diff --git a/src/or/connection_edge.c b/src/or/connection_edge.c index 1a5ab6a2d3..6d3b482d6d 100644 --- a/src/or/connection_edge.c +++ b/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; +} diff --git a/src/or/control.c b/src/or/control.c index 9470e49e0d..76724be0d7 100644 --- a/src/or/control.c +++ b/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. */ diff --git a/src/or/or.h b/src/or/or.h index 3a45f0c761..afe91a8326 100644 --- a/src/or/or.h +++ b/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); |