dirvote: Handling adding vote and signature if module is disabled
[tor.git] / src / or / bridges.c
blob699e030e6cf82ff8f29b2887275f973d4a186373
1 /* Copyright (c) 2001 Matej Pfajfar.
2 * Copyright (c) 2001-2004, Roger Dingledine.
3 * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
4 * Copyright (c) 2007-2017, The Tor Project, Inc. */
5 /* See LICENSE for licensing information */
7 /**
8 * \file bridges.c
9 * \brief Code to manage bridges and bridge selection.
11 * Bridges are fixed entry nodes, used for censorship circumvention.
12 **/
14 #define TOR_BRIDGES_PRIVATE
16 #include "or.h"
17 #include "bridges.h"
18 #include "circuitbuild.h"
19 #include "config.h"
20 #include "connection.h"
21 #include "directory.h"
22 #include "entrynodes.h"
23 #include "nodelist.h"
24 #include "policies.h"
25 #include "router.h"
26 #include "routerlist.h"
27 #include "routerset.h"
28 #include "transports.h"
30 /** Information about a configured bridge. Currently this just matches the
31 * ones in the torrc file, but one day we may be able to learn about new
32 * bridges on our own, and remember them in the state file. */
33 struct bridge_info_t {
34 /** Address and port of the bridge, as configured by the user.*/
35 tor_addr_port_t addrport_configured;
36 /** Address of the bridge. */
37 tor_addr_t addr;
38 /** TLS port for the bridge. */
39 uint16_t port;
40 /** Boolean: We are re-parsing our bridge list, and we are going to remove
41 * this one if we don't find it in the list of configured bridges. */
42 unsigned marked_for_removal : 1;
43 /** Expected identity digest, or all zero bytes if we don't know what the
44 * digest should be. */
45 char identity[DIGEST_LEN];
47 /** Name of pluggable transport protocol taken from its config line. */
48 char *transport_name;
50 /** When should we next try to fetch a descriptor for this bridge? */
51 download_status_t fetch_status;
53 /** A smartlist of k=v values to be passed to the SOCKS proxy, if
54 transports are used for this bridge. */
55 smartlist_t *socks_args;
58 #define bridge_free(bridge) \
59 FREE_AND_NULL(bridge_info_t, bridge_free_, (bridge))
61 static void bridge_free_(bridge_info_t *bridge);
62 static void rewrite_node_address_for_bridge(const bridge_info_t *bridge,
63 node_t *node);
65 /** A list of configured bridges. Whenever we actually get a descriptor
66 * for one, we add it as an entry guard. Note that the order of bridges
67 * in this list does not necessarily correspond to the order of bridges
68 * in the torrc. */
69 static smartlist_t *bridge_list = NULL;
71 /** Mark every entry of the bridge list to be removed on our next call to
72 * sweep_bridge_list unless it has first been un-marked. */
73 void
74 mark_bridge_list(void)
76 if (!bridge_list)
77 bridge_list = smartlist_new();
78 SMARTLIST_FOREACH(bridge_list, bridge_info_t *, b,
79 b->marked_for_removal = 1);
82 /** Remove every entry of the bridge list that was marked with
83 * mark_bridge_list if it has not subsequently been un-marked. */
84 void
85 sweep_bridge_list(void)
87 if (!bridge_list)
88 bridge_list = smartlist_new();
89 SMARTLIST_FOREACH_BEGIN(bridge_list, bridge_info_t *, b) {
90 if (b->marked_for_removal) {
91 SMARTLIST_DEL_CURRENT(bridge_list, b);
92 bridge_free(b);
94 } SMARTLIST_FOREACH_END(b);
97 /** Initialize the bridge list to empty, creating it if needed. */
98 STATIC void
99 clear_bridge_list(void)
101 if (!bridge_list)
102 bridge_list = smartlist_new();
103 SMARTLIST_FOREACH(bridge_list, bridge_info_t *, b, bridge_free(b));
104 smartlist_clear(bridge_list);
107 /** Free the bridge <b>bridge</b>. */
108 static void
109 bridge_free_(bridge_info_t *bridge)
111 if (!bridge)
112 return;
114 tor_free(bridge->transport_name);
115 if (bridge->socks_args) {
116 SMARTLIST_FOREACH(bridge->socks_args, char*, s, tor_free(s));
117 smartlist_free(bridge->socks_args);
120 tor_free(bridge);
123 /** Return a list of all the configured bridges, as bridge_info_t pointers. */
124 const smartlist_t *
125 bridge_list_get(void)
127 if (!bridge_list)
128 bridge_list = smartlist_new();
129 return bridge_list;
133 * Given a <b>bridge</b>, return a pointer to its RSA identity digest, or
134 * NULL if we don't know one for it.
136 const uint8_t *
137 bridge_get_rsa_id_digest(const bridge_info_t *bridge)
139 tor_assert(bridge);
140 if (tor_digest_is_zero(bridge->identity))
141 return NULL;
142 else
143 return (const uint8_t *) bridge->identity;
147 * Given a <b>bridge</b>, return a pointer to its configured addr:port
148 * combination.
150 const tor_addr_port_t *
151 bridge_get_addr_port(const bridge_info_t *bridge)
153 tor_assert(bridge);
154 return &bridge->addrport_configured;
157 /** If we have a bridge configured whose digest matches <b>digest</b>, or a
158 * bridge with no known digest whose address matches any of the
159 * tor_addr_port_t's in <b>orports</b>, return that bridge. Else return
160 * NULL. */
161 STATIC bridge_info_t *
162 get_configured_bridge_by_orports_digest(const char *digest,
163 const smartlist_t *orports)
165 if (!bridge_list)
166 return NULL;
167 SMARTLIST_FOREACH_BEGIN(bridge_list, bridge_info_t *, bridge)
169 if (tor_digest_is_zero(bridge->identity)) {
170 SMARTLIST_FOREACH_BEGIN(orports, tor_addr_port_t *, ap)
172 if (tor_addr_compare(&bridge->addr, &ap->addr, CMP_EXACT) == 0 &&
173 bridge->port == ap->port)
174 return bridge;
176 SMARTLIST_FOREACH_END(ap);
178 if (digest && tor_memeq(bridge->identity, digest, DIGEST_LEN))
179 return bridge;
181 SMARTLIST_FOREACH_END(bridge);
182 return NULL;
185 /** If we have a bridge configured whose digest matches <b>digest</b>, or a
186 * bridge with no known digest whose address matches <b>addr</b>:<b>port</b>,
187 * return that bridge. Else return NULL. If <b>digest</b> is NULL, check for
188 * address/port matches only. */
189 bridge_info_t *
190 get_configured_bridge_by_addr_port_digest(const tor_addr_t *addr,
191 uint16_t port,
192 const char *digest)
194 if (!bridge_list)
195 return NULL;
196 SMARTLIST_FOREACH_BEGIN(bridge_list, bridge_info_t *, bridge)
198 if ((tor_digest_is_zero(bridge->identity) || digest == NULL) &&
199 !tor_addr_compare(&bridge->addr, addr, CMP_EXACT) &&
200 bridge->port == port)
201 return bridge;
202 if (digest && tor_memeq(bridge->identity, digest, DIGEST_LEN))
203 return bridge;
205 SMARTLIST_FOREACH_END(bridge);
206 return NULL;
210 * As get_configured_bridge_by_addr_port, but require that the
211 * address match <b>addr</b>:<b>port</b>, and that the ID digest match
212 * <b>digest</b>. (The other function will ignore the address if the
213 * digest matches.)
215 bridge_info_t *
216 get_configured_bridge_by_exact_addr_port_digest(const tor_addr_t *addr,
217 uint16_t port,
218 const char *digest)
220 if (!bridge_list)
221 return NULL;
222 SMARTLIST_FOREACH_BEGIN(bridge_list, bridge_info_t *, bridge) {
223 if (!tor_addr_compare(&bridge->addr, addr, CMP_EXACT) &&
224 bridge->port == port) {
226 if (digest && tor_memeq(bridge->identity, digest, DIGEST_LEN))
227 return bridge;
228 else if (!digest || tor_digest_is_zero(bridge->identity))
229 return bridge;
232 } SMARTLIST_FOREACH_END(bridge);
233 return NULL;
236 /** If we have a bridge configured whose digest matches <b>digest</b>, or a
237 * bridge with no known digest whose address matches <b>addr</b>:<b>port</b>,
238 * return 1. Else return 0. If <b>digest</b> is NULL, check for
239 * address/port matches only. */
241 addr_is_a_configured_bridge(const tor_addr_t *addr,
242 uint16_t port,
243 const char *digest)
245 tor_assert(addr);
246 return get_configured_bridge_by_addr_port_digest(addr, port, digest) ? 1 : 0;
249 /** If we have a bridge configured whose digest matches
250 * <b>ei->identity_digest</b>, or a bridge with no known digest whose address
251 * matches <b>ei->addr</b>:<b>ei->port</b>, return 1. Else return 0.
252 * If <b>ei->onion_key</b> is NULL, check for address/port matches only. */
254 extend_info_is_a_configured_bridge(const extend_info_t *ei)
256 const char *digest = ei->onion_key ? ei->identity_digest : NULL;
257 return addr_is_a_configured_bridge(&ei->addr, ei->port, digest);
260 /** Wrapper around get_configured_bridge_by_addr_port_digest() to look
261 * it up via router descriptor <b>ri</b>. */
262 static bridge_info_t *
263 get_configured_bridge_by_routerinfo(const routerinfo_t *ri)
265 bridge_info_t *bi = NULL;
266 smartlist_t *orports = router_get_all_orports(ri);
267 bi = get_configured_bridge_by_orports_digest(ri->cache_info.identity_digest,
268 orports);
269 SMARTLIST_FOREACH(orports, tor_addr_port_t *, p, tor_free(p));
270 smartlist_free(orports);
271 return bi;
274 /** Return 1 if <b>ri</b> is one of our known bridges, else 0. */
276 routerinfo_is_a_configured_bridge(const routerinfo_t *ri)
278 return get_configured_bridge_by_routerinfo(ri) ? 1 : 0;
281 /** Return 1 if <b>node</b> is one of our configured bridges, else 0. */
283 node_is_a_configured_bridge(const node_t *node)
285 int retval = 0;
286 smartlist_t *orports = node_get_all_orports(node);
287 retval = get_configured_bridge_by_orports_digest(node->identity,
288 orports) != NULL;
289 SMARTLIST_FOREACH(orports, tor_addr_port_t *, p, tor_free(p));
290 smartlist_free(orports);
291 return retval;
294 /** We made a connection to a router at <b>addr</b>:<b>port</b>
295 * without knowing its digest. Its digest turned out to be <b>digest</b>.
296 * If it was a bridge, and we still don't know its digest, record it.
298 void
299 learned_router_identity(const tor_addr_t *addr, uint16_t port,
300 const char *digest,
301 const ed25519_public_key_t *ed_id)
303 // XXXX prop220 use ed_id here, once there is some way to specify
304 (void)ed_id;
305 int learned = 0;
306 bridge_info_t *bridge =
307 get_configured_bridge_by_exact_addr_port_digest(addr, port, digest);
308 if (bridge && tor_digest_is_zero(bridge->identity)) {
309 memcpy(bridge->identity, digest, DIGEST_LEN);
310 learned = 1;
312 /* XXXX prop220 remember bridge ed25519 identities -- add a field */
313 #if 0
314 if (bridge && ed_id &&
315 ed25519_public_key_is_zero(&bridge->ed25519_identity) &&
316 !ed25519_public_key_is_zero(ed_id)) {
317 memcpy(&bridge->ed25519_identity, ed_id, sizeof(*ed_id));
318 learned = 1;
320 #endif /* 0 */
321 if (learned) {
322 char *transport_info = NULL;
323 const char *transport_name =
324 find_transport_name_by_bridge_addrport(addr, port);
325 if (transport_name)
326 tor_asprintf(&transport_info, " (with transport '%s')", transport_name);
328 // XXXX prop220 log both fingerprints.
329 log_notice(LD_DIR, "Learned fingerprint %s for bridge %s%s.",
330 hex_str(digest, DIGEST_LEN), fmt_addrport(addr, port),
331 transport_info ? transport_info : "");
332 tor_free(transport_info);
333 entry_guard_learned_bridge_identity(&bridge->addrport_configured,
334 (const uint8_t *)digest);
338 /** Return true if <b>bridge</b> has the same identity digest as
339 * <b>digest</b>. If <b>digest</b> is NULL, it matches
340 * bridges with unspecified identity digests. */
341 static int
342 bridge_has_digest(const bridge_info_t *bridge, const char *digest)
344 if (digest)
345 return tor_memeq(digest, bridge->identity, DIGEST_LEN);
346 else
347 return tor_digest_is_zero(bridge->identity);
350 /** We are about to add a new bridge at <b>addr</b>:<b>port</b>, with optional
351 * <b>digest</b> and <b>transport_name</b>. Mark for removal any previously
352 * existing bridge with the same address and port, and warn the user as
353 * appropriate.
355 STATIC void
356 bridge_resolve_conflicts(const tor_addr_t *addr, uint16_t port,
357 const char *digest, const char *transport_name)
359 /* Iterate the already-registered bridge list:
361 If you find a bridge with the same address and port, mark it for
362 removal. It doesn't make sense to have two active bridges with
363 the same IP:PORT. If the bridge in question has a different
364 digest or transport than <b>digest</b>/<b>transport_name</b>,
365 it's probably a misconfiguration and we should warn the user.
367 SMARTLIST_FOREACH_BEGIN(bridge_list, bridge_info_t *, bridge) {
368 if (bridge->marked_for_removal)
369 continue;
371 if (tor_addr_eq(&bridge->addr, addr) && (bridge->port == port)) {
373 bridge->marked_for_removal = 1;
375 if (!bridge_has_digest(bridge, digest) ||
376 strcmp_opt(bridge->transport_name, transport_name)) {
377 /* warn the user */
378 char *bridge_description_new, *bridge_description_old;
379 tor_asprintf(&bridge_description_new, "%s:%s:%s",
380 fmt_addrport(addr, port),
381 digest ? hex_str(digest, DIGEST_LEN) : "",
382 transport_name ? transport_name : "");
383 tor_asprintf(&bridge_description_old, "%s:%s:%s",
384 fmt_addrport(&bridge->addr, bridge->port),
385 tor_digest_is_zero(bridge->identity) ?
386 "" : hex_str(bridge->identity,DIGEST_LEN),
387 bridge->transport_name ? bridge->transport_name : "");
389 log_warn(LD_GENERAL,"Tried to add bridge '%s', but we found a conflict"
390 " with the already registered bridge '%s'. We will discard"
391 " the old bridge and keep '%s'. If this is not what you"
392 " wanted, please change your configuration file accordingly.",
393 bridge_description_new, bridge_description_old,
394 bridge_description_new);
396 tor_free(bridge_description_new);
397 tor_free(bridge_description_old);
400 } SMARTLIST_FOREACH_END(bridge);
403 /** Return True if we have a bridge that uses a transport with name
404 * <b>transport_name</b>. */
405 MOCK_IMPL(int,
406 transport_is_needed, (const char *transport_name))
408 if (!bridge_list)
409 return 0;
411 SMARTLIST_FOREACH_BEGIN(bridge_list, const bridge_info_t *, bridge) {
412 if (bridge->transport_name &&
413 !strcmp(bridge->transport_name, transport_name))
414 return 1;
415 } SMARTLIST_FOREACH_END(bridge);
417 return 0;
420 /** Register the bridge information in <b>bridge_line</b> to the
421 * bridge subsystem. Steals reference of <b>bridge_line</b>. */
422 void
423 bridge_add_from_config(bridge_line_t *bridge_line)
425 bridge_info_t *b;
427 // XXXX prop220 add a way to specify ed25519 ID to bridge_line_t.
429 { /* Log the bridge we are about to register: */
430 log_debug(LD_GENERAL, "Registering bridge at %s (transport: %s) (%s)",
431 fmt_addrport(&bridge_line->addr, bridge_line->port),
432 bridge_line->transport_name ?
433 bridge_line->transport_name : "no transport",
434 tor_digest_is_zero(bridge_line->digest) ?
435 "no key listed" : hex_str(bridge_line->digest, DIGEST_LEN));
437 if (bridge_line->socks_args) { /* print socks arguments */
438 int i = 0;
440 tor_assert(smartlist_len(bridge_line->socks_args) > 0);
442 log_debug(LD_GENERAL, "Bridge uses %d SOCKS arguments:",
443 smartlist_len(bridge_line->socks_args));
444 SMARTLIST_FOREACH(bridge_line->socks_args, const char *, arg,
445 log_debug(LD_CONFIG, "%d: %s", ++i, arg));
449 bridge_resolve_conflicts(&bridge_line->addr,
450 bridge_line->port,
451 bridge_line->digest,
452 bridge_line->transport_name);
454 b = tor_malloc_zero(sizeof(bridge_info_t));
455 tor_addr_copy(&b->addrport_configured.addr, &bridge_line->addr);
456 b->addrport_configured.port = bridge_line->port;
457 tor_addr_copy(&b->addr, &bridge_line->addr);
458 b->port = bridge_line->port;
459 memcpy(b->identity, bridge_line->digest, DIGEST_LEN);
460 if (bridge_line->transport_name)
461 b->transport_name = bridge_line->transport_name;
462 b->fetch_status.schedule = DL_SCHED_BRIDGE;
463 b->fetch_status.increment_on = DL_SCHED_INCREMENT_ATTEMPT;
464 /* We can't reset the bridge's download status here, because UseBridges
465 * might be 0 now, and it might be changed to 1 much later. */
466 b->socks_args = bridge_line->socks_args;
467 if (!bridge_list)
468 bridge_list = smartlist_new();
470 tor_free(bridge_line); /* Deallocate bridge_line now. */
472 smartlist_add(bridge_list, b);
475 /** If <b>digest</b> is one of our known bridges, return it. */
476 STATIC bridge_info_t *
477 find_bridge_by_digest(const char *digest)
479 if (! bridge_list)
480 return NULL;
481 SMARTLIST_FOREACH(bridge_list, bridge_info_t *, bridge,
483 if (tor_memeq(bridge->identity, digest, DIGEST_LEN))
484 return bridge;
486 return NULL;
489 /** Given the <b>addr</b> and <b>port</b> of a bridge, if that bridge
490 * supports a pluggable transport, return its name. Otherwise, return
491 * NULL. */
492 const char *
493 find_transport_name_by_bridge_addrport(const tor_addr_t *addr, uint16_t port)
495 if (!bridge_list)
496 return NULL;
498 SMARTLIST_FOREACH_BEGIN(bridge_list, const bridge_info_t *, bridge) {
499 if (tor_addr_eq(&bridge->addr, addr) &&
500 (bridge->port == port))
501 return bridge->transport_name;
502 } SMARTLIST_FOREACH_END(bridge);
504 return NULL;
507 /** If <b>addr</b> and <b>port</b> match the address and port of a
508 * bridge of ours that uses pluggable transports, place its transport
509 * in <b>transport</b>.
511 * Return 0 on success (found a transport, or found a bridge with no
512 * transport, or found no bridge); return -1 if we should be using a
513 * transport, but the transport could not be found.
516 get_transport_by_bridge_addrport(const tor_addr_t *addr, uint16_t port,
517 const transport_t **transport)
519 *transport = NULL;
520 if (!bridge_list)
521 return 0;
523 SMARTLIST_FOREACH_BEGIN(bridge_list, const bridge_info_t *, bridge) {
524 if (tor_addr_eq(&bridge->addr, addr) &&
525 (bridge->port == port)) { /* bridge matched */
526 if (bridge->transport_name) { /* it also uses pluggable transports */
527 *transport = transport_get_by_name(bridge->transport_name);
528 if (*transport == NULL) { /* it uses pluggable transports, but
529 the transport could not be found! */
530 return -1;
532 return 0;
533 } else { /* bridge matched, but it doesn't use transports. */
534 break;
537 } SMARTLIST_FOREACH_END(bridge);
539 *transport = NULL;
540 return 0;
543 /** Return a smartlist containing all the SOCKS arguments that we
544 * should pass to the SOCKS proxy. */
545 const smartlist_t *
546 get_socks_args_by_bridge_addrport(const tor_addr_t *addr, uint16_t port)
548 bridge_info_t *bridge = get_configured_bridge_by_addr_port_digest(addr,
549 port,
550 NULL);
551 return bridge ? bridge->socks_args : NULL;
554 /** We need to ask <b>bridge</b> for its server descriptor. */
555 static void
556 launch_direct_bridge_descriptor_fetch(bridge_info_t *bridge)
558 const or_options_t *options = get_options();
559 circuit_guard_state_t *guard_state = NULL;
561 if (connection_get_by_type_addr_port_purpose(
562 CONN_TYPE_DIR, &bridge->addr, bridge->port,
563 DIR_PURPOSE_FETCH_SERVERDESC))
564 return; /* it's already on the way */
566 if (routerset_contains_bridge(options->ExcludeNodes, bridge)) {
567 download_status_mark_impossible(&bridge->fetch_status);
568 log_warn(LD_APP, "Not using bridge at %s: it is in ExcludeNodes.",
569 safe_str_client(fmt_and_decorate_addr(&bridge->addr)));
570 return;
573 /* Until we get a descriptor for the bridge, we only know one address for
574 * it. */
575 if (!fascist_firewall_allows_address_addr(&bridge->addr, bridge->port,
576 FIREWALL_OR_CONNECTION, 0, 0)) {
577 log_notice(LD_CONFIG, "Tried to fetch a descriptor directly from a "
578 "bridge, but that bridge is not reachable through our "
579 "firewall.");
580 return;
583 /* If we already have a node_t for this bridge, rewrite its address now. */
584 node_t *node = node_get_mutable_by_id(bridge->identity);
585 if (node) {
586 rewrite_node_address_for_bridge(bridge, node);
589 tor_addr_port_t bridge_addrport;
590 memcpy(&bridge_addrport.addr, &bridge->addr, sizeof(tor_addr_t));
591 bridge_addrport.port = bridge->port;
593 guard_state = get_guard_state_for_bridge_desc_fetch(bridge->identity);
595 directory_request_t *req =
596 directory_request_new(DIR_PURPOSE_FETCH_SERVERDESC);
597 directory_request_set_or_addr_port(req, &bridge_addrport);
598 directory_request_set_directory_id_digest(req, bridge->identity);
599 directory_request_set_router_purpose(req, ROUTER_PURPOSE_BRIDGE);
600 directory_request_set_resource(req, "authority.z");
601 if (guard_state) {
602 directory_request_set_guard_state(req, guard_state);
604 directory_initiate_request(req);
605 directory_request_free(req);
608 /** Fetching the bridge descriptor from the bridge authority returned a
609 * "not found". Fall back to trying a direct fetch. */
610 void
611 retry_bridge_descriptor_fetch_directly(const char *digest)
613 bridge_info_t *bridge = find_bridge_by_digest(digest);
614 if (!bridge)
615 return; /* not found? oh well. */
617 launch_direct_bridge_descriptor_fetch(bridge);
620 /** For each bridge in our list for which we don't currently have a
621 * descriptor, fetch a new copy of its descriptor -- either directly
622 * from the bridge or via a bridge authority. */
623 void
624 fetch_bridge_descriptors(const or_options_t *options, time_t now)
626 int num_bridge_auths = get_n_authorities(BRIDGE_DIRINFO);
627 int ask_bridge_directly;
628 int can_use_bridge_authority;
630 if (!bridge_list)
631 return;
633 /* If we still have unconfigured managed proxies, don't go and
634 connect to a bridge. */
635 if (pt_proxies_configuration_pending())
636 return;
638 SMARTLIST_FOREACH_BEGIN(bridge_list, bridge_info_t *, bridge)
640 /* This resets the download status on first use */
641 if (!download_status_is_ready(&bridge->fetch_status, now))
642 continue; /* don't bother, no need to retry yet */
643 if (routerset_contains_bridge(options->ExcludeNodes, bridge)) {
644 download_status_mark_impossible(&bridge->fetch_status);
645 log_warn(LD_APP, "Not using bridge at %s: it is in ExcludeNodes.",
646 safe_str_client(fmt_and_decorate_addr(&bridge->addr)));
647 continue;
650 /* schedule the next attempt
651 * we can't increment after a failure, because sometimes we use the
652 * bridge authority, and sometimes we use the bridge direct */
653 download_status_increment_attempt(
654 &bridge->fetch_status,
655 safe_str_client(fmt_and_decorate_addr(&bridge->addr)),
656 now);
658 can_use_bridge_authority = !tor_digest_is_zero(bridge->identity) &&
659 num_bridge_auths;
660 ask_bridge_directly = !can_use_bridge_authority ||
661 !options->UpdateBridgesFromAuthority;
662 log_debug(LD_DIR, "ask_bridge_directly=%d (%d, %d, %d)",
663 ask_bridge_directly, tor_digest_is_zero(bridge->identity),
664 !options->UpdateBridgesFromAuthority, !num_bridge_auths);
666 if (ask_bridge_directly &&
667 !fascist_firewall_allows_address_addr(&bridge->addr, bridge->port,
668 FIREWALL_OR_CONNECTION, 0,
669 0)) {
670 log_notice(LD_DIR, "Bridge at '%s' isn't reachable by our "
671 "firewall policy. %s.",
672 fmt_addrport(&bridge->addr, bridge->port),
673 can_use_bridge_authority ?
674 "Asking bridge authority instead" : "Skipping");
675 if (can_use_bridge_authority)
676 ask_bridge_directly = 0;
677 else
678 continue;
681 if (ask_bridge_directly) {
682 /* we need to ask the bridge itself for its descriptor. */
683 launch_direct_bridge_descriptor_fetch(bridge);
684 } else {
685 /* We have a digest and we want to ask an authority. We could
686 * combine all the requests into one, but that may give more
687 * hints to the bridge authority than we want to give. */
688 char resource[10 + HEX_DIGEST_LEN];
689 memcpy(resource, "fp/", 3);
690 base16_encode(resource+3, HEX_DIGEST_LEN+1,
691 bridge->identity, DIGEST_LEN);
692 memcpy(resource+3+HEX_DIGEST_LEN, ".z", 3);
693 log_info(LD_DIR, "Fetching bridge info '%s' from bridge authority.",
694 resource);
695 directory_get_from_dirserver(DIR_PURPOSE_FETCH_SERVERDESC,
696 ROUTER_PURPOSE_BRIDGE, resource, 0, DL_WANT_AUTHORITY);
699 SMARTLIST_FOREACH_END(bridge);
702 /** If our <b>bridge</b> is configured to be a different address than
703 * the bridge gives in <b>node</b>, rewrite the routerinfo
704 * we received to use the address we meant to use. Now we handle
705 * multihomed bridges better.
707 static void
708 rewrite_node_address_for_bridge(const bridge_info_t *bridge, node_t *node)
710 /* XXXX move this function. */
711 /* XXXX overridden addresses should really live in the node_t, so that the
712 * routerinfo_t and the microdesc_t can be immutable. But we can only
713 * do that safely if we know that no function that connects to an OR
714 * does so through an address from any source other than node_get_addr().
716 tor_addr_t addr;
717 const or_options_t *options = get_options();
719 if (node->ri) {
720 routerinfo_t *ri = node->ri;
721 tor_addr_from_ipv4h(&addr, ri->addr);
722 if ((!tor_addr_compare(&bridge->addr, &addr, CMP_EXACT) &&
723 bridge->port == ri->or_port) ||
724 (!tor_addr_compare(&bridge->addr, &ri->ipv6_addr, CMP_EXACT) &&
725 bridge->port == ri->ipv6_orport)) {
726 /* they match, so no need to do anything */
727 } else {
728 if (tor_addr_family(&bridge->addr) == AF_INET) {
729 ri->addr = tor_addr_to_ipv4h(&bridge->addr);
730 ri->or_port = bridge->port;
731 log_info(LD_DIR,
732 "Adjusted bridge routerinfo for '%s' to match configured "
733 "address %s:%d.",
734 ri->nickname, fmt_addr32(ri->addr), ri->or_port);
735 } else if (tor_addr_family(&bridge->addr) == AF_INET6) {
736 tor_addr_copy(&ri->ipv6_addr, &bridge->addr);
737 ri->ipv6_orport = bridge->port;
738 log_info(LD_DIR,
739 "Adjusted bridge routerinfo for '%s' to match configured "
740 "address %s.",
741 ri->nickname, fmt_addrport(&ri->ipv6_addr, ri->ipv6_orport));
742 } else {
743 log_err(LD_BUG, "Address family not supported: %d.",
744 tor_addr_family(&bridge->addr));
745 return;
749 if (options->ClientPreferIPv6ORPort == -1) {
750 /* Mark which address to use based on which bridge_t we got. */
751 node->ipv6_preferred = (tor_addr_family(&bridge->addr) == AF_INET6 &&
752 !tor_addr_is_null(&node->ri->ipv6_addr));
753 } else {
754 /* Mark which address to use based on user preference */
755 node->ipv6_preferred = (fascist_firewall_prefer_ipv6_orport(options) &&
756 !tor_addr_is_null(&node->ri->ipv6_addr));
759 /* XXXipv6 we lack support for falling back to another address for
760 the same relay, warn the user */
761 if (!tor_addr_is_null(&ri->ipv6_addr)) {
762 tor_addr_port_t ap;
763 node_get_pref_orport(node, &ap);
764 log_notice(LD_CONFIG,
765 "Bridge '%s' has both an IPv4 and an IPv6 address. "
766 "Will prefer using its %s address (%s) based on %s.",
767 ri->nickname,
768 node->ipv6_preferred ? "IPv6" : "IPv4",
769 fmt_addrport(&ap.addr, ap.port),
770 options->ClientPreferIPv6ORPort == -1 ?
771 "the configured Bridge address" :
772 "ClientPreferIPv6ORPort");
775 if (node->rs) {
776 routerstatus_t *rs = node->rs;
777 tor_addr_from_ipv4h(&addr, rs->addr);
779 if ((!tor_addr_compare(&bridge->addr, &addr, CMP_EXACT) &&
780 bridge->port == rs->or_port) ||
781 (!tor_addr_compare(&bridge->addr, &rs->ipv6_addr, CMP_EXACT) &&
782 bridge->port == rs->ipv6_orport)) {
783 /* they match, so no need to do anything */
784 } else {
785 if (tor_addr_family(&bridge->addr) == AF_INET) {
786 rs->addr = tor_addr_to_ipv4h(&bridge->addr);
787 rs->or_port = bridge->port;
788 log_info(LD_DIR,
789 "Adjusted bridge routerstatus for '%s' to match "
790 "configured address %s.",
791 rs->nickname, fmt_addrport(&bridge->addr, rs->or_port));
792 /* set IPv6 preferences even if there is no ri */
793 } else if (tor_addr_family(&bridge->addr) == AF_INET6) {
794 tor_addr_copy(&rs->ipv6_addr, &bridge->addr);
795 rs->ipv6_orport = bridge->port;
796 log_info(LD_DIR,
797 "Adjusted bridge routerstatus for '%s' to match configured"
798 " address %s.",
799 rs->nickname, fmt_addrport(&rs->ipv6_addr, rs->ipv6_orport));
800 } else {
801 log_err(LD_BUG, "Address family not supported: %d.",
802 tor_addr_family(&bridge->addr));
803 return;
807 if (options->ClientPreferIPv6ORPort == -1) {
808 /* Mark which address to use based on which bridge_t we got. */
809 node->ipv6_preferred = (tor_addr_family(&bridge->addr) == AF_INET6 &&
810 !tor_addr_is_null(&node->rs->ipv6_addr));
811 } else {
812 /* Mark which address to use based on user preference */
813 node->ipv6_preferred = (fascist_firewall_prefer_ipv6_orport(options) &&
814 !tor_addr_is_null(&node->rs->ipv6_addr));
817 /* XXXipv6 we lack support for falling back to another address for
818 the same relay, warn the user */
819 if (!tor_addr_is_null(&rs->ipv6_addr)) {
820 tor_addr_port_t ap;
821 node_get_pref_orport(node, &ap);
822 log_notice(LD_CONFIG,
823 "Bridge '%s' has both an IPv4 and an IPv6 address. "
824 "Will prefer using its %s address (%s) based on %s.",
825 rs->nickname,
826 node->ipv6_preferred ? "IPv6" : "IPv4",
827 fmt_addrport(&ap.addr, ap.port),
828 options->ClientPreferIPv6ORPort == -1 ?
829 "the configured Bridge address" :
830 "ClientPreferIPv6ORPort");
835 /** We just learned a descriptor for a bridge. See if that
836 * digest is in our entry guard list, and add it if not. */
837 void
838 learned_bridge_descriptor(routerinfo_t *ri, int from_cache)
840 tor_assert(ri);
841 tor_assert(ri->purpose == ROUTER_PURPOSE_BRIDGE);
842 if (get_options()->UseBridges) {
843 /* Retry directory downloads whenever we get a bridge descriptor:
844 * - when bootstrapping, and
845 * - when we aren't sure if any of our bridges are reachable.
846 * Keep on retrying until we have at least one reachable bridge. */
847 int first = num_bridges_usable(0) < 1;
848 bridge_info_t *bridge = get_configured_bridge_by_routerinfo(ri);
849 time_t now = time(NULL);
850 router_set_status(ri->cache_info.identity_digest, 1);
852 if (bridge) { /* if we actually want to use this one */
853 node_t *node;
854 /* it's here; schedule its re-fetch for a long time from now. */
855 if (!from_cache) {
856 /* This schedules the re-fetch at a constant interval, which produces
857 * a pattern of bridge traffic. But it's better than trying all
858 * configured briges several times in the first few minutes. */
859 download_status_reset(&bridge->fetch_status);
862 node = node_get_mutable_by_id(ri->cache_info.identity_digest);
863 tor_assert(node);
864 rewrite_node_address_for_bridge(bridge, node);
865 if (tor_digest_is_zero(bridge->identity)) {
866 memcpy(bridge->identity,ri->cache_info.identity_digest, DIGEST_LEN);
867 log_notice(LD_DIR, "Learned identity %s for bridge at %s:%d",
868 hex_str(bridge->identity, DIGEST_LEN),
869 fmt_and_decorate_addr(&bridge->addr),
870 (int) bridge->port);
872 entry_guard_learned_bridge_identity(&bridge->addrport_configured,
873 (const uint8_t*)ri->cache_info.identity_digest);
875 log_notice(LD_DIR, "new bridge descriptor '%s' (%s): %s", ri->nickname,
876 from_cache ? "cached" : "fresh", router_describe(ri));
877 /* If we didn't have a reachable bridge before this one, try directory
878 * documents again. */
879 if (first) {
880 routerlist_retry_directory_downloads(now);
886 /** Return a smartlist containing all bridge identity digests */
887 MOCK_IMPL(smartlist_t *,
888 list_bridge_identities, (void))
890 smartlist_t *result = NULL;
891 char *digest_tmp;
893 if (get_options()->UseBridges && bridge_list) {
894 result = smartlist_new();
896 SMARTLIST_FOREACH_BEGIN(bridge_list, bridge_info_t *, b) {
897 digest_tmp = tor_malloc(DIGEST_LEN);
898 memcpy(digest_tmp, b->identity, DIGEST_LEN);
899 smartlist_add(result, digest_tmp);
900 } SMARTLIST_FOREACH_END(b);
903 return result;
906 /** Get the download status for a bridge descriptor given its identity */
907 MOCK_IMPL(download_status_t *,
908 get_bridge_dl_status_by_id, (const char *digest))
910 download_status_t *dl = NULL;
912 if (digest && get_options()->UseBridges && bridge_list) {
913 SMARTLIST_FOREACH_BEGIN(bridge_list, bridge_info_t *, b) {
914 if (tor_memeq(digest, b->identity, DIGEST_LEN)) {
915 dl = &(b->fetch_status);
916 break;
918 } SMARTLIST_FOREACH_END(b);
921 return dl;
924 /** Release all storage held in bridges.c */
925 void
926 bridges_free_all(void)
928 clear_bridge_list();
929 smartlist_free(bridge_list);
930 bridge_list = NULL;