mirror of
https://gitlab.torproject.org/tpo/core/tor.git
synced 2024-11-10 05:03:43 +01:00
Add support for PT STATUS TYPE=version messages.
This patch adds support for handling the version status message. Once we receive such message, we add the given version string to the managed_proxy_t instance. Note this value can be NULL and the value can change throughout the lifetime of the PT as multiple status version messages are handled. See: tpo/core/tor#11101
This commit is contained in:
parent
0c1a39a955
commit
b6e260e699
@ -741,6 +741,9 @@ managed_proxy_destroy(managed_proxy_t *mp,
|
||||
/* free the outgoing proxy URI */
|
||||
tor_free(mp->proxy_uri);
|
||||
|
||||
/* free our version, if any is set. */
|
||||
tor_free(mp->version);
|
||||
|
||||
/* do we want to terminate our process if it's still running? */
|
||||
if (also_terminate_process && mp->process) {
|
||||
/* Note that we do not call process_free(mp->process) here because we let
|
||||
@ -1293,6 +1296,9 @@ parse_status_line(const char *line, managed_proxy_t *mp)
|
||||
goto done;
|
||||
}
|
||||
|
||||
/* Handle the different messages. */
|
||||
handle_status_message(values, mp);
|
||||
|
||||
/* Prepend the PT name. */
|
||||
config_line_prepend(&values, "PT", mp->argv[0]);
|
||||
status_message = kvline_encode(values, KV_QUOTED);
|
||||
@ -1306,6 +1312,36 @@ parse_status_line(const char *line, managed_proxy_t *mp)
|
||||
tor_free(status_message);
|
||||
}
|
||||
|
||||
STATIC void
|
||||
handle_status_message(const config_line_t *values,
|
||||
managed_proxy_t *mp)
|
||||
{
|
||||
const config_line_t *message_type = config_line_find(values, "TYPE");
|
||||
|
||||
/* Check if we have a TYPE field? */
|
||||
if (message_type == NULL) {
|
||||
log_debug(LD_PT, "Managed proxy \"%s\" wrote a STATUS line without "
|
||||
"a defined message TYPE", mp->argv[0]);
|
||||
return;
|
||||
}
|
||||
|
||||
/* Handle VERSION messages. */
|
||||
if (! strcasecmp(message_type->value, "version")) {
|
||||
const config_line_t *version = config_line_find(values, "VERSION");
|
||||
|
||||
if (version == NULL) {
|
||||
log_warn(LD_PT, "Managed proxy \"%s\" wrote a STATUS TYPE=version line "
|
||||
"with a missing VERSION field", mp->argv[0]);
|
||||
return;
|
||||
}
|
||||
|
||||
tor_free(mp->version);
|
||||
mp->version = tor_strdup(version->value);
|
||||
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
/** 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. */
|
||||
|
@ -114,11 +114,16 @@ typedef struct {
|
||||
/* transports to-be-launched by this proxy */
|
||||
smartlist_t *transports_to_launch;
|
||||
|
||||
/** Version as set by STATUS TYPE=version messages. */
|
||||
char *version;
|
||||
|
||||
/* The 'transports' list contains all the transports this proxy has
|
||||
launched. */
|
||||
smartlist_t *transports;
|
||||
} managed_proxy_t;
|
||||
|
||||
struct config_line_t;
|
||||
|
||||
STATIC transport_t *transport_new(const tor_addr_t *addr, uint16_t port,
|
||||
const char *name, int socks_ver,
|
||||
const char *extra_info_args);
|
||||
@ -131,6 +136,8 @@ STATIC void parse_proxy_error(const char *line);
|
||||
STATIC void handle_proxy_line(const char *line, managed_proxy_t *mp);
|
||||
STATIC void parse_log_line(const char *line, managed_proxy_t *mp);
|
||||
STATIC void parse_status_line(const char *line, managed_proxy_t *mp);
|
||||
STATIC void handle_status_message(const struct config_line_t *values,
|
||||
managed_proxy_t *mp);
|
||||
STATIC char *get_transport_options_for_server_proxy(const managed_proxy_t *mp);
|
||||
|
||||
STATIC void managed_proxy_destroy(managed_proxy_t *mp,
|
||||
|
@ -142,6 +142,40 @@ test_pt_parsing(void *arg)
|
||||
tor_free(mp);
|
||||
}
|
||||
|
||||
static void
|
||||
test_pt_status_parsing(void *arg)
|
||||
{
|
||||
char line[200];
|
||||
char *test_binary = tor_strdup("test-pt");
|
||||
char *argv[] = {
|
||||
test_binary,
|
||||
NULL,
|
||||
};
|
||||
|
||||
managed_proxy_t *mp = tor_malloc_zero(sizeof(managed_proxy_t));
|
||||
(void)arg;
|
||||
mp->conf_state = PT_PROTO_INFANT;
|
||||
mp->transports = smartlist_new();
|
||||
mp->argv = argv;
|
||||
|
||||
/* STATUS TYPE=version messages. */
|
||||
tt_ptr_op(mp->version, OP_EQ, NULL);
|
||||
strlcpy(line, "STATUS TRANSPORT=x "
|
||||
"TYPE=version "
|
||||
"VERSION=\"1.33.7-hax beta\"",
|
||||
sizeof(line));
|
||||
handle_proxy_line(line, mp);
|
||||
tt_str_op(mp->version, OP_EQ, "1.33.7-hax beta");
|
||||
|
||||
reset_mp(mp);
|
||||
|
||||
done:
|
||||
reset_mp(mp);
|
||||
smartlist_free(mp->transports);
|
||||
tor_free(mp);
|
||||
tor_free(test_binary);
|
||||
}
|
||||
|
||||
static void
|
||||
test_pt_get_transport_options(void *arg)
|
||||
{
|
||||
@ -590,6 +624,7 @@ test_get_pt_proxy_uri(void *arg)
|
||||
|
||||
struct testcase_t pt_tests[] = {
|
||||
PT_LEGACY(parsing),
|
||||
PT_LEGACY(status_parsing),
|
||||
PT_LEGACY(protocol),
|
||||
{ "get_transport_options", test_pt_get_transport_options, TT_FORK,
|
||||
NULL, NULL },
|
||||
|
Loading…
Reference in New Issue
Block a user