10#define CONTROL_MODULE_PRIVATE
11#define CONTROL_CMD_PRIVATE
12#define CONTROL_EVENTS_PRIVATE
31#include "feature/control/control_hs.h"
33#include "feature/control/control_getinfo.h"
64#define STATE_IS_OPEN(s) ((s) == CONTROL_CONN_STATE_OPEN)
77 smartlist_free(args->
args);
79 config_free_lines(args->
kwargs);
96 memwipe(line->key, 0, strlen(line->key));
97 memwipe(line->value, 0, strlen(line->value));
110 for (
unsigned i = 0; array[i]; ++i) {
111 if (! strcasecmp(array[i], kwd))
128 if (result->
kwargs == NULL) {
129 tor_asprintf(error_out,
"Cannot parse keyword argument(s)");
140 for (line = result->
kwargs; line; line = line->next) {
143 tor_asprintf(error_out,
"Unrecognized keyword argument %s",
168 char *cmdline_alloc = NULL;
178 const char *eol = memchr(body,
'\n', body_len);
180 if (! eol || (eol+1) == body+body_len) {
181 *error_out = tor_strdup(
"Empty body");
184 cmdline_alloc = tor_memdup_nulterm(body, eol-body);
185 cmdline = cmdline_alloc;
190 if (eol && (eol+1) != body+body_len) {
191 *error_out = tor_strdup(
"Unexpected body");
199 SPLIT_SKIP_SPACE|SPLIT_IGNORE_BLANK,
201 size_t n_args = smartlist_len(result->
args);
202 if (n_args < syntax->min_args) {
207 tor_asprintf(error_out,
"Cannot accept more than %u argument(s)",
226 tor_assert_nonfatal(*error_out == NULL);
229 tor_assert_nonfatal(*error_out != NULL);
230 control_cmd_args_free(result);
244 return line && !strcmp(line->value,
"");
249 .accept_keywords=
true,
250 .kvline_flags=KV_OMIT_VALS|KV_QUOTED,
265 .accept_keywords=
true,
266 .kvline_flags=KV_OMIT_VALS|KV_QUOTED,
297 "Unrecognized configuration key \"%s\"", q);
316 } SMARTLIST_FOREACH_END(q);
318 if (smartlist_len(unrecognized)) {
320 }
else if (smartlist_len(answers)) {
341 char *errstring = NULL;
346 if (retval != SETOPT_OK)
348 "Controller gave us config file that didn't validate: %s",
351#define SEND_ERRMSG(code, msg) \
352 control_printf_endreply(conn, code, msg "%s%s", \
353 errstring ? ": " : "", \
354 errstring ? errstring : "")
356 case SETOPT_ERR_PARSE:
357 SEND_ERRMSG(552,
"Invalid config file");
359 case SETOPT_ERR_TRANSITION:
360 SEND_ERRMSG(553,
"Transition not allowed");
362 case SETOPT_ERR_SETTING:
363 SEND_ERRMSG(553,
"Unable to set option");
365 case SETOPT_ERR_MISC:
367 SEND_ERRMSG(550,
"Unable to load config");
389 event_mask_t event_mask = 0;
394 if (!strcasecmp(ev,
"EXTENDED") ||
395 !strcasecmp(ev,
"AUTHDIR_NEWDESCS")) {
396 log_warn(
LD_CONTROL,
"The \"%s\" SETEVENTS argument is no longer "
410 if (event_code == -1) {
415 event_mask |= (((event_mask_t)1) << event_code);
417 SMARTLIST_FOREACH_END(ev);
428 .accept_keywords =
true,
429 .kvline_flags=KV_OMIT_VALS,
442 "Unable to write configuration to disk.");
465 const char *s = smartlist_get(args->
args, 0);
467 for (i = 0; signal_table[i].signal_name != NULL; ++i) {
468 if (!strcasecmp(s, signal_table[i].signal_name)) {
469 sig = signal_table[i].sig;
481 if (sig == SIGTERM || sig == SIGINT)
484 activate_signal(sig);
504 log_info(
LD_CONTROL,
"Control connection %d has taken ownership of this "
506 (
int)(conn->base_.
s));
527 log_info(
LD_CONTROL,
"Control connection %d has dropped ownership of this "
529 (
int)(conn->base_.
s));
573 char *errstring = NULL;
574 const unsigned flags =
582#define SEND_ERRMSG(code, msg) \
583 control_printf_endreply(conn, code, msg ": %s", errstring);
586 case SETOPT_ERR_MISC:
587 SEND_ERRMSG(552,
"Unrecognized option");
589 case SETOPT_ERR_PARSE:
590 SEND_ERRMSG(513,
"Unacceptable option value");
592 case SETOPT_ERR_TRANSITION:
593 SEND_ERRMSG(553,
"Transition not allowed");
595 case SETOPT_ERR_SETTING:
597 SEND_ERRMSG(553,
"Unable to set option");
600 config_free_lines(lines);
606 "Controller gave us config lines that didn't validate: %s",
608 config_free_lines(lines);
629 .accept_keywords=
true,
644 for (line = args->
kwargs; line; line = line->next) {
645 const char *from = line->key;
646 const char *to = line->value;
650 "512-syntax error: invalid address '%s'", to);
652 "Skipping invalid argument '%s' in MapAddress msg", to);
653 }
else if (!strcmp(from,
".") || !strcmp(from,
"0.0.0.0") ||
654 !strcmp(from,
"::")) {
656 !strcmp(from,
".") ? RESOLVED_TYPE_HOSTNAME :
657 (!strcmp(from,
"0.0.0.0") ? RESOLVED_TYPE_IPV4 : RESOLVED_TYPE_IPV6);
659 type, tor_strdup(to));
662 "451-resource exhausted: skipping '%s=%s'", from,to);
664 "Unable to allocate address for '%s' in MapAddress msg",
665 safe_str_client(to));
674 "512-syntax error: invalid address mapping "
675 " '%s=%s': %s", from, to, msg);
677 "Skipping invalid argument '%s=%s' in MapAddress msg: %s",
686 if (smartlist_len(reply)) {
687 ((
char*)smartlist_get(reply,smartlist_len(reply)-1))[3] =
' ';
689 connection_buf_add(r, sz,
TO_CONN(conn));
693 "not enough arguments to mapaddress.");
697 smartlist_free(reply);
706 string += strlen(
"purpose=");
708 if (!strcasecmp(
string,
"general"))
710 else if (!strcasecmp(
string,
"controller"))
719 .accept_keywords=
true,
720 .kvline_flags=KV_OMIT_VALS
733 const char *circ_id = smartlist_get(args->
args, 0);
734 const char *path_str = NULL;
735 char *path_str_alloc = NULL;
746 if (!strcmp(arg1->value,
"")) {
747 path_str = arg1->key;
748 kwargs = kwargs->next;
749 }
else if (arg1->key[0] ==
'$') {
750 tor_asprintf(&path_str_alloc,
"%s=%s", arg1->key, arg1->value);
751 path_str = path_str_alloc;
752 kwargs = kwargs->next;
757 bool zero_circ = !strcmp(
"0", circ_id);
763 purpose_line->value);
782 if (!zero_circ && !(circ =
get_circ(circ_id))) {
795 bool first_node = zero_circ;
808 } SMARTLIST_FOREACH_END(n);
810 if (!smartlist_len(nodes)) {
824 first_node = zero_circ;
832 tor_assert_nonfatal(first_node);
834 "controller tried to connect to a node that lacks a suitable "
835 "descriptor, or which doesn't have any "
836 "addresses that are allowed by the firewall configuration; "
837 "circuit marked for closing.");
838 circuit_mark_for_close(
TO_CIRCUIT(circ), -END_CIRC_REASON_CONNECTFAILED);
846 extend_info_free(info);
854 circuit_mark_for_close(
TO_CIRCUIT(circ), -err_reason);
865 "send_next_onion_skin failed; circuit marked for closing.");
866 circuit_mark_for_close(
TO_CIRCUIT(circ), -err_reason);
879 smartlist_free(router_nicknames);
880 smartlist_free(nodes);
887 .accept_keywords=
true,
898 const char *circ_id = smartlist_get(args->
args,0);
926static const char *attachstream_keywords[] = {
931 .accept_keywords=
true,
932 .allowed_keywords=attachstream_keywords
944 int hop=0, hop_line_ok=1;
945 const char *stream_id = smartlist_get(args->
args, 0);
946 const char *circ_id = smartlist_get(args->
args, 1);
947 int zero_circ = !strcmp(circ_id,
"0");
953 }
else if (!zero_circ && !(circ =
get_circ(circ_id))) {
972 "Connection is not managed by controller.");
991 "Can't attach stream to non-open origin circuit");
997 "Can't attach stream to this one-hop circuit.");
1001 if (circ && hop>0) {
1017static const char *postdescriptor_keywords[] = {
1018 "cache",
"purpose", NULL,
1023 .accept_keywords =
true,
1024 .allowed_keywords = postdescriptor_keywords,
1025 .want_cmddata =
true,
1034 const char *msg=NULL;
1050 if (!strcasecmp(line->value,
"no"))
1052 else if (!strcasecmp(line->value,
"yes"))
1063 if (!msg) msg =
"Could not parse descriptor";
1067 if (!msg) msg =
"Descriptor not added";
1081 .max_args = UINT_MAX,
1091 char *new_addr = NULL;
1092 uint16_t new_port = 0;
1095 if (!(ap_conn =
get_stream(smartlist_get(args, 0)))
1098 (
char*)smartlist_get(args, 0));
1101 if (smartlist_len(args) > 2) {
1103 10, 1, 65535, &ok, NULL);
1107 (
char*)smartlist_get(args, 2));
1109 new_addr = tor_strdup(smartlist_get(args, 1));
1127 .max_args = UINT_MAX,
1144 if (!(ap_conn =
get_stream(smartlist_get(args, 0))))
1146 (
char*)smartlist_get(args, 0));
1152 (
char*)smartlist_get(args, 1));
1159 connection_mark_unattached_ap(ap_conn, reason);
1166 .accept_keywords=
true,
1167 .kvline_flags=KV_OMIT_VALS,
1178 const char *circ_id = smartlist_get(args->
args, 0);
1189 circuit_mark_for_close(
TO_CIRCUIT(circ), END_CIRC_REASON_REQUESTED);
1198 .accept_keywords=
true,
1199 .kvline_flags=KV_OMIT_VALS,
1211 if (!(conn->
event_mask & (((event_mask_t)1)<<EVENT_ADDRMAP))) {
1212 log_warn(
LD_CONTROL,
"Controller asked us to resolve an address, but "
1213 "isn't listening for ADDRMAP events. It probably won't see "
1219 if (modearg && !strcasecmp(modearg->value,
"reverse"))
1224 if (!strlen(line->value)) {
1225 const char *addr = line->key;
1240 smartlist_free(failed);
1265 if (!cookies && !passwd)
1268 smartlist_free(mlist);
1278 char *cfile = NULL, *abs_cfile = NULL, *esc_cfile = NULL;
1313 const char *bad_arg = NULL;
1332 connection_mark_for_close(
TO_CONN(conn));
1360 if (!strcasecmp(arg,
"VERBOSE_NAMES"))
1362 else if (!strcasecmp(arg,
"EXTENDED_EVENTS"))
1370 } SMARTLIST_FOREACH_END(arg);
1390 static int have_warned = 0;
1391 if (! have_warned) {
1392 log_warn(
LD_CONTROL,
"DROPGUARDS is dangerous; make sure you understand "
1393 "the risks before using it. It may be removed in a future "
1415 static int have_warned = 0;
1416 if (! have_warned) {
1417 log_warn(
LD_CONTROL,
"DROPTIMEOUTS is dangerous; make sure you understand "
1418 "the risks before using it. It may be removed in a future "
1427 BUILDTIMEOUT_SET_EVENT_RESET);
1432static const char *hsfetch_keywords[] = {
1437 .accept_keywords =
true,
1438 .allowed_keywords = hsfetch_keywords,
1450 const char *hsaddress = NULL;
1453 const char *arg1 = smartlist_get(args->
args, 0);
1464 if (!strcasecmp(line->key,
"SERVER")) {
1465 const char *server = line->value;
1497 smartlist_free(hsdirs);
1501static const char *hspost_keywords[] = {
1502 "SERVER",
"HSADDRESS", NULL
1506 .accept_keywords =
true,
1507 .want_cmddata =
true,
1508 .allowed_keywords = hspost_keywords
1517 const char *encoded_desc = args->
cmddata;
1518 const char *onion_address = NULL;
1521 for (line = args->
kwargs; line; line = line->next) {
1523 const char *server = line->value;
1526 if (!node || !node->rs) {
1536 const char *address = line->value;
1541 onion_address = address;
1548 if (onion_address) {
1558 smartlist_free(hs_dirs);
1578add_onion_helper_add_service(
int hs_version,
1579 add_onion_secret_key_t *pk,
1581 int max_streams_close_circuit,
1582 int pow_defenses_enabled,
1583 uint32_t pow_queue_rate,
1584 uint32_t pow_queue_burst,
1593 switch (hs_version) {
1596 max_streams_close_circuit,
1597 pow_defenses_enabled,
1600 auth_clients_v3, address_out);
1603 tor_assert_unreached();
1623static const char *add_onion_keywords[] = {
1627 "PoWDefensesEnabled",
1636 .accept_keywords =
true,
1637 .allowed_keywords = add_onion_keywords
1656 int max_streams = 0;
1657 int max_streams_close_circuit = 0;
1658 int non_anonymous = 0;
1659 int pow_defenses_enabled = HS_CONFIG_V3_POW_DEFENSES_DEFAULT;
1660 uint32_t pow_queue_rate = HS_CONFIG_V3_POW_QUEUE_RATE;
1661 uint32_t pow_queue_burst = HS_CONFIG_V3_POW_QUEUE_BURST;
1664 for (arg = args->
kwargs; arg; arg = arg->next) {
1665 if (!strcasecmp(arg->key,
"Port")) {
1673 }
else if (!strcasecmp(arg->key,
"MaxStreams")) {
1676 max_streams = (int)
tor_parse_long(arg->value, 10, 0, 65535, &ok, NULL);
1681 }
else if (!strcasecmp(arg->key,
"PoWDefensesEnabled")) {
1689 }
else if (!strcasecmp(arg->key,
"PoWQueueRate")) {
1692 0, UINT32_MAX, &ok, NULL);
1697 }
else if (!strcasecmp(arg->key,
"PoWQueueBurst")) {
1700 0, UINT32_MAX, &ok, NULL);
1705 }
else if (!strcasecmp(arg->key,
"Flags")) {
1719 static const char *discard_flag =
"DiscardPK";
1720 static const char *detach_flag =
"Detach";
1721 static const char *max_s_close_flag =
"MaxStreamsCloseCircuit";
1722 static const char *v3auth_flag =
"V3Auth";
1723 static const char *non_anonymous_flag =
"NonAnonymous";
1729 if (smartlist_len(flags) < 1) {
1735 if (!strcasecmp(flag, discard_flag)) {
1737 }
else if (!strcasecmp(flag, detach_flag)) {
1739 }
else if (!strcasecmp(flag, max_s_close_flag)) {
1740 max_streams_close_circuit = 1;
1741 }
else if (!strcasecmp(flag, v3auth_flag)) {
1742 auth_type = REND_V3_AUTH;
1743 }
else if (!strcasecmp(flag, non_anonymous_flag)) {
1751 } SMARTLIST_FOREACH_END(flag);
1753 smartlist_free(flags);
1756 }
else if (!strcasecmp(arg->key,
"ClientAuthV3")) {
1764 if (auth_clients_v3 == NULL) {
1776 if (smartlist_len(port_cfgs) == 0) {
1779 }
else if (auth_type == REND_NO_AUTH && auth_clients_v3 != NULL) {
1782 }
else if (auth_type != REND_NO_AUTH && auth_clients_v3 == NULL) {
1785 }
else if (non_anonymous != hs_service_non_anonymous_mode_enabled(
1795 "Tor is in %sanonymous hidden service " "mode",
1796 non_anonymous ?
"" :
"non-");
1802 add_onion_secret_key_t pk = { NULL };
1803 const char *key_new_alg = NULL;
1804 char *key_new_blob = NULL;
1808 &key_new_alg, &key_new_blob, &pk, &hs_version,
1816 char *service_id = NULL;
1817 int ret = add_onion_helper_add_service(hs_version, &pk, port_cfgs,
1819 max_streams_close_circuit,
1820 pow_defenses_enabled,
1823 auth_clients_v3, &service_id);
1825 auth_clients_v3 = NULL;
1844 key_new_alg, key_new_blob);
1846 if (auth_clients_v3_str) {
1872 memwipe(key_new_blob, 0, strlen(key_new_blob));
1879 hs_port_config_free(p));
1880 smartlist_free(port_cfgs);
1882 if (auth_clients_v3) {
1884 service_authorized_client_free(ac));
1885 smartlist_free(auth_clients_v3);
1887 if (auth_clients_v3_str) {
1890 smartlist_free(auth_clients_v3_str);
1911 const char **key_new_alg_out,
char **key_new_blob_out,
1912 add_onion_secret_key_t *decoded_key,
int *hs_version,
1916 const char *key_new_alg = NULL;
1917 char *key_new_blob = NULL;
1921 if (smartlist_len(key_args) != 2) {
1927 static const char *key_type_new =
"NEW";
1928 static const char *key_type_best =
"BEST";
1929 static const char *key_type_ed25519_v3 =
"ED25519-V3";
1931 const char *key_type = smartlist_get(key_args, 0);
1932 const char *key_blob = smartlist_get(key_args, 1);
1934 if (!strcasecmp(key_type_ed25519_v3, key_type)) {
1939 strlen(key_blob)) !=
sizeof(sk->
seckey)) {
1944 decoded_key->v3 = sk;
1946 }
else if (!strcasecmp(key_type_new, key_type)) {
1948 if (!strcasecmp(key_type_ed25519_v3, key_blob) ||
1949 !strcasecmp(key_type_best, key_blob)) {
1955 key_type_ed25519_v3);
1960 key_new_blob = tor_malloc_zero(len);
1962 sizeof(sk->
seckey), 0) != (len - 1)) {
1966 key_type_ed25519_v3);
1969 key_new_alg = key_type_ed25519_v3;
1971 decoded_key->v3 = sk;
1990 smartlist_free(key_args);
1992 *key_new_alg_out = key_new_alg;
1993 *key_new_blob_out = key_new_blob;
2012 const char *service_id = smartlist_get(args, 0);
2035 onion_services = services[i];
2039 if (onion_services == NULL) {
2043 switch (hs_version) {
2056 log_warn(
LD_BUG,
"Failed to remove Onion Service %s.",
2062 char *cp = smartlist_get(onion_services, idx);
2126#define CMD_FL_WIPE (1u<<0)
2132#define ONE_LINE(name, flags) \
2135 handle_control_ ##name, \
2144#define MULTLINE(name, flags) \
2146 handle_control_ ##name, \
2155#define OBSOLETE(name) \
2157 handle_control_obsolete, \
2199 ONE_LINE(onion_client_auth_remove, 0),
2200 ONE_LINE(onion_client_auth_view, 0),
2215 uint32_t cmd_data_len,
2234 if (def->
handler(conn, parsed_args))
2240 control_cmd_args_free(parsed_args);
2244 memwipe(args, 0, cmd_data_len);
2255 uint32_t cmd_data_len,
2276control_cmd_free_all(
void)
const char * addressmap_register_virtual_address(int type, char *new_address)
int base64_decode(char *dest, size_t destlen, const char *src, size_t srclen)
int base64_encode(char *dest, size_t destlen, const char *src, size_t srclen, int flags)
size_t base64_encode_size(size_t srclen, int flags)
int circuit_handle_first_hop(origin_circuit_t *circ)
int circuit_send_next_onion_skin(origin_circuit_t *circ)
int circuit_append_new_exit(origin_circuit_t *circ, extend_info_t *exit_ei)
origin_circuit_t * origin_circuit_init(uint8_t purpose, int flags)
Header file for circuitbuild.c.
void circuit_set_state(circuit_t *circ, uint8_t state)
circuit_t * circuit_get_by_edge_conn(edge_connection_t *conn)
origin_circuit_t * circuit_get_by_global_id(uint32_t id)
int circuit_get_cpath_len(origin_circuit_t *circ)
int circuit_event_status(origin_circuit_t *circ, circuit_status_event_t tp, int reason_code)
crypt_path_t * circuit_get_cpath_hop(origin_circuit_t *circ, int hopnum)
Header file for circuitlist.c.
#define CIRCUIT_PURPOSE_UNKNOWN
#define CIRCUIT_STATE_OPEN
#define CIRCUIT_STATE_BUILDING
#define CIRCUIT_PURPOSE_CONTROLLER
#define CIRCUIT_STATE_GUARD_WAIT
#define CIRCUIT_PURPOSE_C_GENERAL
circuit_build_times_t * get_circuit_build_times_mutable(void)
const circuit_build_times_t * get_circuit_build_times(void)
void circuit_build_times_reset(circuit_build_times_t *cbt)
Header file for circuitstats.c.
void circuit_detach_stream(circuit_t *circ, edge_connection_t *conn)
origin_circuit_t * circuit_launch(uint8_t purpose, int flags)
void circuit_change_purpose(circuit_t *circ, uint8_t new_purpose)
Header file for circuituse.c.
#define CIRCLAUNCH_NEED_CAPACITY
int options_save_current(void)
const or_options_t * get_options(void)
int option_is_recognized(const char *key)
setopt_err_t options_trial_assign(config_line_t *list, unsigned flags, char **msg)
int addressmap_register_auto(const char *from, const char *to, time_t expires, addressmap_entry_source_t addrmap_source, const char **msg)
tor_cmdline_mode_t command
setopt_err_t options_init_from_string(const char *cf_defaults, const char *cf, int command, const char *command_arg, char **msg)
const char * option_get_canonical_name(const char *key)
config_line_t * option_get_assignment(const or_options_t *options, const char *key)
Header file for config.c.
const config_line_t * config_line_find_case(const config_line_t *lines, const char *key)
config_line_t * config_lines_dup(const config_line_t *inp)
int connection_flush(connection_t *conn)
connection_t * connection_get_by_global_id(uint64_t id)
Header file for connection.c.
int connection_ap_handshake_rewrite_and_attach(entry_connection_t *conn, origin_circuit_t *circ, crypt_path_t *cpath)
int connection_edge_end(edge_connection_t *conn, uint8_t reason)
entry_connection_t * TO_ENTRY_CONN(connection_t *c)
void connection_entry_set_controller_wait(entry_connection_t *conn)
Header file for connection_edge.c.
#define AP_CONN_STATE_CONTROLLER_WAIT
int address_is_invalid_destination(const char *address, int client)
#define AP_CONN_STATE_CONNECT_WAIT
#define AP_CONN_STATE_RESOLVE_WAIT
Header file for control.c.
char * get_controller_cookie_file_name(void)
Header file for control_auth.c.
static int handle_control_saveconf(control_connection_t *conn, const control_cmd_args_t *args)
static int handle_control_droptimeouts(control_connection_t *conn, const control_cmd_args_t *args)
static int handle_control_usefeature(control_connection_t *conn, const control_cmd_args_t *cmd_args)
static int control_setconf_helper(control_connection_t *conn, const control_cmd_args_t *args, int use_defaults)
static int kvline_check_keyword_args(const control_cmd_args_t *result, const control_cmd_syntax_t *syntax, char **error_out)
static const size_t N_CONTROL_COMMANDS
void control_cmd_args_free_(control_cmd_args_t *args)
static int handle_control_hspost(control_connection_t *conn, const control_cmd_args_t *args)
static int handle_control_extendcircuit(control_connection_t *conn, const control_cmd_args_t *args)
static uint8_t circuit_purpose_from_string(const char *string)
static int handle_control_setevents(control_connection_t *conn, const control_cmd_args_t *args)
static int handle_control_obsolete(control_connection_t *conn, const control_cmd_args_t *args)
STATIC control_cmd_args_t * control_cmd_parse_args(const char *command, const control_cmd_syntax_t *syntax, size_t body_len, const char *body, char **error_out)
static int handle_control_hsfetch(control_connection_t *conn, const control_cmd_args_t *args)
static int handle_control_closestream(control_connection_t *conn, const control_cmd_args_t *cmd_args)
static const control_cmd_def_t CONTROL_COMMANDS[]
static int handle_control_signal(control_connection_t *conn, const control_cmd_args_t *args)
static int handle_single_control_command(const control_cmd_def_t *def, control_connection_t *conn, uint32_t cmd_data_len, char *args)
static smartlist_t * detached_onion_services
static int handle_control_loadconf(control_connection_t *conn, const control_cmd_args_t *args)
static bool string_array_contains_keyword(const char **array, const char *kwd)
void control_cmd_args_wipe(control_cmd_args_t *args)
int(* handler_fn_t)(control_connection_t *conn, const control_cmd_args_t *args)
static int handle_control_getconf(control_connection_t *conn, const control_cmd_args_t *args)
static int handle_control_attachstream(control_connection_t *conn, const control_cmd_args_t *args)
STATIC int add_onion_helper_keyarg(const char *arg, int discard_pk, const char **key_new_alg_out, char **key_new_blob_out, add_onion_secret_key_t *decoded_key, int *hs_version, control_connection_t *conn)
static int address_is_invalid_mapaddress_target(const char *addr)
static bool config_lines_contain_flag(const config_line_t *lines, const char *flag)
static int handle_control_dropguards(control_connection_t *conn, const control_cmd_args_t *args)
static int handle_control_setconf(control_connection_t *conn, const control_cmd_args_t *args)
static int handle_control_postdescriptor(control_connection_t *conn, const control_cmd_args_t *args)
static int handle_control_add_onion(control_connection_t *conn, const control_cmd_args_t *args)
static int handle_control_closecircuit(control_connection_t *conn, const control_cmd_args_t *args)
static int handle_control_takeownership(control_connection_t *conn, const control_cmd_args_t *args)
static void add_authmethods(smartlist_t *reply)
#define MULTLINE(name, flags)
static origin_circuit_t * get_circ(const char *id)
static char * get_authmethods(const or_options_t *options)
smartlist_t * get_detached_onion_services(void)
static int handle_control_redirectstream(control_connection_t *conn, const control_cmd_args_t *cmd_args)
static int handle_control_resolve(control_connection_t *conn, const control_cmd_args_t *args)
static int handle_control_dropownership(control_connection_t *conn, const control_cmd_args_t *args)
int handle_control_command(control_connection_t *conn, uint32_t cmd_data_len, char *args)
static int handle_control_setcircuitpurpose(control_connection_t *conn, const control_cmd_args_t *args)
#define ONE_LINE(name, flags)
static int handle_control_mapaddress(control_connection_t *conn, const control_cmd_args_t *args)
static int handle_control_protocolinfo(control_connection_t *conn, const control_cmd_args_t *cmd_args)
static char * get_esc_cfile(const or_options_t *options)
static int handle_control_resetconf(control_connection_t *conn, const control_cmd_args_t *args)
static entry_connection_t * get_stream(const char *id)
static int handle_control_del_onion(control_connection_t *conn, const control_cmd_args_t *cmd_args)
Header file for control_cmd.c.
Definition for control_cmd_args_t.
Controller connection structure.
const struct control_event_t control_event_table[]
int control_event_address_mapped(const char *from, const char *to, time_t expires, const char *error, const int cached, uint64_t stream_id)
void control_update_global_event_mask(void)
Header file for control_events.c.
void control_write_endreply(control_connection_t *conn, int code, const char *s)
void control_printf_midreply(control_connection_t *conn, int code, const char *fmt,...)
void send_control_done(control_connection_t *conn)
void control_printf_endreply(control_connection_t *conn, int code, const char *fmt,...)
size_t read_escaped_data(const char *data, size_t len, char **out)
Header file for control_proto.c.
Circuit-build-stse structure.
int ed25519_secret_key_generate(ed25519_secret_key_t *seckey_out, int extra_strong)
Common functions for using (pseudo-)random number generators.
void memwipe(void *mem, uint8_t byte, size_t sz)
Common functions for cryptographic routines.
int dnsserv_launch_request(const char *name, int reverse, control_connection_t *control_conn)
Header file for dnsserv.c.
Entry connection structure.
#define ENTRY_TO_EDGE_CONN(c)
void remove_all_entry_guards(void)
Header file for circuitbuild.c.
char * esc_for_log(const char *s)
const char * escaped(const char *s)
extend_info_t * extend_info_from_node(const node_t *node, int for_direct_connect, bool for_exit)
Header for core/or/extendinfo.c.
void control_reply_append_kv(smartlist_t *reply, const char *key, const char *val)
void control_write_reply_lines(control_connection_t *conn, smartlist_t *lines)
void control_reply_add_printf(smartlist_t *reply, int code, const char *fmt,...)
#define control_reply_free(r)
Free and null a smartlist of control_reply_line_t.
void control_reply_add_one_kv(smartlist_t *reply, int code, int flags, const char *key, const char *val)
void control_reply_add_str(smartlist_t *reply, int code, const char *s)
void control_reply_add_done(smartlist_t *reply)
hs_port_config_t * hs_parse_port_config(const char *string, const char *sep, char **err_msg_out)
int hs_parse_address(const char *address, ed25519_public_key_t *key_out, uint8_t *checksum_out, uint8_t *version_out)
int hs_address_is_valid(const char *address)
hs_service_add_ephemeral_status_t
Header file containing configuration ABI/API for the HS subsystem.
int hs_control_hspost_command(const char *body, const char *onion_address, const smartlist_t *hsdirs_rs)
void hs_control_hsfetch_command(const ed25519_public_key_t *onion_identity_pk, const smartlist_t *hsdirs)
Header file containing control port event related code.
int hs_service_del_ephemeral(const char *address)
hs_service_authorized_client_t * parse_authorized_client_key(const char *key_str, int severity)
hs_service_add_ephemeral_status_t hs_service_add_ephemeral(ed25519_secret_key_t *sk, smartlist_t *ports, int max_streams_per_rdv_circuit, int max_streams_close_circuit, int pow_defenses_enabled, uint32_t pow_queue_rate, uint32_t pow_queue_burst, smartlist_t *auth_clients_v3, char **address_out)
Header file containing service data for the HS subsystem.
config_line_t * kvline_parse(const char *line, unsigned flags)
Node information structure.
const node_t * node_get_by_nickname(const char *nickname, unsigned flags)
int node_has_preferred_descriptor(const node_t *node, int for_direct_connect)
const node_t * node_get_by_hex_id(const char *hex_id, unsigned flags)
Header file for nodelist.c.
Master header file for Tor-specific functionality.
Origin circuit structure.
uint64_t tor_parse_uint64(const char *s, int base, uint64_t min, uint64_t max, int *ok, char **next)
long tor_parse_long(const char *s, int base, long min, long max, int *ok, char **next)
unsigned long tor_parse_ulong(const char *s, int base, unsigned long min, unsigned long max, int *ok, char **next)
char * make_path_absolute(const char *fname)
int tor_asprintf(char **strp, const char *fmt,...)
Header file for rendcommon.c.
static crypto_pk_t * onionkey
uint8_t router_purpose_from_string(const char *s)
Header file for routerinfo.c.
Router descriptor structure.
#define ROUTER_PURPOSE_UNKNOWN
#define ROUTER_PURPOSE_GENERAL
int router_load_single_router(const char *s, uint8_t purpose, int cache, const char **msg)
Header file for routerlist.c.
void smartlist_add_asprintf(struct smartlist_t *sl, const char *pattern,...)
char * smartlist_join_strings(smartlist_t *sl, const char *join, int terminate, size_t *len_out)
int smartlist_string_pos(const smartlist_t *sl, const char *element)
void * smartlist_pop_last(smartlist_t *sl)
smartlist_t * smartlist_new(void)
void smartlist_add(smartlist_t *sl, void *element)
void smartlist_del(smartlist_t *sl, int idx)
#define SMARTLIST_FOREACH_BEGIN(sl, type, var)
#define SMARTLIST_FOREACH(sl, type, var, cmd)
int smartlist_split_string(smartlist_t *sl, const char *str, const char *sep, int flags, int max)
Client request structure.
void or_state_mark_dirty(or_state_t *state, time_t when)
or_state_t * get_or_state(void)
uint16_t marked_for_close
struct smartlist_t * args
struct config_line_t * kwargs
const control_cmd_syntax_t * syntax
const char ** allowed_keywords
smartlist_t * ephemeral_onion_services
unsigned int is_owning_control_connection
unsigned int have_sent_protocolinfo
unsigned int onehop_tunnel
uint8_t seckey[ED25519_SECKEY_LEN]
unsigned int edge_has_sent_end
socks_request_t * socks_request
struct config_line_t * HashedControlPassword
struct config_line_t * HashedControlSessionPassword
uint32_t global_identifier
edge_connection_t * p_streams
unsigned int any_hop_from_controller
cpath_build_state_t * build_state
unsigned first_hop_from_controller
char address[MAX_SOCKS_ADDR_LEN]
#define tor_assert_nonfatal_unreached()
#define tor_fragile_assert()
int strcasecmpstart(const char *s1, const char *s2)
int strcmpstart(const char *s1, const char *s2)
void tor_strupper(char *s)