浏览代码

r8800@totoro: nickm | 2006-09-29 23:10:49 -0400
Resolve bug 336: When displaying circuit paths with non-named routers, use their digests, not their nicknames.


svn:r8548

Nick Mathewson 19 年之前
父节点
当前提交
723ff1c93d
共有 3 个文件被更改,包括 18 次插入5 次删除
  1. 2 0
      ChangeLog
  2. 2 1
      doc/TODO
  3. 14 4
      src/or/circuitbuild.c

+ 2 - 0
ChangeLog

@@ -45,6 +45,8 @@ Changes in version 0.1.2.2-alpha - 2006-??-??
     - Only include function names in log messages for debugging messages;
       in other cases, the content of the message should be clear on its own,
       and including the function name only seems to confuse users.
+    - Fix CIRC controller events so that controllers can learn the identity
+      digests of non-Named servers used in circuit paths. (Fixes bug 336.)
 
   o Security Fixes, minor:
     - If a client asked for a server by name, and we didn't have a

+ 2 - 1
doc/TODO

@@ -45,7 +45,8 @@ N - Bug 303: block exit from circuits created with create-fast
     - Specify and document
     - Implement
     - Note that we'd like a better speed-bump too.
-N - Bug 336: figure out the right thing to do when telling nicknames to
+  o Bug 336: CIRC events should have digests when appropriate.
+N - figure out the right thing to do when telling nicknames to
     controllers.  We should always give digest, and possibly sometimes give
     nickname? Or digest, and nickname, with indication of whether name is
     canonical?

+ 14 - 4
src/or/circuitbuild.c

@@ -116,20 +116,29 @@ circuit_list_path(origin_circuit_t *circ, int verbose)
                  circ->build_state->desired_path_len,
                  circ->_base.state == CIRCUIT_STATE_OPEN ? "" : ", exit ",
                  circ->_base.state == CIRCUIT_STATE_OPEN ? "" :
-                   (nickname?nickname:"*unnamed*"));
+                 (nickname?nickname:"*unnamed*"));
     smartlist_add(elements, tor_strdup(buf));
   }
 
   hop = circ->cpath;
   do {
-    const char *elt;
+    routerinfo_t *ri;
+    char *elt;
     if (!hop)
       break;
     if (!verbose && hop->state != CPATH_STATE_OPEN)
       break;
     if (!hop->extend_info)
       break;
-    elt = hop->extend_info->nickname;
+    if ((ri = router_get_by_digest(hop->extend_info->identity_digest)) &&
+        ri->is_named) {
+      elt = tor_strdup(hop->extend_info->nickname);
+    } else {
+      elt = tor_malloc(HEX_DIGEST_LEN+2);
+      elt[0] = '$';
+      base16_encode(elt+1, HEX_DIGEST_LEN+1,
+                    hop->extend_info->identity_digest, DIGEST_LEN);
+    }
     tor_assert(elt);
     if (verbose) {
       size_t len = strlen(elt)+2+strlen(states[hop->state])+1;
@@ -137,8 +146,9 @@ circuit_list_path(origin_circuit_t *circ, int verbose)
       tor_assert(hop->state <= 2);
       tor_snprintf(v,len,"%s(%s)",elt,states[hop->state]);
       smartlist_add(elements, v);
+      tor_free(elt);
     } else {
-      smartlist_add(elements, tor_strdup(elt));
+      smartlist_add(elements, elt);
     }
     hop = hop->next;
   } while (hop != circ->cpath);