diff options
-rw-r--r-- | src/or/connection_edge.c | 25 | ||||
-rw-r--r-- | src/or/or.h | 2 | ||||
-rw-r--r-- | src/or/rendcommon.c | 11 |
3 files changed, 35 insertions, 3 deletions
diff --git a/src/or/connection_edge.c b/src/or/connection_edge.c index 7985edb03..08c009bd9 100644 --- a/src/or/connection_edge.c +++ b/src/or/connection_edge.c @@ -696,6 +696,7 @@ static void connection_edge_consider_sending_sendme(connection_t *conn) { } } +/* return -1 if an unexpected error with conn, else 0. */ static int connection_ap_handshake_process_socks(connection_t *conn) { socks_request_t *socks; int sockshere; @@ -724,9 +725,27 @@ static int connection_ap_handshake_process_socks(connection_t *conn) { return sockshere; } /* else socks handshake is done, continue processing */ - conn->state = AP_CONN_STATE_CIRCUIT_WAIT; - /* attaching to a dirty circuit is fine */ - return connection_ap_handshake_attach_circuit(conn,0); + /* this call _modifies_ socks->address iff it's a hidden-service request */ + if (rend_parse_rendezvous_address(socks->address) < 0) { + /* normal request */ + conn->state = AP_CONN_STATE_CIRCUIT_WAIT; + /* attaching to a dirty circuit is fine */ + return connection_ap_handshake_attach_circuit(conn,0); + } else { + /* it's a hidden-service request */ + const char *descp; + int desc_len; + + /* see if we already have it cached */ + if (rend_cache_lookup(socks->address, &descp, &desc_len) == 1) { + /* then pick and launch a rendezvous circuit */ + /* go into some other state */ + } else { + /* initiate a dir hidserv desc lookup */ + /* go into a state where you'll be notified of the answer */ + } + } + return 0; } static int connection_ap_handshake_attach_circuit(connection_t *conn, diff --git a/src/or/or.h b/src/or/or.h index d6f7f4d51..a54a8287c 100644 --- a/src/or/or.h +++ b/src/or/or.h @@ -1012,6 +1012,8 @@ void rend_cache_clean(void); int rend_cache_lookup(char *query, const char **desc, int *desc_len); int rend_cache_store(char *desc, int desc_len); +int rend_parse_rendezvous_address(char *address); + /********************************* rendservice.c ***************************/ int rend_config_services(or_options_t *options); diff --git a/src/or/rendcommon.c b/src/or/rendcommon.c index 399e5db1f..220ed31a2 100644 --- a/src/or/rendcommon.c +++ b/src/or/rendcommon.c @@ -244,4 +244,15 @@ int rend_cache_store(char *desc, int desc_len) return 0; } +/* ==== General utility functions for rendezvous. */ + +/* If address is of the form "y.onion" with a well-formed handle y, + * then put a '\0' after y and return 0. + * Else return -1 and change nothing. + */ +int rend_parse_rendezvous_address(char *address) { + + + return -1; +} |