#include "donar_server.h" void create_onion_services(struct tor_os_str* tos, struct tor_ctl* tctl, uint16_t* ports, int ports_count, enum TOR_ONION_FLAGS tof) { tor_os_create (tos, "onion_services.pub", "onion_services.txt", 1); tor_os_read (tos); int err = 0; err = tor_ctl_connect (tctl, "127.0.0.1", "9051"); if (err < 0) { fprintf(stderr, "Unable to open Tor Socket\n"); exit(EXIT_FAILURE); } err = tor_ctl_add_onion (tctl, tos, ports, ports_count, tof); if (err != 0) { fprintf(stderr, "Unable to create Onion Services (error: %d)\n", err); exit(EXIT_FAILURE); } } void destroy_resources(struct tor_os_str* tos, struct tor_ctl* tctl) { tor_ctl_close (tctl); tor_os_free (tos); } void init_tcp_servers(struct donar_server_ctx* ctx, int nlinks) { char url[1024]; struct evt_core_cat cat = {0}; struct evt_core_fdinfo fdinfo = {0}; fdinfo.cat = &cat; fdinfo.url = url; char buffer[6]; int err, sock = 0; for (int i = 0; i < nlinks; i++) { sprintf (buffer, "%d", ctx->ports[i]); //@FIXME shouldn't listen on 0.0.0.0 but 127.13.3.7 is not compatible with docker sock = create_tcp_server ("0.0.0.0", buffer); if (sock < 0) goto socket_create_err; err = listen(sock, SOMAXCONN); if (err != 0) goto socket_create_err; fdinfo.cat->name = "tcp-listen"; fdinfo.fd = sock; sprintf(fdinfo.url, "tcp:listen:127.0.0.1:%d", ctx->ports[i]); evt_core_add_fd(&(ctx->evts), &fdinfo); } return; socket_create_err: fprintf(stderr, "Unable to create a TCP socket\n"); exit(EXIT_FAILURE); } struct tor_ctl* ugly_global_tctl; int donar_server_stream_repair(struct evt_core_ctx* ctx, struct evt_core_fdinfo* fdinfo) { fprintf(stdout, "[%s][donar-server] %s broke\n", current_human_datetime (), fdinfo->url); struct evt_core_fdinfo* fdtarget = NULL; int port = url_get_port_int (fdinfo->url); int pos = port - 7500, removed = 0; char buffer[256]; sprintf(buffer, "tcp:read:127.0.0.1:%d", port); fdtarget = evt_core_get_from_url (ctx, buffer); if (fdtarget != NULL) { evt_core_rm_fd(ctx, fdtarget->fd); removed++; } sprintf(buffer, "tcp:write:127.0.0.1:%d", port); fdtarget = evt_core_get_from_url (ctx, buffer); if (fdtarget != NULL) { evt_core_rm_fd(ctx, fdtarget->fd); removed++; } printf("[%s][donar-server] removed %d links\n", current_human_datetime (), removed); return 1; } struct donar_server_os_republish_params { struct donar_server_ctx* dctx; struct donar_params* dp; }; /* void republish_tor_os(struct evt_core_ctx* ctx, void* user_data) { struct donar_server_os_republish_params* dsorp = user_data; int err = 0; printf("Republish Tor OS\n"); err = tor_ctl_add_onion (&dsorp->dctx->tctl, &dsorp->dctx->tos, dsorp->dctx->ports, dsorp->dp->tof); if (err != 0) { fprintf(stderr, "Unable to create Onion Services (error: %d)\n", err); exit(EXIT_FAILURE); } printf("Republish Tor OS\n"); }*/ void donar_server(struct donar_server_ctx* ctx, struct donar_params* dp) { struct algo_params ap = { .is_waiting_bootstrap = dp->is_waiting_bootstrap, .algo_specific_params = dp->algo_specific_params, .algo_name = dp->algo, .links = dp->links, .fresh_data = dp->fresh_data, .redundant_data = dp->redundant_data, .capture_file = dp->capture_file, .sr = donar_server_stream_repair }; evt_core_init (&(ctx->evts), dp->verbose); signal_init(&ctx->evts); printf("--- Signal initialized\n"); algo_main_init(&ctx->evts, &ap); printf("--- Algorithm initialized\n"); for (uint16_t i = 0; i < dp->links ; i++) { ctx->ports[i] = 7500 + i; } create_onion_services (&(ctx->tos), &(ctx->tctl), ctx->ports, dp->links, dp->tof); ugly_global_tctl = &(ctx->tctl); /*struct donar_server_os_republish_params dsorp = { .dctx = ctx, dp = dp}; init_timer(&(ctx->evts)); set_timeout(&(ctx->evts), 1000, &dsorp, republish_tor_os); */ printf("--- Onion services created\n"); init_tcp_servers(ctx, dp->links); printf("--- TCP servers are listening\n"); g_ptr_array_foreach (dp->remote_ports, (void(*)(void*, void*))init_udp_remote, &(ctx->evts)); printf("--- Remote ports are binded locally\n"); for (int i = 0; i < dp->exposed_ports->len; i++) { init_udp_exposed(dp->bound_ip, g_ptr_array_index (dp->exposed_ports, i), &(ctx->evts)); } printf("--- Local UDP services (on %s) are exposed\n", dp->bound_ip); evt_core_loop (&(ctx->evts)); //stop_timer(&(ctx->evts)); destroy_resources (&(ctx->tos), &(ctx->tctl)); }