mirror of
https://gitlab.torproject.org/tpo/core/tor.git
synced 2024-11-10 21:23:58 +01:00
Support multiple transports in a single transport line.
Support multiple comma-separated transpotrs in a single {Client,Server}TransportPlugin line.
This commit is contained in:
parent
e2703e3654
commit
105cc42e96
@ -4693,7 +4693,8 @@ parse_client_transport_line(const char *line, int validate_only)
|
||||
int r;
|
||||
char *field2=NULL;
|
||||
|
||||
const char *name=NULL;
|
||||
const char *transports=NULL;
|
||||
smartlist_t *transport_list=NULL;
|
||||
char *addrport=NULL;
|
||||
tor_addr_t addr;
|
||||
uint16_t port = 0;
|
||||
@ -4717,11 +4718,20 @@ parse_client_transport_line(const char *line, int validate_only)
|
||||
goto err;
|
||||
}
|
||||
|
||||
name = smartlist_get(items, 0);
|
||||
if (!string_is_C_identifier(name)) {
|
||||
log_warn(LD_CONFIG, "Transport name is not a C identifier (%s).", name);
|
||||
goto err;
|
||||
}
|
||||
/* Get the first line element, split it to commas into
|
||||
transport_list (in case it's multiple transports) and validate
|
||||
the transport names. */
|
||||
transports = smartlist_get(items, 0);
|
||||
transport_list = smartlist_create();
|
||||
smartlist_split_string(transport_list, transports, ",",
|
||||
SPLIT_SKIP_SPACE|SPLIT_IGNORE_BLANK, 0);
|
||||
SMARTLIST_FOREACH_BEGIN(transport_list, const char *, transport_name) {
|
||||
if (!string_is_C_identifier(transport_name)) {
|
||||
log_warn(LD_CONFIG, "Transport name is not a C identifier (%s).",
|
||||
transport_name);
|
||||
goto err;
|
||||
}
|
||||
} SMARTLIST_FOREACH_END(transport_name);
|
||||
|
||||
/* field2 is either a SOCKS version or "exec" */
|
||||
field2 = smartlist_get(items, 1);
|
||||
@ -4753,9 +4763,15 @@ parse_client_transport_line(const char *line, int validate_only)
|
||||
*tmp = NULL; /*terminated with NUL pointer, just like execve() likes it*/
|
||||
|
||||
/* kickstart the thing */
|
||||
pt_kickstart_client_proxy(name, proxy_argv);
|
||||
pt_kickstart_client_proxy(transport_list, proxy_argv);
|
||||
}
|
||||
} else { /* external */
|
||||
if (smartlist_len(transport_list) != 1) {
|
||||
log_warn(LD_CONFIG, "You can't have an external proxy with "
|
||||
"more than one transports.");
|
||||
goto err;
|
||||
}
|
||||
|
||||
addrport = smartlist_get(items, 2);
|
||||
|
||||
if (tor_addr_port_parse(addrport, &addr, &port)<0) {
|
||||
@ -4770,10 +4786,11 @@ parse_client_transport_line(const char *line, int validate_only)
|
||||
}
|
||||
|
||||
if (!validate_only) {
|
||||
transport_add_from_config(&addr, port, name, socks_ver);
|
||||
transport_add_from_config(&addr, port, smartlist_get(transport_list, 0),
|
||||
socks_ver);
|
||||
|
||||
log_info(LD_DIR, "Transport '%s' found at %s:%d", name,
|
||||
fmt_addr(&addr), (int)port);
|
||||
log_info(LD_DIR, "Transport '%s' found at %s:%d",
|
||||
transports, fmt_addr(&addr), (int)port);
|
||||
}
|
||||
}
|
||||
|
||||
@ -4786,6 +4803,9 @@ parse_client_transport_line(const char *line, int validate_only)
|
||||
done:
|
||||
SMARTLIST_FOREACH(items, char*, s, tor_free(s));
|
||||
smartlist_free(items);
|
||||
SMARTLIST_FOREACH(transport_list, char*, s, tor_free(s));
|
||||
smartlist_free(transport_list);
|
||||
|
||||
return r;
|
||||
}
|
||||
|
||||
@ -4799,7 +4819,8 @@ parse_server_transport_line(const char *line, int validate_only)
|
||||
{
|
||||
smartlist_t *items = NULL;
|
||||
int r;
|
||||
const char *name=NULL;
|
||||
const char *transports=NULL;
|
||||
smartlist_t *transport_list=NULL;
|
||||
char *type=NULL;
|
||||
char *addrport=NULL;
|
||||
tor_addr_t addr;
|
||||
@ -4823,11 +4844,20 @@ parse_server_transport_line(const char *line, int validate_only)
|
||||
goto err;
|
||||
}
|
||||
|
||||
name = smartlist_get(items, 0);
|
||||
if (!string_is_C_identifier(name)) {
|
||||
log_warn(LD_CONFIG, "Transport name is not a C identifier (%s).", name);
|
||||
goto err;
|
||||
}
|
||||
/* Get the first line element, split it to commas into
|
||||
transport_list (in case it's multiple transports) and validate
|
||||
the transport names. */
|
||||
transports = smartlist_get(items, 0);
|
||||
transport_list = smartlist_create();
|
||||
smartlist_split_string(transport_list, transports, ",",
|
||||
SPLIT_SKIP_SPACE|SPLIT_IGNORE_BLANK, 0);
|
||||
SMARTLIST_FOREACH_BEGIN(transport_list, const char *, transport_name) {
|
||||
if (!string_is_C_identifier(transport_name)) {
|
||||
log_warn(LD_CONFIG, "Transport name is not a C identifier (%s).",
|
||||
transport_name);
|
||||
goto err;
|
||||
}
|
||||
} SMARTLIST_FOREACH_END(transport_name);
|
||||
|
||||
type = smartlist_get(items, 1);
|
||||
|
||||
@ -4854,9 +4884,15 @@ parse_server_transport_line(const char *line, int validate_only)
|
||||
*tmp = NULL; /*terminated with NUL pointer, just like execve() likes it*/
|
||||
|
||||
/* kickstart the thing */
|
||||
pt_kickstart_server_proxy(name, proxy_argv);
|
||||
pt_kickstart_server_proxy(transport_list, proxy_argv);
|
||||
}
|
||||
} else { /* external */
|
||||
if (smartlist_len(transport_list) != 1) {
|
||||
log_warn(LD_CONFIG, "You can't have an external proxy with "
|
||||
"more than one transports.");
|
||||
goto err;
|
||||
}
|
||||
|
||||
addrport = smartlist_get(items, 2);
|
||||
|
||||
if (tor_addr_port_parse(addrport, &addr, &port)<0) {
|
||||
@ -4871,8 +4907,8 @@ parse_server_transport_line(const char *line, int validate_only)
|
||||
}
|
||||
|
||||
if (!validate_only) {
|
||||
log_info(LD_DIR, "Server transport '%s' at %s:%d.", name,
|
||||
fmt_addr(&addr), (int)port);
|
||||
log_info(LD_DIR, "Server transport '%s' at %s:%d.",
|
||||
transports, fmt_addr(&addr), (int)port);
|
||||
}
|
||||
}
|
||||
|
||||
@ -4885,6 +4921,9 @@ parse_server_transport_line(const char *line, int validate_only)
|
||||
done:
|
||||
SMARTLIST_FOREACH(items, char*, s, tor_free(s));
|
||||
smartlist_free(items);
|
||||
SMARTLIST_FOREACH(transport_list, char*, s, tor_free(s));
|
||||
smartlist_free(transport_list);
|
||||
|
||||
return r;
|
||||
}
|
||||
|
||||
@ -5993,3 +6032,4 @@ getinfo_helper_config(control_connection_t *conn,
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -890,7 +890,8 @@ set_managed_proxy_environment(char ***envp, const managed_proxy_t *mp)
|
||||
* <b>proxy_argv</b>. If <b>is_server</b> is true, it's a server
|
||||
* managed proxy. */
|
||||
static managed_proxy_t *
|
||||
managed_proxy_create(const char *transport, char **proxy_argv, int is_server)
|
||||
managed_proxy_create(const smartlist_t *transport_list,
|
||||
char **proxy_argv, int is_server)
|
||||
{
|
||||
managed_proxy_t *mp = tor_malloc_zero(sizeof(managed_proxy_t));
|
||||
mp->conf_state = PT_PROTO_INFANT;
|
||||
@ -899,7 +900,8 @@ managed_proxy_create(const char *transport, char **proxy_argv, int is_server)
|
||||
mp->transports = smartlist_create();
|
||||
|
||||
mp->transports_to_launch = smartlist_create();
|
||||
add_transport_to_proxy(transport, mp);
|
||||
SMARTLIST_FOREACH(transport_list, const char *, transport,
|
||||
add_transport_to_proxy(transport, mp));
|
||||
|
||||
/* register the managed proxy */
|
||||
if (!managed_proxy_list)
|
||||
@ -914,7 +916,8 @@ managed_proxy_create(const char *transport, char **proxy_argv, int is_server)
|
||||
* the managed proxy subsystem.
|
||||
* If <b>is_server</b> is true, then the proxy is a server proxy. */
|
||||
void
|
||||
pt_kickstart_proxy(const char *transport, char **proxy_argv, int is_server)
|
||||
pt_kickstart_proxy(const smartlist_t *transport_list,
|
||||
char **proxy_argv, int is_server)
|
||||
{
|
||||
managed_proxy_t *mp=NULL;
|
||||
transport_t *old_transport = NULL;
|
||||
@ -922,7 +925,7 @@ pt_kickstart_proxy(const char *transport, char **proxy_argv, int is_server)
|
||||
mp = get_managed_proxy_by_argv_and_type(proxy_argv, is_server);
|
||||
|
||||
if (!mp) { /* we haven't seen this proxy before */
|
||||
managed_proxy_create(transport, proxy_argv, is_server);
|
||||
managed_proxy_create(transport_list, proxy_argv, is_server);
|
||||
|
||||
} else { /* known proxy. add its transport to its transport list */
|
||||
if (mp->got_hup) {
|
||||
@ -938,12 +941,15 @@ pt_kickstart_proxy(const char *transport, char **proxy_argv, int is_server)
|
||||
unconfigured_proxies_n++;
|
||||
}
|
||||
|
||||
old_transport = transport_get_by_name(transport);
|
||||
if (old_transport)
|
||||
old_transport->marked_for_removal = 0;
|
||||
SMARTLIST_FOREACH_BEGIN(transport_list, const char *, transport) {
|
||||
old_transport = transport_get_by_name(transport);
|
||||
if (old_transport)
|
||||
old_transport->marked_for_removal = 0;
|
||||
} SMARTLIST_FOREACH_END(transport);
|
||||
}
|
||||
|
||||
add_transport_to_proxy(transport, mp);
|
||||
SMARTLIST_FOREACH(transport_list, const char *, transport,
|
||||
add_transport_to_proxy(transport, mp));
|
||||
free_execve_args(proxy_argv);
|
||||
}
|
||||
}
|
||||
|
@ -11,13 +11,13 @@
|
||||
#ifndef TOR_TRANSPORTS_H
|
||||
#define TOR_TRANSPORTS_H
|
||||
|
||||
void pt_kickstart_proxy(const char *method, char **proxy_argv,
|
||||
void pt_kickstart_proxy(const smartlist_t *transport_list, char **proxy_argv,
|
||||
int is_server);
|
||||
|
||||
#define pt_kickstart_client_proxy(m, pa) \
|
||||
pt_kickstart_proxy(m, pa, 0)
|
||||
#define pt_kickstart_server_proxy(m, pa) \
|
||||
pt_kickstart_proxy(m, pa, 1)
|
||||
#define pt_kickstart_client_proxy(tl, pa) \
|
||||
pt_kickstart_proxy(tl, pa, 0)
|
||||
#define pt_kickstart_server_proxy(tl, pa) \
|
||||
pt_kickstart_proxy(tl, pa, 1)
|
||||
|
||||
void pt_configure_remaining_proxies(void);
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user