Browse Source

Move always-use-proxy auto-override to master daemon.

This means it will effect connect commands too (though it's too
late to stop DNS lookups caused by commandline options).

We also warn that this is one case where we allow forcing through Tor
without a proxy set: it just means all connections will fail.

Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
ppa-0.6.1
Rusty Russell 7 years ago
parent
commit
89c76a5a78
  1. 26
      common/wireaddr.c
  2. 3
      common/wireaddr.h
  3. 9
      gossipd/gossip.c
  4. 10
      gossipd/tor.c
  5. 2
      gossipd/tor.h
  6. 3
      lightningd/connect_control.c
  7. 2
      lightningd/gossip_control.c
  8. 1
      lightningd/lightningd.c
  9. 1
      lightningd/lightningd.h
  10. 9
      lightningd/options.c

26
common/wireaddr.c

@ -490,3 +490,29 @@ struct addrinfo *wireaddr_to_addrinfo(const tal_t *ctx,
} }
abort(); abort();
} }
bool all_tor_addresses(const struct wireaddr_internal *wireaddr)
{
for (int i = 0; i < tal_count(wireaddr); i++) {
switch (wireaddr[i].itype) {
case ADDR_INTERNAL_SOCKNAME:
return false;
case ADDR_INTERNAL_ALLPROTO:
return false;
case ADDR_INTERNAL_AUTOTOR:
continue;
case ADDR_INTERNAL_WIREADDR:
switch (wireaddr[i].u.wireaddr.type) {
case ADDR_TYPE_IPV4:
case ADDR_TYPE_IPV6:
return false;
case ADDR_TYPE_TOR_V2:
case ADDR_TYPE_TOR_V3:
case ADDR_TYPE_PADDING:
continue;
}
}
abort();
}
return true;
}

3
common/wireaddr.h

@ -136,4 +136,7 @@ struct addrinfo *wireaddr_to_addrinfo(const tal_t *ctx,
const struct wireaddr *wireaddr); const struct wireaddr *wireaddr);
struct addrinfo *wireaddr_internal_to_addrinfo(const tal_t *ctx, struct addrinfo *wireaddr_internal_to_addrinfo(const tal_t *ctx,
const struct wireaddr_internal *wireaddr); const struct wireaddr_internal *wireaddr);
bool all_tor_addresses(const struct wireaddr_internal *wireaddr);
#endif /* LIGHTNING_COMMON_WIREADDR_H */ #endif /* LIGHTNING_COMMON_WIREADDR_H */

9
gossipd/gossip.c

@ -1810,15 +1810,6 @@ static struct io_plan *gossip_activate(struct daemon_conn *master,
else else
binding = NULL; binding = NULL;
/* If we only advertize Tor addresses, force everything through proxy
* to avoid other leakage */
if (!daemon->use_proxy_always
&& tal_count(daemon->announcable) != 0
&& all_tor_addresses(daemon->announcable)) {
status_trace("Only announcing Tor addresses: forcing proxy use");
daemon->use_proxy_always = true;
}
/* OK, we're ready! */ /* OK, we're ready! */
daemon_conn_send(&daemon->master, daemon_conn_send(&daemon->master,
take(towire_gossipctl_activate_reply(NULL, take(towire_gossipctl_activate_reply(NULL,

10
gossipd/tor.c

@ -163,13 +163,3 @@ struct io_plan *io_tor_connect(struct io_conn *conn,
return io_connect(conn, tor_proxyaddr, return io_connect(conn, tor_proxyaddr,
&io_tor_connect_do_req, reach_tor); &io_tor_connect_do_req, reach_tor);
} }
bool all_tor_addresses(const struct wireaddr *wireaddr)
{
for (int i = 0; i < tal_count(wireaddr); i++) {
if (wireaddr[i].type != ADDR_TYPE_TOR_V2
&& wireaddr[i].type != ADDR_TYPE_TOR_V3)
return false;
}
return true;
}

2
gossipd/tor.h

@ -8,8 +8,6 @@ struct wireaddr;
struct io_conn; struct io_conn;
struct reaching; struct reaching;
bool all_tor_addresses(const struct wireaddr *wireaddr);
struct io_plan *io_tor_connect(struct io_conn *conn, struct io_plan *io_tor_connect(struct io_conn *conn,
const struct addrinfo *tor_proxyaddr, const struct addrinfo *tor_proxyaddr,
const struct wireaddr *addr, const struct wireaddr *addr,

3
lightningd/connect_control.c

@ -152,7 +152,8 @@ static void json_connect(struct command *cmd,
port = DEFAULT_PORT; port = DEFAULT_PORT;
} }
if (!parse_wireaddr_internal(name, &addr, port, false, if (!parse_wireaddr_internal(name, &addr, port, false,
!cmd->ld->use_proxy_always, !cmd->ld->use_proxy_always
&& !cmd->ld->pure_tor_setup,
&err_msg)) { &err_msg)) {
command_fail(cmd, "Host %s:%u not valid: %s", command_fail(cmd, "Host %s:%u not valid: %s",
name, port, err_msg ? err_msg : "port is 0"); name, port, err_msg ? err_msg : "port is 0");

2
lightningd/gossip_control.c

@ -225,7 +225,7 @@ void gossip_init(struct lightningd *ld)
get_offered_local_features(tmpctx), wireaddrs, get_offered_local_features(tmpctx), wireaddrs,
listen_announce, ld->rgb, listen_announce, ld->rgb,
ld->alias, ld->config.channel_update_interval, ld->reconnect, ld->alias, ld->config.channel_update_interval, ld->reconnect,
ld->proxyaddr, ld->use_proxy_always, ld->proxyaddr, ld->use_proxy_always || ld->pure_tor_setup,
allow_localhost, allow_localhost,
ld->tor_service_password ? ld->tor_service_password : ""); ld->tor_service_password ? ld->tor_service_password : "");
subd_send_msg(ld->gossip, msg); subd_send_msg(ld->gossip, msg);

1
lightningd/lightningd.c

@ -85,6 +85,7 @@ static struct lightningd *new_lightningd(const tal_t *ctx)
ld->ini_autocleaninvoice_expiredby = 86400; ld->ini_autocleaninvoice_expiredby = 86400;
ld->proxyaddr = NULL; ld->proxyaddr = NULL;
ld->use_proxy_always = false; ld->use_proxy_always = false;
ld->pure_tor_setup = false;
ld->tor_service_password = NULL; ld->tor_service_password = NULL;
return ld; return ld;
} }

1
lightningd/lightningd.h

@ -196,6 +196,7 @@ struct lightningd {
struct wireaddr *proxyaddr; struct wireaddr *proxyaddr;
bool use_proxy_always; bool use_proxy_always;
char *tor_service_password; char *tor_service_password;
bool pure_tor_setup;
}; };
const struct chainparams *get_chainparams(const struct lightningd *ld); const struct chainparams *get_chainparams(const struct lightningd *ld);

9
lightningd/options.c

@ -839,6 +839,15 @@ void handle_opts(struct lightningd *ld, int argc, char *argv[])
if (argc != 1) if (argc != 1)
errx(1, "no arguments accepted"); errx(1, "no arguments accepted");
/* We keep a separate variable rather than overriding use_proxy_always,
* so listconfigs shows the correct thing. */
if (tal_count(ld->proposed_wireaddr) != 0
&& all_tor_addresses(ld->proposed_wireaddr)) {
ld->pure_tor_setup = true;
if (!ld->proxyaddr)
log_info(ld->log, "Pure Tor setup with no --proxy:"
" you won't be able to make connections out");
}
check_config(ld); check_config(ld);
} }

Loading…
Cancel
Save