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

[or-cvs] r8529: Reserve the nickname "Unnamed" for routers that can't pick a (in tor/trunk: . doc src/or)



Author: nickm
Date: 2006-09-29 00:51:28 -0400 (Fri, 29 Sep 2006)
New Revision: 8529

Modified:
   tor/trunk/
   tor/trunk/ChangeLog
   tor/trunk/doc/TODO
   tor/trunk/doc/dir-spec.txt
   tor/trunk/src/or/config.c
   tor/trunk/src/or/dirserv.c
   tor/trunk/src/or/or.h
   tor/trunk/src/or/routerlist.c
   tor/trunk/src/or/routerparse.c
Log:
 r8776@totoro:  nickm | 2006-09-29 00:50:46 -0400
 Reserve the nickname "Unnamed" for routers that can't pick a hostname; any
 router can call itself Unnamed; directory servers will never allocate Unnamed
 to any particular router; clients won't believe that any router is the
 canonical Unnamed.
 



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

Modified: tor/trunk/ChangeLog
===================================================================
--- tor/trunk/ChangeLog	2006-09-29 04:51:23 UTC (rev 8528)
+++ tor/trunk/ChangeLog	2006-09-29 04:51:28 UTC (rev 8529)
@@ -36,6 +36,10 @@
       the v1 directory protocol, the v2 directory protocol, and as hidden
       service directories.  This should make it easier to migrate trust away
       from one of the two authorities currently running on Moria.
+    - Reserve the nickname "Unnamed" for routers that can't pick a hostname;
+      any router can call itself Unnamed; directory servers will never
+      allocate Unnamed to any particular router; clients won't believe that
+      any router is the canonical Unnamed.
 
   o Security Fixes, minor:
     - If a client asked for a server by name, and we didn't have a

Modified: tor/trunk/doc/TODO
===================================================================
--- tor/trunk/doc/TODO	2006-09-29 04:51:23 UTC (rev 8528)
+++ tor/trunk/doc/TODO	2006-09-29 04:51:28 UTC (rev 8529)
@@ -79,8 +79,8 @@
 
   - Servers are easy to setup and run: being a relay is about as easy as
     being a client.
-    - Reduce resource load
-N     - Come up with good 'nicknames' automatically, or make no-nickname
+    . Reduce resource load
+      o Come up with good 'nicknames' automatically, or make no-nickname
         routers workable. [Make a magic nickname "Unnamed" that can't be
         registered and can't be looked up by nickname.]
 d     - Tolerate clock skew on bridge relays.

Modified: tor/trunk/doc/dir-spec.txt
===================================================================
--- tor/trunk/doc/dir-spec.txt	2006-09-29 04:51:23 UTC (rev 8528)
+++ tor/trunk/doc/dir-spec.txt	2006-09-29 04:51:28 UTC (rev 8529)
@@ -759,6 +759,12 @@
 
    (XXXX The last-bound thing above isn't implemented)
 
+   Not every router needs a nickname.  When a router doesn't configure a
+   nickname, it publishes with the default nickname "Unnamed".  Authorities
+   SHOULD NOT ever mark a router with this nickname as Named; client software
+   SHOULD NOT ever use a router in response to a user request for a router
+   called "Unnamed".
+
 6.2. Software versions
 
    An implementation of Tor SHOULD warn when it has fetched (or has

Modified: tor/trunk/src/or/config.c
===================================================================
--- tor/trunk/src/or/config.c	2006-09-29 04:51:23 UTC (rev 8528)
+++ tor/trunk/src/or/config.c	2006-09-29 04:51:28 UTC (rev 8529)
@@ -1731,20 +1731,21 @@
 static char *
 get_default_nickname(void)
 {
+  static const char * const bad_default_nicknames[] = {
+    "localhost",
+    NULL,
+  };
   char localhostname[256];
   char *cp, *out, *outp;
+  int i;
 
   if (gethostname(localhostname, sizeof(localhostname)) < 0)
     return NULL;
 
   /* Put it in lowercase; stop at the first dot. */
-  for (cp = localhostname; *cp; ++cp) {
-    if (*cp == '.') {
-      *cp = '\0';
-      break;
-    }
-    *cp = TOR_TOLOWER(*cp);
-  }
+  if ((cp = strchr(localhostname, '.')))
+    *cp = '\0';
+  tor_strlower(localhostname);
 
   /* Strip invalid characters. */
   cp = localhostname;
@@ -1761,6 +1762,14 @@
   if (strlen(out) > MAX_NICKNAME_LEN)
     out[MAX_NICKNAME_LEN]='\0';
 
+  /* Check for dumb names. */
+  for (i = 0; bad_default_nicknames[i]; ++i) {
+    if (!strcmp(out, bad_default_nicknames[i])) {
+      tor_free(out);
+      return NULL;
+    }
+  }
+
   return out;
 }
 
@@ -2122,10 +2131,14 @@
 
   if (options->Nickname == NULL) {
     if (server_mode(options)) {
-      if (!(options->Nickname = get_default_nickname()))
-        REJECT("Error obtaining local hostname");
-      log_notice(LD_CONFIG, "Choosing default nickname '%s'",
-                 options->Nickname);
+      if (!(options->Nickname = get_default_nickname())) {
+        log_notice(LD_CONFIG, "Couldn't pick a nickname hostname based on "
+                   "our hostname; using %s instead.", UNNAMED_ROUTER_NICKNAME);
+        options->Nickname = tor_strdup(UNNAMED_ROUTER_NICKNAME);
+      } else {
+        log_notice(LD_CONFIG, "Choosing default nickname '%s'",
+                   options->Nickname);
+      }
     }
   } else {
     if (!is_legal_nickname(options->Nickname)) {

Modified: tor/trunk/src/or/dirserv.c
===================================================================
--- tor/trunk/src/or/dirserv.c	2006-09-29 04:51:23 UTC (rev 8528)
+++ tor/trunk/src/or/dirserv.c	2006-09-29 04:51:28 UTC (rev 8529)
@@ -89,6 +89,12 @@
   fingerprint = tor_strdup(fp);
   tor_strstrip(fingerprint, " ");
 
+  if (!strcasecmp(nickname, UNNAMED_ROUTER_NICKNAME)) {
+    log_warn(LD_DIRSERV, "Tried to add a mapping for reserved nickname %s",
+             UNNAMED_ROUTER_NICKNAME);
+    return 0;
+  }
+
   if (nickname[0] != '!') {
     for (i = 0; i < smartlist_len(list); ++i) {
       ent = smartlist_get(list, i);
@@ -317,7 +323,10 @@
   if (0==strcasecmp(nn_ent->fingerprint, fp)) {
     if (should_log)
       log_debug(LD_DIRSERV,"Good fingerprint for '%s'",nickname);
-    return FP_NAMED; /* Right fingerprint. */
+    if (!strcasecmp(nickname, UNNAMED_ROUTER_NICKNAME))
+      return FP_VALID;
+    else
+      return FP_NAMED; /* Right fingerprint. */
   } else {
     if (should_log) {
       char *esc_contact = esc_for_log(contact);
@@ -1448,6 +1457,9 @@
       char identity64[BASE64_DIGEST_LEN+1];
       char digest64[BASE64_DIGEST_LEN+1];
 
+      if (!strcasecmp(ri->nickname, UNNAMED_ROUTER_NICKNAME))
+        f_named = 0;
+
       format_iso_time(published, ri->cache_info.published_on);
 
       digest_to_base64(identity64, ri->cache_info.identity_digest);

Modified: tor/trunk/src/or/or.h
===================================================================
--- tor/trunk/src/or/or.h	2006-09-29 04:51:23 UTC (rev 8528)
+++ tor/trunk/src/or/or.h	2006-09-29 04:51:28 UTC (rev 8529)
@@ -2112,6 +2112,8 @@
 
 /********************************* dirserv.c ***************************/
 
+#define UNNAMED_ROUTER_NICKNAME "Unnamed"
+
 int connection_dirserv_flushed_some(dir_connection_t *conn);
 int dirserv_add_own_fingerprint(const char *nickname, crypto_pk_env_t *pk);
 int dirserv_load_fingerprint_file(void);

Modified: tor/trunk/src/or/routerlist.c
===================================================================
--- tor/trunk/src/or/routerlist.c	2006-09-29 04:51:23 UTC (rev 8528)
+++ tor/trunk/src/or/routerlist.c	2006-09-29 04:51:28 UTC (rev 8529)
@@ -1047,6 +1047,8 @@
     return NULL;
   if (nickname[0] == '$')
     return router_get_by_hexdigest(nickname);
+  if (!strcasecmp(nickname, UNNAMED_ROUTER_NICKNAME))
+    return NULL;
   if (server_mode(get_options()) &&
       !strcasecmp(nickname, get_options()->Nickname))
     return router_get_my_routerinfo();

Modified: tor/trunk/src/or/routerparse.c
===================================================================
--- tor/trunk/src/or/routerparse.c	2006-09-29 04:51:23 UTC (rev 8528)
+++ tor/trunk/src/or/routerparse.c	2006-09-29 04:51:28 UTC (rev 8529)
@@ -1064,6 +1064,9 @@
     }
   }
 
+  if (!strcasecmp(rs->nickname, UNNAMED_ROUTER_NICKNAME))
+    rs->is_named = 0;
+
   goto done;
  err:
   if (rs)