diff options
Diffstat (limited to 'src/or/connection_ap.c')
-rw-r--r-- | src/or/connection_ap.c | 168 |
1 files changed, 0 insertions, 168 deletions
diff --git a/src/or/connection_ap.c b/src/or/connection_ap.c deleted file mode 100644 index 1a17adefa..000000000 --- a/src/or/connection_ap.c +++ /dev/null @@ -1,168 +0,0 @@ -/* Copyright 2001,2002 Roger Dingledine, Matej Pfajfar. */ -/* See LICENSE for licensing information */ -/* $Id$ */ - -#include "or.h" - -int ap_handshake_process_socks(connection_t *conn) { - socks4_t socks4_info; - circuit_t *circ; - char tmpbuf[512]; - int amt; - - assert(conn); - - log_fn(LOG_DEBUG,"entered."); - - if(!conn->socks_version) { /* try to pull it in */ - - if(conn->inbuf_datalen < sizeof(socks4_t)) /* basic info available? */ - return 0; /* not yet */ - - connection_fetch_from_buf((char *)&socks4_info,sizeof(socks4_t),conn); - - log_fn(LOG_DEBUG,"Successfully read socks info."); - - if(socks4_info.version != 4) { - log_fn(LOG_NOTICE,"Unrecognized version %d.",socks4_info.version); - ap_handshake_socks_reply(conn, SOCKS4_REQUEST_REJECT); - return -1; - } - conn->socks_version = socks4_info.version; - - if(socks4_info.command != 1) { /* not a connect? we don't support it. */ - log_fn(LOG_NOTICE,"command %d not '1'.",socks4_info.command); - ap_handshake_socks_reply(conn, SOCKS4_REQUEST_REJECT); - return -1; - } - - conn->dest_port = ntohs(*(uint16_t*)&socks4_info.destport); - if(!conn->dest_port) { - log_fn(LOG_NOTICE,"Port is zero."); - ap_handshake_socks_reply(conn, SOCKS4_REQUEST_REJECT); - return -1; - } - log_fn(LOG_NOTICE,"Dest port is %d.",conn->dest_port); - - if(socks4_info.destip[0] || - socks4_info.destip[1] || - socks4_info.destip[2] || - !socks4_info.destip[3]) { /* not 0.0.0.x */ - log_fn(LOG_NOTICE,"destip not in form 0.0.0.x."); - sprintf(tmpbuf, "%d.%d.%d.%d", socks4_info.destip[0], - socks4_info.destip[1], socks4_info.destip[2], socks4_info.destip[3]); - conn->dest_addr = strdup(tmpbuf); - log_fn(LOG_DEBUG,"Successfully read destip (%s)", conn->dest_addr); - } - - } - - if(!conn->read_username) { /* the socks spec says we've got to read stuff until we get a null */ - amt = connection_find_on_inbuf("\0", 1, conn); - if(amt < 0) /* not there yet */ - return 0; - if(amt > 500) { - log_fn(LOG_NOTICE,"username too long."); - ap_handshake_socks_reply(conn, SOCKS4_REQUEST_REJECT); - return -1; - } - connection_fetch_from_buf(tmpbuf,amt,conn); - conn->read_username = 1; - log_fn(LOG_DEBUG,"Successfully read username."); - } - - if(!conn->dest_addr) { /* no dest_addr found yet */ - amt = connection_find_on_inbuf("\0", 1, conn); - if(amt < 0) /* not there yet */ - return 0; - if(amt > 500) { - log_fn(LOG_NOTICE,"dest_addr too long."); - ap_handshake_socks_reply(conn, SOCKS4_REQUEST_REJECT); - return -1; - } - connection_fetch_from_buf(tmpbuf,amt,conn); - - conn->dest_addr = strdup(tmpbuf); - log_fn(LOG_NOTICE,"successfully read dest addr '%s'", - conn->dest_addr); - } - - /* find the circuit that we should use, if there is one. */ - circ = circuit_get_newest_ap(); - - if(!circ) { - log_fn(LOG_INFO,"No circuit ready. Closing."); - return -1; - } - - circ->dirty = 1; - - /* add it into the linked list of streams on this circuit */ - log_fn(LOG_DEBUG,"attaching new conn to circ. n_aci %d.", circ->n_aci); - conn->next_stream = circ->p_streams; - circ->p_streams = conn; - - assert(circ->cpath && circ->cpath->prev); - assert(circ->cpath->prev->state == CPATH_STATE_OPEN); - conn->cpath_layer = circ->cpath->prev; - - if(ap_handshake_send_begin(conn, circ) < 0) { - circuit_close(circ); - return -1; - } - - return 0; -} - -int ap_handshake_send_begin(connection_t *ap_conn, circuit_t *circ) { - cell_t cell; - - memset(&cell, 0, sizeof(cell_t)); - /* deliver the dest_addr in a relay cell */ - cell.command = CELL_RELAY; - cell.aci = circ->n_aci; - SET_CELL_RELAY_COMMAND(cell, RELAY_COMMAND_BEGIN); - if(crypto_pseudo_rand(STREAM_ID_SIZE, ap_conn->stream_id) < 0) - return -1; - /* FIXME check for collisions */ - SET_CELL_STREAM_ID(cell, ZERO_STREAM); - - memcpy(cell.payload+RELAY_HEADER_SIZE, ap_conn->stream_id, STREAM_ID_SIZE); - cell.length = - snprintf(cell.payload+RELAY_HEADER_SIZE+STREAM_ID_SIZE, CELL_PAYLOAD_SIZE-RELAY_HEADER_SIZE-STREAM_ID_SIZE, - "%s:%d", ap_conn->dest_addr, ap_conn->dest_port) + - 1 + STREAM_ID_SIZE + RELAY_HEADER_SIZE; - log_fn(LOG_DEBUG,"Sending relay cell (id %d) to begin stream %d.", *(int *)(cell.payload+1),*(int *)ap_conn->stream_id); - if(circuit_deliver_relay_cell(&cell, circ, CELL_DIRECTION_OUT, ap_conn->cpath_layer) < 0) { - log_fn(LOG_DEBUG,"failed to deliver begin cell. Closing."); - return -1; - } - ap_conn->package_window = STREAMWINDOW_START; - ap_conn->deliver_window = STREAMWINDOW_START; - ap_conn->state = AP_CONN_STATE_OPEN; - log_fn(LOG_INFO,"Address/port sent, ap socket %d, n_aci %d",ap_conn->s,circ->n_aci); - return 0; -} - -int ap_handshake_socks_reply(connection_t *conn, char result) { - socks4_t socks4_info; - - assert(conn); - - socks4_info.version = 0; - socks4_info.command = result; - socks4_info.destport[0] = socks4_info.destport[1] = 0; - socks4_info.destip[0] = socks4_info.destip[1] = socks4_info.destip[2] = socks4_info.destip[3] = 0; - - if(connection_write_to_buf((char *)&socks4_info, sizeof(socks4_t), conn) < 0) - return -1; - return connection_flush_buf(conn); /* try to flush it, in case we're about to close the conn */ -} - -/* - Local Variables: - mode:c - indent-tabs-mode:nil - c-basic-offset:2 - End: -*/ |