mirror of
https://gitlab.torproject.org/tpo/core/tor.git
synced 2024-11-23 20:03:31 +01:00
Merge remote-tracking branch 'fristonio/ticket-6236'
This commit is contained in:
commit
b0f0c0f550
4
changes/ticket6236
Normal file
4
changes/ticket6236
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
o Minor bugfixes (Duplicate code):
|
||||||
|
- Remove duplicate code in parse_{c,s}method_line and bootstrap
|
||||||
|
their functionalities into a single function. Fixes
|
||||||
|
bug 6236; bugfix on 0.2.3.6-alpha.
|
@ -1025,48 +1025,71 @@ parse_method_error(const char *line, int is_server)
|
|||||||
line+strlen(error)+1);
|
line+strlen(error)+1);
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Parses an SMETHOD <b>line</b> and if well-formed it registers the
|
/** A helper for parse_{c,s}method_line(), bootstraps its
|
||||||
* new transport in <b>mp</b>. */
|
* functionalities. If <b>is_smethod</b> is true then the
|
||||||
STATIC int
|
* the line to parse is a SMETHOD line otherwise it is a
|
||||||
parse_smethod_line(const char *line, managed_proxy_t *mp)
|
* CMETHOD line*/
|
||||||
|
static int
|
||||||
|
parse_method_line_helper(const char *line,
|
||||||
|
managed_proxy_t *mp,
|
||||||
|
int is_smethod)
|
||||||
{
|
{
|
||||||
|
int item_index = 0;
|
||||||
int r;
|
int r;
|
||||||
smartlist_t *items = NULL;
|
|
||||||
|
|
||||||
char *method_name=NULL;
|
char *transport_name=NULL;
|
||||||
char *args_string=NULL;
|
char *args_string=NULL;
|
||||||
char *addrport=NULL;
|
char *addrport=NULL;
|
||||||
tor_addr_t tor_addr;
|
int socks_ver=PROXY_NONE;
|
||||||
char *address=NULL;
|
char *address=NULL;
|
||||||
uint16_t port = 0;
|
uint16_t port = 0;
|
||||||
|
|
||||||
transport_t *transport=NULL;
|
const char *method_str = is_smethod ? PROTO_SMETHOD : PROTO_CMETHOD;
|
||||||
|
const int min_args_count = is_smethod ? 3 : 4;
|
||||||
|
|
||||||
|
tor_addr_t tor_addr;
|
||||||
|
transport_t *transport=NULL;
|
||||||
|
smartlist_t *items= smartlist_new();
|
||||||
|
|
||||||
items = smartlist_new();
|
|
||||||
smartlist_split_string(items, line, NULL,
|
smartlist_split_string(items, line, NULL,
|
||||||
SPLIT_SKIP_SPACE|SPLIT_IGNORE_BLANK, -1);
|
SPLIT_SKIP_SPACE|SPLIT_IGNORE_BLANK, -1);
|
||||||
if (smartlist_len(items) < 3) {
|
if (smartlist_len(items) < min_args_count) {
|
||||||
log_warn(LD_CONFIG, "Server managed proxy sent us a SMETHOD line "
|
log_warn(LD_CONFIG, "Managed proxy sent us a %s line "
|
||||||
"with too few arguments.");
|
"with too few arguments.", method_str);
|
||||||
goto err;
|
goto err;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Example of legit SMETHOD line:
|
tor_assert(!strcmp(smartlist_get(items, item_index),method_str));
|
||||||
SMETHOD obfs2 0.0.0.0:25612 ARGS:secret=supersekrit,key=superkey */
|
++item_index;
|
||||||
|
|
||||||
tor_assert(!strcmp(smartlist_get(items,0),PROTO_SMETHOD));
|
transport_name = smartlist_get(items,item_index);
|
||||||
|
++item_index;
|
||||||
method_name = smartlist_get(items,1);
|
if (!string_is_C_identifier(transport_name)) {
|
||||||
if (!string_is_C_identifier(method_name)) {
|
|
||||||
log_warn(LD_CONFIG, "Transport name is not a C identifier (%s).",
|
log_warn(LD_CONFIG, "Transport name is not a C identifier (%s).",
|
||||||
method_name);
|
transport_name);
|
||||||
goto err;
|
goto err;
|
||||||
}
|
}
|
||||||
|
|
||||||
addrport = smartlist_get(items, 2);
|
/** Check for the proxy method sent to us in CMETHOD line. */
|
||||||
|
if (!is_smethod) {
|
||||||
|
const char *socks_ver_str = smartlist_get(items,item_index);
|
||||||
|
++item_index;
|
||||||
|
|
||||||
|
if (!strcmp(socks_ver_str,"socks4")) {
|
||||||
|
socks_ver = PROXY_SOCKS4;
|
||||||
|
} else if (!strcmp(socks_ver_str,"socks5")) {
|
||||||
|
socks_ver = PROXY_SOCKS5;
|
||||||
|
} else {
|
||||||
|
log_warn(LD_CONFIG, "Client managed proxy sent us a proxy protocol "
|
||||||
|
"we don't recognize. (%s)", socks_ver_str);
|
||||||
|
goto err;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
addrport = smartlist_get(items, item_index);
|
||||||
|
++item_index;
|
||||||
if (tor_addr_port_split(LOG_WARN, addrport, &address, &port)<0) {
|
if (tor_addr_port_split(LOG_WARN, addrport, &address, &port)<0) {
|
||||||
log_warn(LD_CONFIG, "Error parsing transport "
|
log_warn(LD_CONFIG, "Error parsing transport address '%s'", addrport);
|
||||||
"address '%s'", addrport);
|
|
||||||
goto err;
|
goto err;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1081,10 +1104,11 @@ parse_smethod_line(const char *line, managed_proxy_t *mp)
|
|||||||
goto err;
|
goto err;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (smartlist_len(items) > 3) {
|
/** Check for options in the SMETHOD line. */
|
||||||
|
if (is_smethod && smartlist_len(items) > min_args_count) {
|
||||||
/* Seems like there are also some [options] in the SMETHOD line.
|
/* Seems like there are also some [options] in the SMETHOD line.
|
||||||
Let's see if we can parse them. */
|
Let's see if we can parse them. */
|
||||||
char *options_string = smartlist_get(items, 3);
|
char *options_string = smartlist_get(items, item_index);
|
||||||
log_debug(LD_CONFIG, "Got options_string: %s", options_string);
|
log_debug(LD_CONFIG, "Got options_string: %s", options_string);
|
||||||
if (!strcmpstart(options_string, "ARGS:")) {
|
if (!strcmpstart(options_string, "ARGS:")) {
|
||||||
args_string = options_string+strlen("ARGS:");
|
args_string = options_string+strlen("ARGS:");
|
||||||
@ -1092,15 +1116,20 @@ parse_smethod_line(const char *line, managed_proxy_t *mp)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
transport = transport_new(&tor_addr, port, method_name,
|
transport = transport_new(&tor_addr, port, transport_name,
|
||||||
PROXY_NONE, args_string);
|
socks_ver, args_string);
|
||||||
|
|
||||||
smartlist_add(mp->transports, transport);
|
smartlist_add(mp->transports, transport);
|
||||||
|
|
||||||
/* For now, notify the user so that they know where the server
|
/** Logs info about line parsing success for client or server */
|
||||||
transport is listening. */
|
if (is_smethod) {
|
||||||
log_info(LD_CONFIG, "Server transport %s at %s:%d.",
|
log_info(LD_CONFIG, "Server transport %s at %s:%d.",
|
||||||
method_name, address, (int)port);
|
transport_name, address, (int)port);
|
||||||
|
} else {
|
||||||
|
log_info(LD_CONFIG, "Transport %s at %s:%d with SOCKS %d. "
|
||||||
|
"Attached to managed proxy.",
|
||||||
|
transport_name, address, (int)port, socks_ver);
|
||||||
|
}
|
||||||
|
|
||||||
r=0;
|
r=0;
|
||||||
goto done;
|
goto done;
|
||||||
@ -1115,93 +1144,24 @@ parse_smethod_line(const char *line, managed_proxy_t *mp)
|
|||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** Parses an SMETHOD <b>line</b> and if well-formed it registers the
|
||||||
|
* new transport in <b>mp</b>. */
|
||||||
|
STATIC int
|
||||||
|
parse_smethod_line(const char *line, managed_proxy_t *mp)
|
||||||
|
{
|
||||||
|
/* Example of legit SMETHOD line:
|
||||||
|
SMETHOD obfs2 0.0.0.0:25612 ARGS:secret=supersekrit,key=superkey */
|
||||||
|
return parse_method_line_helper(line, mp, 1);
|
||||||
|
}
|
||||||
|
|
||||||
/** Parses a CMETHOD <b>line</b>, and if well-formed it registers
|
/** Parses a CMETHOD <b>line</b>, and if well-formed it registers
|
||||||
* the new transport in <b>mp</b>. */
|
* the new transport in <b>mp</b>. */
|
||||||
STATIC int
|
STATIC int
|
||||||
parse_cmethod_line(const char *line, managed_proxy_t *mp)
|
parse_cmethod_line(const char *line, managed_proxy_t *mp)
|
||||||
{
|
{
|
||||||
int r;
|
/* Example of legit CMETHOD line:
|
||||||
smartlist_t *items = NULL;
|
CMETHOD obfs2 socks5 127.0.0.1:35713 */
|
||||||
|
return parse_method_line_helper(line, mp, 0);
|
||||||
char *method_name=NULL;
|
|
||||||
|
|
||||||
char *socks_ver_str=NULL;
|
|
||||||
int socks_ver=PROXY_NONE;
|
|
||||||
|
|
||||||
char *addrport=NULL;
|
|
||||||
tor_addr_t tor_addr;
|
|
||||||
char *address=NULL;
|
|
||||||
uint16_t port = 0;
|
|
||||||
|
|
||||||
transport_t *transport=NULL;
|
|
||||||
|
|
||||||
items = smartlist_new();
|
|
||||||
smartlist_split_string(items, line, NULL,
|
|
||||||
SPLIT_SKIP_SPACE|SPLIT_IGNORE_BLANK, -1);
|
|
||||||
if (smartlist_len(items) < 4) {
|
|
||||||
log_warn(LD_CONFIG, "Client managed proxy sent us a CMETHOD line "
|
|
||||||
"with too few arguments.");
|
|
||||||
goto err;
|
|
||||||
}
|
|
||||||
|
|
||||||
tor_assert(!strcmp(smartlist_get(items,0),PROTO_CMETHOD));
|
|
||||||
|
|
||||||
method_name = smartlist_get(items,1);
|
|
||||||
if (!string_is_C_identifier(method_name)) {
|
|
||||||
log_warn(LD_CONFIG, "Transport name is not a C identifier (%s).",
|
|
||||||
method_name);
|
|
||||||
goto err;
|
|
||||||
}
|
|
||||||
|
|
||||||
socks_ver_str = smartlist_get(items,2);
|
|
||||||
|
|
||||||
if (!strcmp(socks_ver_str,"socks4")) {
|
|
||||||
socks_ver = PROXY_SOCKS4;
|
|
||||||
} else if (!strcmp(socks_ver_str,"socks5")) {
|
|
||||||
socks_ver = PROXY_SOCKS5;
|
|
||||||
} else {
|
|
||||||
log_warn(LD_CONFIG, "Client managed proxy sent us a proxy protocol "
|
|
||||||
"we don't recognize. (%s)", socks_ver_str);
|
|
||||||
goto err;
|
|
||||||
}
|
|
||||||
|
|
||||||
addrport = smartlist_get(items, 3);
|
|
||||||
if (tor_addr_port_split(LOG_WARN, addrport, &address, &port)<0) {
|
|
||||||
log_warn(LD_CONFIG, "Error parsing transport "
|
|
||||||
"address '%s'", addrport);
|
|
||||||
goto err;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!port) {
|
|
||||||
log_warn(LD_CONFIG,
|
|
||||||
"Transport address '%s' has no port.", addrport);
|
|
||||||
goto err;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (tor_addr_parse(&tor_addr, address) < 0) {
|
|
||||||
log_warn(LD_CONFIG, "Error parsing transport address '%s'", address);
|
|
||||||
goto err;
|
|
||||||
}
|
|
||||||
|
|
||||||
transport = transport_new(&tor_addr, port, method_name, socks_ver, NULL);
|
|
||||||
|
|
||||||
smartlist_add(mp->transports, transport);
|
|
||||||
|
|
||||||
log_info(LD_CONFIG, "Transport %s at %s:%d with SOCKS %d. "
|
|
||||||
"Attached to managed proxy.",
|
|
||||||
method_name, address, (int)port, socks_ver);
|
|
||||||
|
|
||||||
r=0;
|
|
||||||
goto done;
|
|
||||||
|
|
||||||
err:
|
|
||||||
r = -1;
|
|
||||||
|
|
||||||
done:
|
|
||||||
SMARTLIST_FOREACH(items, char*, s, tor_free(s));
|
|
||||||
smartlist_free(items);
|
|
||||||
tor_free(address);
|
|
||||||
return r;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Parses an PROXY-ERROR <b>line</b> and warns the user accordingly. */
|
/** Parses an PROXY-ERROR <b>line</b> and warns the user accordingly. */
|
||||||
|
Loading…
Reference in New Issue
Block a user