aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/or/connection_edge.c25
-rw-r--r--src/or/or.h2
-rw-r--r--src/or/rendcommon.c11
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;
+}