소스 검색

Store service descriptors in the service descriptor cache

Service descriptors are now generated regardless of the the
PublishHidServDescriptors option. The generated descriptors are stored
in the service descriptor cache.

The PublishHidServDescriptors = 1 option now prevents descriptor
publication to the HSDirs rather than descriptor generation.
Donncha O'Cearbhaill 10 년 전
부모
커밋
e0b82e5968
3개의 변경된 파일27개의 추가작업 그리고 11개의 파일을 삭제
  1. 7 0
      src/or/rendcommon.c
  2. 16 11
      src/or/rendservice.c
  3. 4 0
      src/test/test.c

+ 7 - 0
src/or/rendcommon.c

@@ -11,6 +11,7 @@
 #include "or.h"
 #include "circuitbuild.h"
 #include "config.h"
+#include "control.h"
 #include "rendclient.h"
 #include "rendcommon.h"
 #include "rendmid.h"
@@ -461,6 +462,7 @@ rend_encode_v2_descriptors(smartlist_t *descs_out,
                            smartlist_t *client_cookies)
 {
   char service_id[DIGEST_LEN];
+  char service_id_base32[REND_SERVICE_ID_LEN_BASE32+1];
   uint32_t time_period;
   char *ipos_base64 = NULL, *ipos = NULL, *ipos_encrypted = NULL,
        *descriptor_cookie = NULL;
@@ -655,6 +657,11 @@ rend_encode_v2_descriptors(smartlist_t *descs_out,
       goto err;
     }
     smartlist_add(descs_out, enc);
+    /* Add the uploaded descriptor to the local service's descriptor cache */
+    rend_cache_store_v2_desc_as_service(enc->desc_str);
+    base32_encode(service_id_base32, sizeof(service_id_base32),
+          service_id, REND_SERVICE_ID_LEN);
+    control_event_hs_descriptor_created(service_id_base32, desc_id_base32);
   }
 
   log_info(LD_REND, "Successfully encoded a v2 descriptor and "

+ 16 - 11
src/or/rendservice.c

@@ -3215,8 +3215,6 @@ upload_service_descriptor(rend_service_t *service)
 
   rendpostperiod = get_options()->RendPostPeriod;
 
-  /* Upload descriptor? */
-  if (get_options()->PublishHidServDescriptors) {
   networkstatus_t *c = networkstatus_get_latest_consensus();
   if (c && smartlist_len(c->routerstatus_list) > 0) {
     int seconds_valid, i, j, num_descs;
@@ -3258,12 +3256,14 @@ upload_service_descriptor(rend_service_t *service)
         smartlist_free(client_cookies);
         return;
       }
-      /* Post the current descriptors to the hidden service directories. */
       rend_get_service_id(service->desc->pk, serviceid);
-      log_info(LD_REND, "Launching upload for hidden service %s",
-                   serviceid);
-      directory_post_to_hs_dir(service->desc, descs, NULL, serviceid,
-                               seconds_valid);
+      if (get_options()->PublishHidServDescriptors) {
+        /* Post the current descriptors to the hidden service directories. */
+        log_info(LD_REND, "Launching upload for hidden service %s",
+                     serviceid);
+        directory_post_to_hs_dir(service->desc, descs, NULL, serviceid,
+                                 seconds_valid);
+      }
       /* Free memory for descriptors. */
       for (i = 0; i < smartlist_len(descs); i++)
         rend_encoded_v2_service_descriptor_free(smartlist_get(descs, i));
@@ -3291,8 +3291,10 @@ upload_service_descriptor(rend_service_t *service)
           smartlist_free(client_cookies);
           return;
         }
-        directory_post_to_hs_dir(service->desc, descs, NULL, serviceid,
-                                 seconds_valid);
+        if (get_options()->PublishHidServDescriptors) {
+          directory_post_to_hs_dir(service->desc, descs, NULL, serviceid,
+                                   seconds_valid);
+        }
         /* Free memory for descriptors. */
         for (i = 0; i < smartlist_len(descs); i++)
           rend_encoded_v2_service_descriptor_free(smartlist_get(descs, i));
@@ -3302,8 +3304,11 @@ upload_service_descriptor(rend_service_t *service)
     smartlist_free(descs);
     smartlist_free(client_cookies);
     uploaded = 1;
-    log_info(LD_REND, "Successfully uploaded v2 rend descriptors!");
-  }
+    if (get_options()->PublishHidServDescriptors) {
+      log_info(LD_REND, "Successfully uploaded v2 rend descriptors!");
+    } else {
+      log_info(LD_REND, "Successfully stored created v2 rend descriptors!");
+    }
   }
 
   /* If not uploaded, try again in one minute. */

+ 4 - 0
src/test/test.c

@@ -47,6 +47,7 @@ double fabs(double x);
 #include "connection_edge.h"
 #include "geoip.h"
 #include "rendcommon.h"
+#include "rendcache.h"
 #include "test.h"
 #include "torgzip.h"
 #include "memarea.h"
@@ -494,6 +495,9 @@ test_rend_fns(void *arg)
   tt_str_op(address6,OP_EQ, "abcdefghijklmnop");
   tt_assert(BAD_HOSTNAME == parse_extended_hostname(address7));
 
+  /* Initialize the service cache. */
+  rend_cache_init();
+
   pk1 = pk_generate(0);
   pk2 = pk_generate(1);
   generated = tor_malloc_zero(sizeof(rend_service_descriptor_t));