]> git.ipfire.org Git - thirdparty/tor.git/commitdiff
prop224: Only upload descriptor if we have good hash ring and SRV.
authorGeorge Kadianakis <desnacked@riseup.net>
Sun, 13 Aug 2017 17:16:21 +0000 (20:16 +0300)
committerGeorge Kadianakis <desnacked@riseup.net>
Sat, 19 Aug 2017 13:28:47 +0000 (16:28 +0300)
Make sure we have a live consensus (for SRV) and enough descriptors (for
hash ring).

Also fix unittests that broke.

src/or/hs_service.c
src/or/nodelist.c
src/or/nodelist.h
src/test/test_hs_service.c

index 3f6de0ba2d30dd4479e9b4dff114a41b701b7293..cf5f319f8031337b122779cae78b254d6a999982 100644 (file)
@@ -2288,6 +2288,17 @@ should_service_upload_descriptor(const hs_service_t *service,
     goto cannot;
   }
 
+  /* Don't upload desc if we don't have a live consensus */
+  if (!networkstatus_get_live_consensus(now)) {
+    goto cannot;
+  }
+
+  /* Do we know enough router descriptors to have adequate vision of the HSDir
+     hash ring? */
+  if (!router_have_minimum_dir_info()) {
+    goto cannot;
+  }
+
   /* Can upload! */
   return 1;
  cannot:
index 0fcaea626dd0064187ff5415773a8fd82b321614..a9b77262ce19506093b46945ddd6b1ea83c35c9d 100644 (file)
@@ -1741,8 +1741,8 @@ static char dir_info_status[512] = "";
  * no exits in the consensus."
  * To obtain the final weighted bandwidth, we multiply the
  * weighted bandwidth fraction for each position (guard, middle, exit). */
-int
-router_have_minimum_dir_info(void)
+MOCK_IMPL(int,
+router_have_minimum_dir_info,(void))
 {
   static int logged_delay=0;
   const char *delay_fetches_msg = NULL;
index 405b79d820cd032f8bd320280faef528c43db994..06a08a288c0619b5874749c4409a94632c2327a6 100644 (file)
@@ -105,7 +105,7 @@ int addrs_in_same_network_family(const tor_addr_t *a1,
  * no exits in the consensus, we wait for enough info to create internal
  * paths, and should avoid creating exit paths, as they will simply fail.
  * We make sure we create all available circuit types at the same time. */
-int router_have_minimum_dir_info(void);
+MOCK_DECL(int, router_have_minimum_dir_info,(void));
 
 /** Set to CONSENSUS_PATH_EXIT if there is at least one exit node
  * in the consensus. We update this flag in compute_frac_paths_available if
index c0dd9fe251a9f62193b9e2a62e84cd8af9626a72..7263e045794ecc7f4c37df504bef89680e868e1d 100644 (file)
@@ -1177,6 +1177,12 @@ test_build_update_descriptors(void *arg)
   UNMOCK(hs_overlap_mode_is_active);
 }
 
+static int
+mock_router_have_minimum_dir_info(void)
+{
+  return 1;
+}
+
 static void
 test_upload_descriptors(void *arg)
 {
@@ -1191,7 +1197,6 @@ test_upload_descriptors(void *arg)
   MOCK(hs_overlap_mode_is_active, mock_hs_overlap_mode_is_active_true);
   MOCK(get_or_state,
        get_or_state_replacement);
-
   dummy_state = tor_malloc_zero(sizeof(or_state_t));
 
   /* Create a service with no descriptor. It's added to the global map. */
@@ -1229,9 +1234,13 @@ test_upload_descriptors(void *arg)
   ip->circuit_established = 1;
   service_intro_point_add(service->desc_current->intro_points.map, ip);
 
+  MOCK(networkstatus_get_live_consensus,
+       mock_networkstatus_get_live_consensus);
+  MOCK(router_have_minimum_dir_info,
+       mock_router_have_minimum_dir_info);
+
   setup_full_capture_of_logs(LOG_WARN);
   run_upload_descriptor_event(now);
-  expect_log_msg_containing("No valid consensus so we can't get the");
   teardown_capture_of_logs();
   tt_u64_op(service->desc_current->next_upload_time, OP_GE,
             now + HS_SERVICE_NEXT_UPLOAD_TIME_MIN);