Place the options in the environment after processing them properly.

This commit is contained in:
George Kadianakis 2013-06-12 17:12:39 +03:00 committed by Nick Mathewson
parent 1a0cf08841
commit 1ee3a0cf44
3 changed files with 71 additions and 1 deletions

View File

@ -4671,6 +4671,26 @@ get_transport_bindaddr_from_config(const char *transport)
return NULL;
}
/** Given the name of a pluggable transport in <b>transport</b>, check
* the configuration file to see if the user has asked us to pass any
* parameters to the pluggable transport. Return a smartlist
* containing the parameters, otherwise NULL. */
smartlist_t *
get_options_for_server_transport(const char *transport)
{
config_line_t *cl;
const or_options_t *options = get_options();
for (cl = options->ServerTransportOptions; cl; cl = cl->next) {
smartlist_t *options_sl =
get_options_from_transport_options_line(cl->value, transport);
if (options_sl)
return options_sl;
}
return NULL;
}
/** Read the contents of a ServerTransportPlugin line from
* <b>line</b>. Return 0 if the line is well-formed, and -1 if it
* isn't.

View File

@ -114,7 +114,7 @@ void bridge_line_free(bridge_line_t *bridge_line);
bridge_line_t *parse_bridge_line(const char *line);
smartlist_t *get_options_from_transport_options_line(const char *line,
const char *transport);
smartlist_t *get_options_for_server_transport(const char *transport);
#endif

View File

@ -1100,6 +1100,48 @@ parse_cmethod_line(const char *line, managed_proxy_t *mp)
return r;
}
/** Return a newly allocated string that tor should place in
* TOR_PT_SERVER_TRANSPORT_OPTIONS while configuring the server
* manged proxy in <b>mp</b>. Return NULL if no such options are found. */
static char *
get_transport_options_for_server_proxy(const managed_proxy_t *mp)
{
char *options_string = NULL;
smartlist_t *string_sl = smartlist_new();
tor_assert(mp->is_server);
/** Loop over the transports of the proxy. If we have options for
any of them, format them appropriately and place them in our
smartlist. Finally, join our smartlist to get the final
string. */
SMARTLIST_FOREACH_BEGIN(mp->transports_to_launch, const char *, transport) {
smartlist_t *options_tmp_sl = NULL;
options_tmp_sl = get_options_for_server_transport(transport);
if (!options_tmp_sl)
continue;
/** Loop over the options of this transport, escape them, and
place them in the smartlist. */
SMARTLIST_FOREACH_BEGIN(options_tmp_sl, const char *, options) {
char *escaped_opts = tor_escape_str_for_pt_args(options, ":;\\");
smartlist_add_asprintf(string_sl, "%s:%s",
transport, escaped_opts);
tor_free(escaped_opts);
} SMARTLIST_FOREACH_END(options);
SMARTLIST_FOREACH(options_tmp_sl, char *, c, tor_free(c));
smartlist_free(options_tmp_sl);
} SMARTLIST_FOREACH_END(transport);
options_string = smartlist_join_strings(string_sl, ";", 0, NULL);
SMARTLIST_FOREACH(string_sl, char *, t, tor_free(t));
smartlist_free(string_sl);
return options_string;
}
/** Return the string that tor should place in TOR_PT_SERVER_BINDADDR
* while configuring the server managed proxy in <b>mp</b>. The
* string is stored in the heap, and it's the the responsibility of
@ -1181,6 +1223,14 @@ create_managed_proxy_environment(const managed_proxy_t *mp)
tor_free(bindaddr_tmp);
}
{
char *server_transport_options =
get_transport_options_for_server_proxy(mp);
smartlist_add_asprintf(envs, "TOR_PT_SERVER_TRANSPORT_OPTIONS=%s",
server_transport_options);
tor_free(server_transport_options);
}
/* XXX024 Remove the '=' here once versions of obfsproxy which
* assert that this env var exists are sufficiently dead.
*