[Author Prev][Author Next][Thread Prev][Thread Next][Author Index][Thread Index]

[or-cvs] r8593: Make verbose names get used (when appropriate and selected) (in tor/trunk: . doc src/or)



Author: nickm
Date: 2006-10-03 15:00:18 -0400 (Tue, 03 Oct 2006)
New Revision: 8593

Modified:
   tor/trunk/
   tor/trunk/doc/TODO
   tor/trunk/src/or/circuitbuild.c
   tor/trunk/src/or/control.c
   tor/trunk/src/or/or.h
Log:
 r8862@totoro:  nickm | 2006-10-03 14:54:14 -0400
 Make verbose names get used (when appropriate and selected) in responses to getinfo requests.



Property changes on: tor/trunk
___________________________________________________________________
 svk:merge ticket from /tor/branches/verbose-nicknames [r8862] on 96637b51-b116-0410-a10e-9941ebb49b64

Modified: tor/trunk/doc/TODO
===================================================================
--- tor/trunk/doc/TODO	2006-10-03 19:00:12 UTC (rev 8592)
+++ tor/trunk/doc/TODO	2006-10-03 19:00:18 UTC (rev 8593)
@@ -44,7 +44,7 @@
     o Implement
     o Note that we'd like a better speed-bump too.
   o Bug 336: CIRC events should have digests when appropriate.
-N . Improve behavior when telling nicknames and digests to controllers.
+  o Improve behavior when telling nicknames and digests to controllers.
     We should give digest, and nickname, with indication of whether name is
     canonical.
     o edmanm likes $DIGEST~nickname for unNamed routers, and
@@ -56,9 +56,9 @@
     o Add ability to selectively send 'long' nicknames on v1 connections.
     o Add a feature to actually turn on the switch.
     o Implement response for ORCONN.
-    - As used in responses to getinfo requests?
-    . Verify that everything actually does the right thing.
-    - Specify everything.
+    o As used in responses to getinfo requests?
+    o Verify that everything actually does the right thing.
+    o Specify everything.
 
 N - Bug 326: make eventdns thrash less.
 N - Test guard unreachable logic; make sure that we actually attempt to

Modified: tor/trunk/src/or/circuitbuild.c
===================================================================
--- tor/trunk/src/or/circuitbuild.c	2006-10-03 19:00:12 UTC (rev 8592)
+++ tor/trunk/src/or/circuitbuild.c	2006-10-03 19:00:18 UTC (rev 8593)
@@ -2445,18 +2445,18 @@
  * For backward compatibility, we also handle the string "helper-nodes".
  * */
 int
-entry_guards_getinfo(const char *question, char **answer)
+entry_guards_getinfo(int use_long_names, const char *question, char **answer)
 {
   if (!strcmp(question,"entry-guards") ||
       !strcmp(question,"helper-nodes")) {
     smartlist_t *sl = smartlist_create();
     char tbuf[ISO_TIME_LEN+1];
-    char dbuf[HEX_DIGEST_LEN+1];
+    char nbuf[MAX_VERBOSE_NICKNAME_LEN+1];
     if (!entry_guards)
       entry_guards = smartlist_create();
     SMARTLIST_FOREACH(entry_guards, entry_guard_t *, e,
       {
-        size_t len = HEX_DIGEST_LEN+ISO_TIME_LEN+32;
+        size_t len = MAX_VERBOSE_NICKNAME_LEN+ISO_TIME_LEN+32;
         char *c = tor_malloc(len);
         const char *status = NULL;
         time_t when = 0;
@@ -2468,12 +2468,24 @@
         } else {
           status = "up";
         }
-        base16_encode(dbuf, sizeof(dbuf), e->identity, DIGEST_LEN);
+        if (use_long_names) {
+          routerinfo_t *ri = router_get_by_digest(e->identity);
+          if (ri) {
+            router_get_verbose_nickname(nbuf, ri);
+          } else {
+            nbuf[0] = '$';
+            base16_encode(nbuf+1, sizeof(nbuf)-1, e->identity, DIGEST_LEN);
+            /* e->nickname field is not very reliable if we don't know about
+             * this router any longer; don't include it. */
+          }
+        } else {
+          base16_encode(nbuf, sizeof(nbuf), e->identity, DIGEST_LEN);
+        }
         if (when) {
           format_iso_time(tbuf, when);
-          tor_snprintf(c, len, "$%s %s %s\n", dbuf, status, tbuf);
+          tor_snprintf(c, len, "$%s %s %s\n", nbuf, status, tbuf);
         } else {
-          tor_snprintf(c, len, "$%s %s\n", dbuf, status);
+          tor_snprintf(c, len, "$%s %s\n", nbuf, status);
         }
         smartlist_add(sl, c);
       });

Modified: tor/trunk/src/or/control.c
===================================================================
--- tor/trunk/src/or/control.c	2006-10-03 19:00:12 UTC (rev 8592)
+++ tor/trunk/src/or/control.c	2006-10-03 19:00:18 UTC (rev 8593)
@@ -211,6 +211,8 @@
                                      const char *body);
 static int write_stream_target_to_buf(edge_connection_t *conn, char *buf,
                                       size_t len);
+static void orconn_target_get_name(int long_names, char *buf, size_t len,
+                                   or_connection_t *conn);
 
 /** Given a possibly invalid message type code <b>cmd</b>, return a
  * human-readable string equivalent. */
@@ -1379,7 +1381,8 @@
  * Return 0 if success or unrecognized, or -1 if recognized but
  * internal error. */
 static int
-handle_getinfo_helper(const char *question, char **answer)
+handle_getinfo_helper(control_connection_t *control_conn,
+                      const char *question, char **answer)
 {
   *answer = NULL; /* unrecognized key by default */
   if (!strcmp(question, "version")) {
@@ -1389,9 +1392,11 @@
   } else if (!strcmpstart(question, "accounting/")) {
     return accounting_getinfo_helper(question, answer);
   } else if (!strcmpstart(question, "helper-nodes")) { /* deprecated */
-    return entry_guards_getinfo(question, answer);
+    return entry_guards_getinfo(control_conn->use_long_names,
+                                question, answer);
   } else if (!strcmpstart(question, "entry-guards")) {
-    return entry_guards_getinfo(question, answer);
+    return entry_guards_getinfo(control_conn->use_long_names,
+                                question, answer);
   } else if (!strcmpstart(question, "config/")) {
     return config_getinfo_helper(question, answer);
   } else if (!strcmp(question, "info/names")) {
@@ -1443,7 +1448,10 @@
       const char *state;
       if (! CIRCUIT_IS_ORIGIN(circ) || circ->marked_for_close)
         continue;
-      path = circuit_list_path(TO_ORIGIN_CIRCUIT(circ),0);
+      if (control_conn->use_long_names)
+        path = circuit_list_path_for_controller(TO_ORIGIN_CIRCUIT(circ));
+      else
+        path = circuit_list_path(TO_ORIGIN_CIRCUIT(circ),0);
       if (circ->state == CIRCUIT_STATE_OPEN)
         state = "BUILT";
       else if (strlen(path))
@@ -1540,12 +1548,8 @@
         state = "LAUNCHED";
       else
         state = "NEW";
-      if (conn->nickname)
-        strlcpy(name, conn->nickname, sizeof(name));
-      else
-        tor_snprintf(name, sizeof(name), "%s:%d",
-                     conn->_base.address, conn->_base.port);
-
+      orconn_target_get_name(control_conn->use_long_names, name, sizeof(name),
+                             conn);
       slen = strlen(name)+strlen(state)+2;
       s = tor_malloc(slen+1);
       tor_snprintf(s, slen, "%s %s", name, state);
@@ -1651,7 +1655,7 @@
   unrecognized = smartlist_create();
   SMARTLIST_FOREACH(questions, const char *, q,
   {
-    if (handle_getinfo_helper(q, &ans) < 0) {
+    if (handle_getinfo_helper(conn, q, &ans) < 0) {
       if (v0)
         send_control0_error(conn, ERR_INTERNAL, body);
       else
@@ -2313,10 +2317,11 @@
                           uint32_t len,
                           const char *body)
 {
-  tor_assert(! STATE_IS_V0(conn->_base.state));
   smartlist_t *args;
   int verbose_names = 0, extended_events = 0;
   int bad = 0;
+  (void) len; /* body is nul-terminated; it's safe to ignore the length */
+  tor_assert(! STATE_IS_V0(conn->_base.state));
   args = smartlist_create();
   smartlist_split_string(args, body, " ",
                          SPLIT_SKIP_SPACE|SPLIT_IGNORE_BLANK, 0);
@@ -2862,6 +2867,32 @@
   return 0;
 }
 
+static void
+orconn_target_get_name(int long_names,
+                       char *name, size_t len, or_connection_t *conn)
+{
+  if (long_names) {
+    if (conn->nickname)
+      strlcpy(name, conn->nickname, len);
+    else
+      tor_snprintf(name, len, "%s:%d",
+                   conn->_base.address, conn->_base.port);
+  } else {
+    routerinfo_t *ri = router_get_by_digest(conn->identity_digest);
+    if (ri) {
+      tor_assert(len > MAX_VERBOSE_NICKNAME_LEN);
+      router_get_verbose_nickname(name, ri);
+    } else if (! tor_digest_is_zero(conn->identity_digest)) {
+      name[0] = '$';
+      base16_encode(name+1, len-1, conn->identity_digest,
+                    DIGEST_LEN);
+    } else {
+      tor_snprintf(name, len, "%s:%d",
+                   conn->_base.address, conn->_base.port);
+    }
+  }
+}
+
 /** Something has happened to the OR connection <b>conn</b>: tell any
  * interested control connections. */
 int
@@ -2894,27 +2925,13 @@
         return 0;
       }
     if (EVENT_IS_INTERESTING1S(EVENT_OR_CONN_STATUS)) {
-      if (conn->nickname)
-        strlcpy(name, conn->nickname, sizeof(name));
-      else
-        tor_snprintf(name, sizeof(name), "%s:%d",
-                     conn->_base.address, conn->_base.port);
+      orconn_target_get_name(0, name, sizeof(name), conn);
       send_control1_event(EVENT_OR_CONN_STATUS, SHORT_NAMES,
                           "650 ORCONN %s %s\r\n",
                           name, status);
     }
     if (EVENT_IS_INTERESTING1L(EVENT_OR_CONN_STATUS)) {
-      routerinfo_t *ri = router_get_by_digest(conn->identity_digest);
-      if (ri) {
-        router_get_verbose_nickname(name, ri);
-      } else if (! tor_digest_is_zero(conn->identity_digest)) {
-        name[0] = '$';
-        base16_encode(name+1, sizeof(name)-1, conn->identity_digest,
-                      DIGEST_LEN);
-      } else {
-        tor_snprintf(name, sizeof(name), "%s:%d",
-                     conn->_base.address, conn->_base.port);
-      }
+      orconn_target_get_name(1, name, sizeof(name), conn);
       send_control1_event(EVENT_OR_CONN_STATUS, LONG_NAMES,
                           "650 ORCONN %s %s\r\n",
                           name, status);
@@ -3054,14 +3071,15 @@
     tor_free(msg);
   }
   if (EVENT_IS_INTERESTING1L(EVENT_NEW_DESC)) {
-    smartlist_t *names;
-    names = smartlist_create();
+    smartlist_t *names = smartlist_create();
+    char *ids;
+    size_t len;
     SMARTLIST_FOREACH(routers, routerinfo_t *, ri, {
         char *b = tor_malloc(MAX_VERBOSE_NICKNAME_LEN+1);
         smartlist_add(names, b);
       });
-    char *ids = smartlist_join_strings(names, " ", 0, &len);
-    size_t len = strlen(ids)+32;
+    ids = smartlist_join_strings(names, " ", 0, &len);
+    len = strlen(ids)+32;
     msg = tor_malloc(len);
     tor_snprintf(msg, len, "650 NEWDESC %s\r\n", ids);
     send_control1_event_string(EVENT_NEW_DESC, LONG_NAMES, msg);

Modified: tor/trunk/src/or/or.h
===================================================================
--- tor/trunk/src/or/or.h	2006-10-03 19:00:12 UTC (rev 8592)
+++ tor/trunk/src/or/or.h	2006-10-03 19:00:18 UTC (rev 8593)
@@ -1728,7 +1728,8 @@
 void entry_guards_prepend_from_config(void);
 void entry_guards_update_state(or_state_t *state);
 int entry_guards_parse_state(or_state_t *state, int set, char **msg);
-int entry_guards_getinfo(const char *question, char **answer);
+int entry_guards_getinfo(int use_long_names,
+                         const char *question, char **answer);
 void entry_guards_free_all(void);
 
 /********************************* circuitlist.c ***********************/