mirror of
https://gitlab.torproject.org/tpo/core/tor.git
synced 2025-02-25 07:07:52 +01:00
config: Change Address to be a LINELIST
With prop312, we want to support IPv4 and IPv6 thus multiple Address statement (up to 2) will be accepted. For this, "Address" option becomes a LINELIST so we can properly process the IPv4 or/and IPv6. Part of #33233 Signed-off-by: David Goulet <dgoulet@torproject.org>
This commit is contained in:
parent
d3bcbccab9
commit
47f9edde69
6 changed files with 30 additions and 26 deletions
|
@ -313,7 +313,7 @@ static const config_var_t option_vars_[] = {
|
|||
V(AccountingMax, MEMUNIT, "0 bytes"),
|
||||
VAR("AccountingRule", STRING, AccountingRule_option, "max"),
|
||||
V(AccountingStart, STRING, NULL),
|
||||
V(Address, STRING, NULL),
|
||||
V(Address, LINELIST, NULL),
|
||||
OBSOLETE("AllowDotExit"),
|
||||
OBSOLETE("AllowInvalidNodes"),
|
||||
V(AllowNonRFC953Hostnames, BOOL, "0"),
|
||||
|
@ -4028,7 +4028,7 @@ options_check_transition_cb(const void *old_,
|
|||
if (! CFG_EQ_INT(old, new_val, opt)) \
|
||||
BAD_CHANGE_TO(opt," with Sandbox active")
|
||||
|
||||
SB_NOCHANGE_STR(Address);
|
||||
SB_NOCHANGE_LINELIST(Address);
|
||||
SB_NOCHANGE_STR(ServerDNSResolvConfFile);
|
||||
SB_NOCHANGE_STR(DirPortFrontPage);
|
||||
SB_NOCHANGE_STR(CookieAuthFile);
|
||||
|
|
|
@ -71,7 +71,10 @@ struct or_options_t {
|
|||
int CacheDirectoryGroupReadable; /**< Boolean: Is the CacheDirectory g+r? */
|
||||
|
||||
char *Nickname; /**< OR only: nickname of this onion router. */
|
||||
char *Address; /**< OR only: configured address for this onion router. */
|
||||
/** OR only: configured address for this onion router. Up to two times this
|
||||
* options is accepted as in IPv4 and IPv6. */
|
||||
struct config_line_t *Address;
|
||||
|
||||
char *PidFile; /**< Where to store PID of Tor process. */
|
||||
|
||||
struct routerset_t *ExitNodes; /**< Structure containing nicknames, digests,
|
||||
|
|
|
@ -15,6 +15,7 @@
|
|||
|
||||
#include "feature/control/control_events.h"
|
||||
|
||||
#include "lib/encoding/confline.h"
|
||||
#include "lib/net/gethostname.h"
|
||||
#include "lib/net/resolve.h"
|
||||
|
||||
|
@ -97,7 +98,6 @@ resolve_my_address(int warn_severity, const or_options_t *options,
|
|||
int explicit_hostname=1;
|
||||
int from_interface=0;
|
||||
char *addr_string = NULL;
|
||||
const char *address = options->Address;
|
||||
int notice_severity = warn_severity <= LOG_NOTICE ?
|
||||
LOG_NOTICE : warn_severity;
|
||||
|
||||
|
@ -108,8 +108,9 @@ resolve_my_address(int warn_severity, const or_options_t *options,
|
|||
* Step one: Fill in 'hostname' to be our best guess.
|
||||
*/
|
||||
|
||||
if (address && *address) {
|
||||
strlcpy(hostname, address, sizeof(hostname));
|
||||
if (options->Address) {
|
||||
/* Only 1 Address is supported even though this is a list. */
|
||||
strlcpy(hostname, options->Address->value, sizeof(hostname));
|
||||
log_debug(LD_CONFIG, "Trying configured Address '%s' as local hostname",
|
||||
hostname);
|
||||
} else { /* then we need to guess our address */
|
||||
|
|
|
@ -795,8 +795,7 @@ do_dump_config(void)
|
|||
static void
|
||||
init_addrinfo(void)
|
||||
{
|
||||
if (! server_mode(get_options()) ||
|
||||
(get_options()->Address && strlen(get_options()->Address) > 0)) {
|
||||
if (! server_mode(get_options()) || get_options()->Address) {
|
||||
/* We don't need to seed our own hostname, because we won't be calling
|
||||
* resolve_my_address on it.
|
||||
*/
|
||||
|
|
|
@ -1029,7 +1029,7 @@ options_transition_affects_descriptor(const or_options_t *old_options,
|
|||
|
||||
YES_IF_CHANGED_STRING(DataDirectory);
|
||||
YES_IF_CHANGED_STRING(Nickname);
|
||||
YES_IF_CHANGED_STRING(Address);
|
||||
YES_IF_CHANGED_LINELIST(Address);
|
||||
YES_IF_CHANGED_LINELIST(ExitPolicy);
|
||||
YES_IF_CHANGED_BOOL(ExitRelay);
|
||||
YES_IF_CHANGED_BOOL(ExitPolicyRejectPrivate);
|
||||
|
|
|
@ -1190,6 +1190,7 @@ test_config_resolve_my_address(void *arg)
|
|||
{
|
||||
or_options_t *options;
|
||||
uint32_t resolved_addr;
|
||||
char buf[1024];
|
||||
const char *method_used;
|
||||
char *hostname_out = NULL;
|
||||
int retval;
|
||||
|
@ -1215,8 +1216,8 @@ test_config_resolve_my_address(void *arg)
|
|||
* If options->Address is a valid IPv4 address string, we want
|
||||
* the corresponding address to be parsed and returned.
|
||||
*/
|
||||
|
||||
options->Address = tor_strdup("128.52.128.105");
|
||||
strlcpy(buf, "Address 128.52.128.105\n", sizeof(buf));
|
||||
config_get_lines(buf, &(options->Address), 0);
|
||||
|
||||
retval = resolve_my_address(LOG_NOTICE,options,&resolved_addr,
|
||||
&method_used,&hostname_out);
|
||||
|
@ -1226,7 +1227,7 @@ test_config_resolve_my_address(void *arg)
|
|||
tt_want(hostname_out == NULL);
|
||||
tt_assert(resolved_addr == 0x80348069);
|
||||
|
||||
tor_free(options->Address);
|
||||
config_free_lines(options->Address);
|
||||
|
||||
/*
|
||||
* CASE 2:
|
||||
|
@ -1237,8 +1238,8 @@ test_config_resolve_my_address(void *arg)
|
|||
|
||||
MOCK(tor_lookup_hostname,tor_lookup_hostname_01010101);
|
||||
|
||||
tor_free(options->Address);
|
||||
options->Address = tor_strdup("www.torproject.org");
|
||||
strlcpy(buf, "Address www.torproject.org\n", sizeof(buf));
|
||||
config_get_lines(buf, &(options->Address), 0);
|
||||
|
||||
prev_n_hostname_01010101 = n_hostname_01010101;
|
||||
|
||||
|
@ -1253,7 +1254,7 @@ test_config_resolve_my_address(void *arg)
|
|||
|
||||
UNMOCK(tor_lookup_hostname);
|
||||
|
||||
tor_free(options->Address);
|
||||
config_free_lines(options->Address);
|
||||
tor_free(hostname_out);
|
||||
|
||||
/*
|
||||
|
@ -1264,7 +1265,6 @@ test_config_resolve_my_address(void *arg)
|
|||
*/
|
||||
|
||||
resolved_addr = 0;
|
||||
tor_free(options->Address);
|
||||
options->Address = NULL;
|
||||
|
||||
MOCK(tor_gethostname,tor_gethostname_replacement);
|
||||
|
@ -1295,8 +1295,8 @@ test_config_resolve_my_address(void *arg)
|
|||
*/
|
||||
|
||||
resolved_addr = 0;
|
||||
tor_free(options->Address);
|
||||
options->Address = tor_strdup("127.0.0.1");
|
||||
strlcpy(buf, "Address 127.0.0.1\n", sizeof(buf));
|
||||
config_get_lines(buf, &(options->Address), 0);
|
||||
|
||||
retval = resolve_my_address(LOG_NOTICE,options,&resolved_addr,
|
||||
&method_used,&hostname_out);
|
||||
|
@ -1304,7 +1304,7 @@ test_config_resolve_my_address(void *arg)
|
|||
tt_want(resolved_addr == 0);
|
||||
tt_int_op(retval, OP_EQ, -1);
|
||||
|
||||
tor_free(options->Address);
|
||||
config_free_lines(options->Address);
|
||||
tor_free(hostname_out);
|
||||
|
||||
/*
|
||||
|
@ -1317,8 +1317,8 @@ test_config_resolve_my_address(void *arg)
|
|||
|
||||
prev_n_hostname_failure = n_hostname_failure;
|
||||
|
||||
tor_free(options->Address);
|
||||
options->Address = tor_strdup("www.tor-project.org");
|
||||
strlcpy(buf, "Address www.tor-project.org\n", sizeof(buf));
|
||||
config_get_lines(buf, &(options->Address), 0);
|
||||
|
||||
retval = resolve_my_address(LOG_NOTICE,options,&resolved_addr,
|
||||
&method_used,&hostname_out);
|
||||
|
@ -1328,7 +1328,8 @@ test_config_resolve_my_address(void *arg)
|
|||
|
||||
UNMOCK(tor_lookup_hostname);
|
||||
|
||||
tor_free(options->Address);
|
||||
config_free_lines(options->Address);
|
||||
options->Address = NULL;
|
||||
tor_free(hostname_out);
|
||||
|
||||
/*
|
||||
|
@ -1451,8 +1452,8 @@ test_config_resolve_my_address(void *arg)
|
|||
|
||||
prev_n_hostname_failure = n_hostname_failure;
|
||||
|
||||
tor_free(options->Address);
|
||||
options->Address = tor_strdup("some_hostname");
|
||||
strlcpy(buf, "Address some_hostname\n", sizeof(buf));
|
||||
config_get_lines(buf, &(options->Address), 0);
|
||||
|
||||
retval = resolve_my_address(LOG_NOTICE, options, &resolved_addr,
|
||||
&method_used,&hostname_out);
|
||||
|
@ -1484,7 +1485,7 @@ test_config_resolve_my_address(void *arg)
|
|||
* and address from step 6.
|
||||
*/
|
||||
|
||||
tor_free(options->Address);
|
||||
config_free_lines(options->Address);
|
||||
options->Address = NULL;
|
||||
|
||||
MOCK(tor_gethostname,tor_gethostname_replacement);
|
||||
|
@ -1563,7 +1564,7 @@ test_config_resolve_my_address(void *arg)
|
|||
UNMOCK(tor_gethostname);
|
||||
|
||||
done:
|
||||
tor_free(options->Address);
|
||||
config_free_lines(options->Address);
|
||||
tor_free(options->DirAuthorities);
|
||||
or_options_free(options);
|
||||
tor_free(hostname_out);
|
||||
|
|
Loading…
Add table
Reference in a new issue