]> git.ipfire.org Git - thirdparty/tor.git/commitdiff
checking only 0.0.7 and 0.0.8 didn't work, because some dirservers
authorRoger Dingledine <arma@torproject.org>
Mon, 27 Sep 2004 06:00:43 +0000 (06:00 +0000)
committerRoger Dingledine <arma@torproject.org>
Mon, 27 Sep 2004 06:00:43 +0000 (06:00 +0000)
files have really old descriptors for the authdirservers, so we're
asking them in the new format because they're too old.

now we actually compare the version to a cutoff version, and act
appropriately.

also take this chance to use only >=0.0.8 servers for dns resolves,
because of the recent bugs. we'll bump to >=0.0.9pre1 once there are
some servers running that.

svn:r2380

src/or/circuituse.c
src/or/connection_edge.c
src/or/connection_or.c
src/or/directory.c
src/or/or.h
src/or/router.c
src/or/routerparse.c
src/or/test.c

index 549993a7c1bf649b70a3442625472393cf87d159..19b9213eef23164cdd053bbcd6022fb186d7c327 100644 (file)
@@ -76,10 +76,10 @@ static int circuit_is_acceptable(circuit_t *circ,
 
     if (conn->socks_request &&
         conn->socks_request->command == SOCKS_COMMAND_RESOLVE) {
-      /* 0.0.7 servers and earlier don't support DNS resolution.  There are no
-       * ORs running code before 0.0.7, so we only worry about 0.0.7.  Once all
-       * servers are running 0.0.8, remove this check. */
-      if (!strcmpstart(exitrouter->platform, "Tor 0.0.7"))
+      /* 0.0.7 servers and earlier don't support DNS resolution.  0.0.8 servers
+       * have buggy resolve support. Once there are more 0.0.9 servers, change
+       * this to 0.0.9pre1. XXX */
+      if (!tor_version_as_new_as(exitrouter->platform, "0.0.8"))
         return 0;
     } else if(purpose == CIRCUIT_PURPOSE_C_GENERAL) {
       if(!connection_ap_can_use_exit(conn, exitrouter)) {
index 1b2279c93dd20c1e16d28c7287ea7390145d2930..7aee5fa63383e3abf11fa164e1f813648091433f 100644 (file)
@@ -954,10 +954,10 @@ int connection_ap_can_use_exit(connection_t *conn, routerinfo_t *exit)
          exit->nickname, conn->socks_request->address,
          conn->socks_request->port);
   if (conn->socks_request->command == SOCKS_COMMAND_RESOLVE) {
-    /* 0.0.7 servers and earlier don't support DNS resolution.  There are no
-     * ORs running code before 0.0.7, so we only worry about 0.0.7.  Once all
-     * servers are running 0.0.8, remove this check. XXX */
-    return strcmpstart(exit->platform, "Tor 0.0.7") ? 1 : 0;
+    /* 0.0.7 servers and earlier don't support DNS resolution.  0.0.8 servers
+     * have buggy resolve support. Once there are more 0.0.9 servers, change
+     * this to 0.0.9pre1. XXX */
+    return tor_version_as_new_as(exit->platform, "0.0.8");
   }
   addr = client_dns_lookup_entry(conn->socks_request->address);
   if(router_compare_addr_to_exit_policy(addr,
index 5272b4a6c6df997d7f7d894dfe2c1f5f26ec5ec6..3f7da9654383809e2784c6ab6ae2b389489a6b08 100644 (file)
@@ -218,7 +218,7 @@ int connection_tls_start_handshake(connection_t *conn, int receiving) {
     him = router_get_by_digest(conn->identity_digest);
     me = router_get_my_routerinfo();
 
-    if(him && !strcmpstart(him->platform, "Tor 0.0.7") &&
+    if(him && !tor_version_as_new_as(him->platform, "0.0.8pre1") &&
        (!me || !me->is_verified)) {
       log_fn(LOG_INFO,"He's running 0.0.7, and I'm unverified. Acting like OP.");
       use_no_cert = 1;
index 278b042df3a834dfb59d8be7e3a521b0d5707b75..d7b47c73e288c28cb9f94c86f871931c499e4b43 100644 (file)
@@ -214,20 +214,22 @@ static void directory_send_command(connection_t *conn, int purpose,
   char fetchrunninglist[] = "GET /tor/running-routers HTTP/1.0\r\n\r\n";
   char tmp[8192];
   routerinfo_t *router;
+  int use_newer = 0;
 
   tor_assert(conn && conn->type == CONN_TYPE_DIR);
 
   router = router_get_by_digest(conn->identity_digest);
   tor_assert(router); /* the func that calls us found it, so we should too */
 
+  use_newer = tor_version_as_new_as(router->platform, "0.0.9pre1");
+
   switch(purpose) {
     case DIR_PURPOSE_FETCH_DIR:
       tor_assert(payload == NULL);
-      if (!strcmpstart(router->platform, "Tor 0.0.7") ||
-          !strcmpstart(router->platform, "Tor 0.0.8"))
-        connection_write_to_buf(fetchwholedir, strlen(fetchwholedir), conn);
-      else
+      if(use_newer)
         connection_write_to_buf(fetchwholedir_z, strlen(fetchwholedir_z), conn);
+      else
+        connection_write_to_buf(fetchwholedir, strlen(fetchwholedir), conn);
       break;
     case DIR_PURPOSE_FETCH_RUNNING_LIST:
       tor_assert(payload == NULL);
@@ -236,7 +238,7 @@ static void directory_send_command(connection_t *conn, int purpose,
     case DIR_PURPOSE_UPLOAD_DIR:
       tor_assert(payload);
       snprintf(tmp, sizeof(tmp), "POST %s/ HTTP/1.0\r\nContent-Length: %d\r\n\r\n",
-               strcmpstart(router->platform, "Tor 0.0.8") ? "/tor" : "",
+               use_newer ? "/tor" : "",
                payload_len);
       connection_write_to_buf(tmp, strlen(tmp), conn);
       connection_write_to_buf(payload, payload_len, conn);
index 04f02aba2edae40a156573699b55012c36d43bfc..c1d00d3f0ea1965570ddcbf7e4cc7553c1ef78e8 100644 (file)
@@ -1461,8 +1461,8 @@ struct exit_policy_t *router_parse_exit_policy_from_string(const char *s);
 int check_software_version_against_directory(const char *directory,
                                              int ignoreversion);
 int tor_version_parse(const char *s, tor_version_t *out);
+int tor_version_as_new_as(const char *platform, const char *cutoff);
 int tor_version_compare(tor_version_t *a, tor_version_t *b);
-int tor_version_compare_to_mine(const char *s);
 
 #endif
 
index ce564ff97ddf3cba8f063ae5d94543597e0c9069..38e741e30b68c6b138867a42e12adbff91f91b96 100644 (file)
@@ -397,7 +397,7 @@ void router_retry_connections(void) {
 int router_is_clique_mode(routerinfo_t *router) {
   if(router->is_trusted_dir)
     return 1;
-  if(!strcmpstart(router->platform, "Tor 0.0.7"))
+  if(!tor_version_as_new_as(router->platform, "0.0.8pre1"))
     return 1;
   return 0;
 }
index fdc34f205f90055a7072dc15e66860eb835a8f71..2b2c6dfce0bb33a3bc33e6dfd48171274b4fa233 100644 (file)
@@ -1335,6 +1335,37 @@ static int router_get_hash_impl(const char *s, char *digest,
   return 0;
 }
 
+/** Parse the Tor version of the platform string <b>platform</b>,
+ * and compare it to the version in <b>cutoff</b>. Return 1 if
+ * the router is at least as new as the cutoff, else return 0.
+ */
+int tor_version_as_new_as(const char *platform, const char *cutoff) {
+  tor_version_t cutoff_version, router_version;
+  char *s, *start;
+  char tmp[128];
+
+  if(tor_version_parse(cutoff, &cutoff_version)<0) {
+    log_fn(LOG_WARN,"Bug: cutoff version '%s' unparsable.",cutoff);
+    return 0;
+  }
+  if(strcmpstart(platform,"Tor ")) /* nonstandard Tor; be safe and say yes */
+    return 1;
+
+  start = (char *)eat_whitespace(platform+3);
+  if (!*start) return 0;
+  s = (char *)find_whitespace(start); /* also finds '\0', which is fine */
+  if(s-start+1 >= sizeof(tmp)) /* too big, no */
+    return 0;
+  strlcpy(tmp, start, s-start+1);
+
+  if(tor_version_parse(tmp, &router_version)<0) {
+    log_fn(LOG_INFO,"Router version '%s' unparsable.",tmp);
+    return 1; /* be safe and say yes */
+  }
+
+  return tor_version_compare(&router_version, &cutoff_version) >= 0;
+}
+
 int tor_version_parse(const char *s, tor_version_t *out)
 {
   char *eos=NULL, *cp=NULL;
index 3546cbc2aa6bba964df505e75967a8bf47cc61d4..0ee815227fd1b3a604cccd32f76e6da682d422af 100644 (file)
@@ -1022,6 +1022,14 @@ test_dir_format()
   test_eq(0, is_obsolete_version("0.0.7rc2", "0.0.7,Tor 0.0.7rc2,Tor 0.0.8"));
   test_eq(0, is_obsolete_version("0.0.5", "0.0.5-cvs"));
   test_eq(0, is_obsolete_version("0.0.5.1-cvs", "0.0.5"));
+
+  test_eq(0, tor_version_as_new_as("Tor 0.0.5", "0.0.9pre1-cvs"));
+  test_eq(0, tor_version_as_new_as("Tor 0.0.5", "0.0.9pre1-cvs"));
+  test_eq(1, tor_version_as_new_as(
+          "Tor 0.0.8 on Darwin 64-121-192-100.c3-0.sfpo-ubr1.sfrn-sfpo.ca.cable.rcn.com Power Macintosh", "0.0.8rc2"));
+  test_eq(0, tor_version_as_new_as(
+          "Tor 0.0.8 on Darwin 64-121-192-100.c3-0.sfpo-ubr1.sfrn-sfpo.ca.cable.rcn.com Power Macintosh", "0.0.8.2"));
+
 }
 
 void test_rend_fns()