|
@@ -14,6 +14,10 @@
|
|
|
#include "confparse.h"
|
|
|
#include "connection.h"
|
|
|
#include "connection_edge.h"
|
|
|
+#include "nodelist.h"
|
|
|
+
|
|
|
+#include "hs_cache.h"
|
|
|
+#include "rendcache.h"
|
|
|
|
|
|
static void *
|
|
|
entryconn_rewrite_setup(const struct testcase_t *tc)
|
|
@@ -743,6 +747,87 @@ test_entryconn_rewrite_mapaddress_automap_onion4(void *arg)
|
|
|
test_entryconn_rewrite_mapaddress_automap_onion_common(arg, 0, 1);
|
|
|
}
|
|
|
|
|
|
+/** Test that rewrite functions can handle v2 addresses */
|
|
|
+static void
|
|
|
+test_entryconn_rewrite_onion_v2(void *arg)
|
|
|
+{
|
|
|
+ int retval;
|
|
|
+ entry_connection_t *conn = arg;
|
|
|
+
|
|
|
+ (void) arg;
|
|
|
+
|
|
|
+ rend_cache_init();
|
|
|
+
|
|
|
+ /* Make a SOCKS request */
|
|
|
+ conn->socks_request->command = SOCKS_COMMAND_CONNECT;
|
|
|
+ strlcpy(conn->socks_request->address,
|
|
|
+ "pqeed46efnwmfuid.onion",
|
|
|
+ sizeof(conn->socks_request->address));
|
|
|
+
|
|
|
+ /* Make an onion connection using the SOCKS request */
|
|
|
+ conn->entry_cfg.onion_traffic = 1;
|
|
|
+ ENTRY_TO_CONN(conn)->state = AP_CONN_STATE_SOCKS_WAIT;
|
|
|
+ tt_assert(!ENTRY_TO_EDGE_CONN(conn)->rend_data);
|
|
|
+
|
|
|
+ /* Handle SOCKS and rewrite! */
|
|
|
+ retval = connection_ap_handshake_rewrite_and_attach(conn, NULL, NULL);
|
|
|
+ tt_int_op(retval, OP_EQ, 0);
|
|
|
+
|
|
|
+ /* Check connection state after rewrite */
|
|
|
+ tt_int_op(ENTRY_TO_CONN(conn)->state, OP_EQ, AP_CONN_STATE_RENDDESC_WAIT);
|
|
|
+ /* check that the address got rewritten */
|
|
|
+ tt_str_op(conn->socks_request->address, OP_EQ,
|
|
|
+ "pqeed46efnwmfuid");
|
|
|
+ /* check that HS information got attached to the connection */
|
|
|
+ tt_assert(ENTRY_TO_EDGE_CONN(conn)->rend_data);
|
|
|
+ tt_assert(!ENTRY_TO_EDGE_CONN(conn)->hs_ident);
|
|
|
+
|
|
|
+ done:
|
|
|
+ rend_cache_free_all();
|
|
|
+ /* 'conn' is cleaned by handler */
|
|
|
+}
|
|
|
+
|
|
|
+/** Test that rewrite functions can handle v3 onion addresses */
|
|
|
+static void
|
|
|
+test_entryconn_rewrite_onion_v3(void *arg)
|
|
|
+{
|
|
|
+ int retval;
|
|
|
+ entry_connection_t *conn = arg;
|
|
|
+
|
|
|
+ (void) arg;
|
|
|
+
|
|
|
+ hs_cache_init();
|
|
|
+
|
|
|
+ /* Make a SOCKS request */
|
|
|
+ conn->socks_request->command = SOCKS_COMMAND_CONNECT;
|
|
|
+ strlcpy(conn->socks_request->address,
|
|
|
+ "git.p3xnclpu4mu22dwaurjtsybyqk4xfjmcfz6z62yl24uwmhjatiwnlnad.onion",
|
|
|
+ sizeof(conn->socks_request->address));
|
|
|
+
|
|
|
+ /* Make an onion connection using the SOCKS request */
|
|
|
+ conn->entry_cfg.onion_traffic = 1;
|
|
|
+ ENTRY_TO_CONN(conn)->state = AP_CONN_STATE_SOCKS_WAIT;
|
|
|
+ tt_assert(!ENTRY_TO_EDGE_CONN(conn)->rend_data);
|
|
|
+ tt_assert(!ENTRY_TO_EDGE_CONN(conn)->hs_ident);
|
|
|
+
|
|
|
+ /* Handle SOCKS and rewrite! */
|
|
|
+ retval = connection_ap_handshake_rewrite_and_attach(conn, NULL, NULL);
|
|
|
+ tt_int_op(retval, OP_EQ, 0);
|
|
|
+
|
|
|
+ /* Check connection state after rewrite */
|
|
|
+ tt_int_op(ENTRY_TO_CONN(conn)->state, OP_EQ, AP_CONN_STATE_RENDDESC_WAIT);
|
|
|
+ /* check that the address got rewritten */
|
|
|
+ tt_str_op(conn->socks_request->address, OP_EQ,
|
|
|
+ "p3xnclpu4mu22dwaurjtsybyqk4xfjmcfz6z62yl24uwmhjatiwnlnad");
|
|
|
+ /* check that HS information got attached to the connection */
|
|
|
+ tt_assert(ENTRY_TO_EDGE_CONN(conn)->hs_ident);
|
|
|
+ tt_assert(!ENTRY_TO_EDGE_CONN(conn)->rend_data);
|
|
|
+
|
|
|
+ done:
|
|
|
+ hs_free_all();
|
|
|
+ /* 'conn' is cleaned by handler */
|
|
|
+}
|
|
|
+
|
|
|
#define REWRITE(name) \
|
|
|
{ #name, test_entryconn_##name, TT_FORK, &test_rewrite_setup, NULL }
|
|
|
|
|
@@ -763,6 +848,8 @@ struct testcase_t entryconn_tests[] = {
|
|
|
REWRITE(rewrite_mapaddress_automap_onion2),
|
|
|
REWRITE(rewrite_mapaddress_automap_onion3),
|
|
|
REWRITE(rewrite_mapaddress_automap_onion4),
|
|
|
+ REWRITE(rewrite_onion_v2),
|
|
|
+ REWRITE(rewrite_onion_v3),
|
|
|
|
|
|
END_OF_TESTCASES
|
|
|
};
|